Main GraphicsMagick source repository
Revisión | e84d14172c099c80e3efc7c7408866272b60d85a (tree) |
---|---|
Tiempo | 2022-01-22 07:06:25 |
Autor | Bob Friesenhahn <bfriesen@Grap...> |
Commiter | Bob Friesenhahn |
JP2: Adaptations to work with Jasper 3.0.0's jas_init_library() and other related functions.
@@ -1,3 +1,8 @@ | ||
1 | +2022-01-21 Bob Friesenhahn <bfriesen@simple.dallas.tx.us> | |
2 | + | |
3 | + * coders/jp2.c: Adaptations to work with Jasper 3.0.0's | |
4 | + jas_init_library() and other related functions. | |
5 | + | |
1 | 6 | 2022-01-16 Bob Friesenhahn <bfriesen@simple.dallas.tx.us> |
2 | 7 | |
3 | 8 | * coders/miff.c (ReadMIFFImage): Do not proceed to next image in |
@@ -10,5 +10,5 @@ | ||
10 | 10 | |
11 | 11 | #define public MagickPackageName "GraphicsMagick" |
12 | 12 | #define public MagickPackageVersion "1.4" |
13 | -#define public MagickPackageVersionAddendum ".020220116" | |
14 | -#define public MagickPackageReleaseDate "snapshot-20220116" | |
13 | +#define public MagickPackageVersionAddendum ".020220121" | |
14 | +#define public MagickPackageReleaseDate "snapshot-20220121" |
@@ -1,5 +1,5 @@ | ||
1 | 1 | /* |
2 | -% Copyright (C) 2003-2021 GraphicsMagick Group | |
2 | +% Copyright (C) 2003-2022 GraphicsMagick Group | |
3 | 3 | % Copyright (C) 2002 ImageMagick Studio |
4 | 4 | % |
5 | 5 | % This program is covered by multiple licenses, which are described in |
@@ -92,11 +92,21 @@ | ||
92 | 92 | # undef HAVE_PGX_DECODE |
93 | 93 | # endif |
94 | 94 | |
95 | +#if defined(HAVE_JAS_INIT_LIBRARY) | |
96 | +# define HAVE_JAS_STREAM_IO_V3 | |
97 | +#endif | |
98 | + | |
95 | 99 | #if 0 |
96 | -/* Development JasPer 3.0.0 jas_initialize() is not yet ready for our purposes */ | |
97 | -#if !(defined(MAGICK_ENABLE_JAS_INITIALIZE) && MAGICK_ENABLE_JAS_INITIALIZE) | |
98 | -#undef HAVE_JAS_INITIALIZE | |
99 | -#endif /* if !defined(ENABLE_JAS_INITIALIZE) */ | |
100 | +/* Development JasPer 3.0.0 jas_init_library() is not yet ready for our purposes */ | |
101 | +#if !(defined(MAGICK_ENABLE_JAS_INIT_LIBRARY) && MAGICK_ENABLE_JAS_INIT_LIBRARY) | |
102 | +#undef HAVE_JAS_INIT_LIBRARY | |
103 | +#endif /* if !(defined(MAGICK_ENABLE_JAS_INIT_LIBRARY) && MAGICK_ENABLE_JAS_INIT_LIBRARY) */ | |
104 | +#endif | |
105 | + | |
106 | +#if defined(HAVE_PTHREAD) || defined(MSWINDOWS) || defined(HAVE_OPENMP) | |
107 | +# define JP2_HAVE_THREADS 1 | |
108 | +#else | |
109 | +# define JP2_HAVE_THREADS 0 | |
100 | 110 | #endif |
101 | 111 | |
102 | 112 |
@@ -321,57 +331,66 @@ | ||
321 | 331 | int (*read_)(jas_stream_obj_t *obj, char *buf, unsigned cnt); |
322 | 332 | int (*write_)(jas_stream_obj_t *obj, const char *buf, unsigned cnt); |
323 | 333 | |
334 | + In Jasper 3.0.0 the interface changed again: | |
335 | + jas_ssize_t (*read_)(jas_stream_obj_t *obj, char *buf, size_t cnt); | |
336 | + jas_ssize_t (*write_)(jas_stream_obj_t *obj, const char *buf, size_t cnt); | |
337 | + | |
324 | 338 | We have yet to find a useful way to determine the version of the |
325 | 339 | JasPer library using the C pre-processor. |
326 | 340 | */ |
327 | -#if !defined(MAGICK_JP2_OLD_STREAM_INTERFACE) | |
328 | -# define MAGICK_JP2_OLD_STREAM_INTERFACE 0 | |
329 | -#endif /* if !defined(MAGICK_JP2_OLD_STREAM_INTERFACE) */ | |
330 | 341 | |
331 | -#if MAGICK_JP2_OLD_STREAM_INTERFACE | |
332 | -static int BlobRead(jas_stream_obj_t *object,char *buffer,const int length) | |
342 | +/* Read characters from a file object. */ | |
343 | +/* jas_ssize_t (*read_)(jas_stream_obj_t *obj, char *buf, size_t cnt); */ | |
344 | +#if defined(HAVE_JAS_STREAM_IO_V3) | |
345 | +static jas_ssize_t BlobRead(jas_stream_obj_t *obj, char *buf, size_t cnt) | |
333 | 346 | #else |
334 | -static int BlobRead(jas_stream_obj_t *object,char *buffer,unsigned length) | |
347 | +static int BlobRead(jas_stream_obj_t *obj, char *buf, unsigned cnt) | |
335 | 348 | #endif |
336 | 349 | { |
337 | 350 | size_t |
338 | 351 | count; |
339 | 352 | |
340 | 353 | StreamManager |
341 | - *source = (StreamManager *) object; | |
354 | + *source = (StreamManager *) obj; | |
342 | 355 | |
343 | - count=ReadBlob(source->image,(size_t) length,(void *) buffer); | |
344 | - return ((int) count); | |
356 | + count=ReadBlob(source->image,(size_t) cnt,(void *) buf); | |
357 | + return (count); | |
345 | 358 | } |
346 | 359 | |
347 | -#if MAGICK_JP2_OLD_STREAM_INTERFACE | |
348 | -static int BlobWrite(jas_stream_obj_t *object,char *buffer,const int length) | |
360 | +/* Write characters to a file object. */ | |
361 | +/* jas_ssize_t (*write_)(jas_stream_obj_t *obj, const char *buf, size_t cnt); */ | |
362 | +#if defined(HAVE_JAS_STREAM_IO_V3) | |
363 | +static jas_ssize_t BlobWrite(jas_stream_obj_t *obj, const char *buf, size_t cnt) | |
349 | 364 | #else |
350 | -static int BlobWrite(jas_stream_obj_t *object,const char *buffer,unsigned length) | |
365 | +static int BlobWrite(jas_stream_obj_t *obj, const char *buf, unsigned cnt) | |
351 | 366 | #endif |
352 | 367 | { |
353 | 368 | size_t |
354 | 369 | count; |
355 | 370 | |
356 | 371 | StreamManager |
357 | - *source = (StreamManager *) object; | |
372 | + *source = (StreamManager *) obj; | |
358 | 373 | |
359 | - count=WriteBlob(source->image,(size_t) length,(void *) buffer); | |
360 | - return((int) count); | |
374 | + count=WriteBlob(source->image,(size_t) cnt,(void *) buf); | |
375 | + return(count); | |
361 | 376 | } |
362 | 377 | |
363 | -static long BlobSeek(jas_stream_obj_t *object,long offset,int origin) | |
378 | +/* Set the position for a file object. */ | |
379 | +/* long (*seek_)(jas_stream_obj_t *obj, long offset, int origin); */ | |
380 | +static long BlobSeek(jas_stream_obj_t *obj,long offset,int origin) | |
364 | 381 | { |
365 | 382 | StreamManager |
366 | - *source = (StreamManager *) object; | |
383 | + *source = (StreamManager *) obj; | |
367 | 384 | |
368 | 385 | return (SeekBlob(source->image,offset,origin)); |
369 | 386 | } |
370 | 387 | |
371 | -static int BlobClose(jas_stream_obj_t *object) | |
388 | +/* Close a file object. */ | |
389 | +/* int (*close_)(jas_stream_obj_t *obj); */ | |
390 | +static int BlobClose(jas_stream_obj_t *obj) | |
372 | 391 | { |
373 | 392 | StreamManager |
374 | - *source = (StreamManager *) object; | |
393 | + *source = (StreamManager *) obj; | |
375 | 394 | |
376 | 395 | CloseBlob(source->image); |
377 | 396 | jas_free(source); |
@@ -395,6 +414,8 @@ | ||
395 | 414 | stream->obj_=(jas_stream_obj_t *) jas_malloc(sizeof(StreamManager)); |
396 | 415 | if (stream->obj_ == (jas_stream_obj_t *) NULL) |
397 | 416 | { |
417 | + (void) LogMagickEvent(CoderEvent,GetMagickModule(), | |
418 | + "jas_malloc() failed!"); | |
398 | 419 | jas_free(stream); |
399 | 420 | return((jas_stream_t *) NULL); |
400 | 421 | } |
@@ -410,24 +431,37 @@ | ||
410 | 431 | return(stream); |
411 | 432 | } |
412 | 433 | |
413 | -#define ThrowJP2ReaderException(code_,reason_,image_) \ | |
414 | -{ \ | |
415 | - for (component=0; component < (long) number_components; component++) \ | |
416 | - MagickFreeResourceLimitedMemory(channel_lut[component]); \ | |
417 | - if (pixels) \ | |
418 | - jas_matrix_destroy(pixels); \ | |
419 | - if (jp2_stream) \ | |
420 | - (void) jas_stream_close(jp2_stream); \ | |
421 | - if (jp2_image) \ | |
422 | - jas_image_destroy(jp2_image); \ | |
423 | - MagickFreeMemory(options); \ | |
424 | - ThrowReaderException(code_,reason_,image_); \ | |
425 | -} | |
434 | +#if defined(HAVE_JAS_INIT_LIBRARY) | |
435 | +# define JAS_CLEANUP_THREAD() jas_cleanup_thread() | |
436 | +#else | |
437 | +# define JAS_CLEANUP_THREAD() | |
438 | +#endif | |
439 | + | |
440 | +#define ThrowJP2ReaderException(code_,reason_,image_) \ | |
441 | + { \ | |
442 | + for (component=0; component < (long) number_components; component++) \ | |
443 | + MagickFreeResourceLimitedMemory(channel_lut[component]); \ | |
444 | + if (pixels) \ | |
445 | + jas_matrix_destroy(pixels); \ | |
446 | + if (jp2_stream) \ | |
447 | + (void) jas_stream_close(jp2_stream); \ | |
448 | + if (jp2_image) \ | |
449 | + jas_image_destroy(jp2_image); \ | |
450 | + MagickFreeMemory(options); \ | |
451 | + JAS_CLEANUP_THREAD(); \ | |
452 | + ThrowReaderException(code_,reason_,image_); \ | |
453 | + } | |
454 | + | |
455 | +#define ThrowJP2WriterException(code_,reason_,image_) \ | |
456 | + { \ | |
457 | + JAS_CLEANUP_THREAD(); \ | |
458 | + ThrowWriterException(code_,reason_,image_); \ | |
459 | + } | |
426 | 460 | |
427 | 461 | /* |
428 | 462 | Initialize Jasper |
429 | 463 | */ |
430 | -#if HAVE_JAS_INITIALIZE | |
464 | +#if HAVE_JAS_INIT_LIBRARY | |
431 | 465 | static void *alloc_rlm(struct jas_allocator_s *allocator, size_t size) |
432 | 466 | { |
433 | 467 | char *p; |
@@ -452,18 +486,24 @@ | ||
452 | 486 | /* fprintf(stderr,"realloc_rlm(%p, %p, %zu) -> %p\n", allocator, pointer, new_size, p); */ |
453 | 487 | return p; |
454 | 488 | } |
455 | -#endif /* if HAVE_JAS_INITIALIZE */ | |
456 | -static void initialize_jasper(void) | |
489 | +#endif /* if HAVE_JAS_INIT_LIBRARY */ | |
490 | +static MagickPassFail initialize_jasper(ExceptionInfo *exception) | |
457 | 491 | { |
492 | + (void) exception; | |
458 | 493 | if (!jasper_initialized) |
459 | 494 | { |
460 | -#if HAVE_JAS_INITIALIZE | |
495 | +#if HAVE_JAS_INIT_LIBRARY | |
461 | 496 | { |
462 | 497 | /* static jas_std_allocator_t allocator; */ |
463 | 498 | static jas_allocator_t allocator; |
499 | + | |
464 | 500 | (void) LogMagickEvent(CoderEvent,GetMagickModule(), |
465 | 501 | "Initializing JasPer..."); |
502 | + /* | |
503 | + Configure the library using the default configuration settings. | |
504 | + */ | |
466 | 505 | jas_conf_clear(); |
506 | + | |
467 | 507 | /* |
468 | 508 | Provide our own resource-limited memory allocation |
469 | 509 | functions. |
@@ -503,12 +543,23 @@ | ||
503 | 543 | /* |
504 | 544 | Tell JasPer how much memory it could ever be allowed to use. |
505 | 545 | */ |
506 | - jas_conf_set_max_mem((size_t) GetMagickResourceLimit(MemoryResource)); | |
546 | + jas_conf_set_max_mem_usage((size_t) GetMagickResourceLimit(MemoryResource)); | |
507 | 547 | |
508 | - if (jas_initialize() == 0) | |
548 | + /* | |
549 | + Inform JasPer that app may be multi-threaded | |
550 | + */ | |
551 | + jas_conf_set_multithread(JP2_HAVE_THREADS); | |
552 | + | |
553 | + /* Perform global initialization for the JasPer library. */ | |
554 | + if (jas_init_library() == 0) | |
509 | 555 | { |
510 | 556 | jasper_initialized=MagickTrue; |
511 | 557 | } |
558 | + else | |
559 | + { | |
560 | + (void) LogMagickEvent(CoderEvent,GetMagickModule(), | |
561 | + "jas_init_library() failed!"); | |
562 | + } | |
512 | 563 | } |
513 | 564 | #else |
514 | 565 | { |
@@ -520,8 +571,13 @@ | ||
520 | 571 | (void) LogMagickEvent(CoderEvent,GetMagickModule(), |
521 | 572 | "Initialized JasPer"); |
522 | 573 | } |
574 | + else | |
575 | + { | |
576 | + (void) LogMagickEvent(CoderEvent,GetMagickModule(), | |
577 | + "jas_init() failed!"); | |
578 | + } | |
523 | 579 | } |
524 | -#endif /* HAVE_JAS_INITIALIZE */ | |
580 | +#endif /* HAVE_JAS_INIT_LIBRARY */ | |
525 | 581 | |
526 | 582 | if (!jasper_initialized) |
527 | 583 | { |
@@ -529,6 +585,8 @@ | ||
529 | 585 | "Failed to initialize JasPer!"); |
530 | 586 | } |
531 | 587 | } |
588 | + | |
589 | + return jasper_initialized ? MagickPass : MagickFail; | |
532 | 590 | } |
533 | 591 | |
534 | 592 |
@@ -541,9 +599,12 @@ | ||
541 | 599 | { |
542 | 600 | (void) LogMagickEvent(CoderEvent,GetMagickModule(), |
543 | 601 | "Destroying JasPer..."); |
544 | -#if HAVE_JAS_INITIALIZE | |
602 | +#if HAVE_JAS_INIT_LIBRARY | |
603 | + /* Perform global cleanup for the JasPer library. */ | |
604 | + jas_cleanup_library(); | |
605 | +#else | |
545 | 606 | jas_cleanup(); |
546 | -#endif /* if HAVE_JAS_INITIALIZE */ | |
607 | +#endif /* if HAVE_JAS_INIT_LIBRARY */ | |
547 | 608 | jasper_initialized=MagickFalse; |
548 | 609 | } |
549 | 610 | } |
@@ -607,7 +668,23 @@ | ||
607 | 668 | /* |
608 | 669 | Initialize Jasper |
609 | 670 | */ |
610 | - initialize_jasper(); | |
671 | + if (initialize_jasper(exception) != MagickPass) | |
672 | + { | |
673 | + return (Image *) NULL; | |
674 | + } | |
675 | + | |
676 | +#if HAVE_JAS_INIT_LIBRARY | |
677 | + /* | |
678 | + Perform any per-thread initialization for the JasPer library. | |
679 | + */ | |
680 | + if (jas_init_thread()) | |
681 | + { | |
682 | + /* Handle the initialization error. */ | |
683 | + (void) LogMagickEvent(CoderEvent,GetMagickModule(), | |
684 | + "jas_init_thread() failed!"); | |
685 | + return (Image *) NULL; | |
686 | + } | |
687 | +#endif /* if HAVE_JAS_INIT_LIBRARY */ | |
611 | 688 | |
612 | 689 | /* |
613 | 690 | Open image file. |
@@ -1065,6 +1142,10 @@ | ||
1065 | 1142 | MagickFreeMemory(options); |
1066 | 1143 | jas_image_destroy(jp2_image); |
1067 | 1144 | StopTimer(&image->timer); |
1145 | +#if HAVE_JAS_INIT_LIBRARY | |
1146 | + /* Perform any per-thread clean-up for the JasPer library. */ | |
1147 | + JAS_CLEANUP_THREAD(); | |
1148 | +#endif /* if HAVE_JAS_INIT_LIBRARY */ | |
1068 | 1149 | return(image); |
1069 | 1150 | } |
1070 | 1151 | #endif /* if defined(HasJP2) */ |
@@ -1292,7 +1373,23 @@ | ||
1292 | 1373 | /* |
1293 | 1374 | Initialize Jasper |
1294 | 1375 | */ |
1295 | - initialize_jasper(); | |
1376 | + if (initialize_jasper(&image->exception) != MagickPass) | |
1377 | + { | |
1378 | + return MagickFail; | |
1379 | + } | |
1380 | + | |
1381 | +#if HAVE_JAS_INIT_LIBRARY | |
1382 | + /* | |
1383 | + Perform any per-thread initialization for the JasPer library. | |
1384 | + */ | |
1385 | + if (jas_init_thread()) | |
1386 | + { | |
1387 | + /* Handle the initialization error. */ | |
1388 | + (void) LogMagickEvent(CoderEvent,GetMagickModule(), | |
1389 | + "jas_init_thread() failed!"); | |
1390 | + return MagickFail; | |
1391 | + } | |
1392 | +#endif /* if HAVE_JAS_INIT_LIBRARY */ | |
1296 | 1393 | |
1297 | 1394 | /* |
1298 | 1395 | Open image file. |
@@ -1303,7 +1400,7 @@ | ||
1303 | 1400 | assert(image->signature == MagickSignature); |
1304 | 1401 | status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); |
1305 | 1402 | if (status == False) |
1306 | - ThrowWriterException(FileOpenError,UnableToOpenFile,image); | |
1403 | + ThrowJP2WriterException(FileOpenError,UnableToOpenFile,image); | |
1307 | 1404 | |
1308 | 1405 | /* |
1309 | 1406 | Ensure that image is in RGB space. |
@@ -1379,7 +1476,7 @@ | ||
1379 | 1476 | */ |
1380 | 1477 | jp2_stream=JP2StreamManager(&StreamOperators, image); |
1381 | 1478 | if (jp2_stream == (jas_stream_t *) NULL) |
1382 | - ThrowWriterException(DelegateError,UnableToManageJP2Stream,image); | |
1479 | + ThrowJP2WriterException(DelegateError,UnableToManageJP2Stream,image); | |
1383 | 1480 | number_components=image->matte ? 4 : 3; |
1384 | 1481 | if ((image_info->type != TrueColorType) && |
1385 | 1482 | (characteristics.grayscale)) |
@@ -1387,7 +1484,7 @@ | ||
1387 | 1484 | |
1388 | 1485 | jp2_image=jas_image_create0(); |
1389 | 1486 | if (jp2_image == (jas_image_t *) NULL) |
1390 | - ThrowWriterException(DelegateError,UnableToCreateImage,image); | |
1487 | + ThrowJP2WriterException(DelegateError,UnableToCreateImage,image); | |
1391 | 1488 | |
1392 | 1489 | for (component=0; component < number_components; component++) |
1393 | 1490 | { |
@@ -1403,7 +1500,7 @@ | ||
1403 | 1500 | |
1404 | 1501 | if (jas_image_addcmpt(jp2_image, component,&component_info)) { |
1405 | 1502 | jas_image_destroy(jp2_image); |
1406 | - ThrowWriterException(DelegateError,UnableToCreateImageComponent,image); | |
1503 | + ThrowJP2WriterException(DelegateError,UnableToCreateImageComponent,image); | |
1407 | 1504 | } |
1408 | 1505 | } |
1409 | 1506 |
@@ -1422,7 +1519,7 @@ | ||
1422 | 1519 | if (lut == (unsigned short *) NULL) |
1423 | 1520 | { |
1424 | 1521 | jas_image_destroy(jp2_image); |
1425 | - ThrowWriterException(ResourceLimitError,MemoryAllocationFailed,image); | |
1522 | + ThrowJP2WriterException(ResourceLimitError,MemoryAllocationFailed,image); | |
1426 | 1523 | } |
1427 | 1524 | |
1428 | 1525 | max_value=MaxValueGivenBits(component_info.prec); |
@@ -1483,7 +1580,7 @@ | ||
1483 | 1580 | { |
1484 | 1581 | MagickFreeResourceLimitedMemory(lut); |
1485 | 1582 | jas_image_destroy(jp2_image); |
1486 | - ThrowWriterException(ResourceLimitError,MemoryAllocationFailed,image); | |
1583 | + ThrowJP2WriterException(ResourceLimitError,MemoryAllocationFailed,image); | |
1487 | 1584 | } |
1488 | 1585 | |
1489 | 1586 | for (y=0; y < (long) image->rows; y++) |
@@ -1590,7 +1687,12 @@ | ||
1590 | 1687 | jas_matrix_destroy(jp2_pixels); |
1591 | 1688 | jas_image_destroy(jp2_image); |
1592 | 1689 | if (status) |
1593 | - ThrowWriterException(DelegateError,UnableToEncodeImageFile,image); | |
1690 | + ThrowJP2WriterException(DelegateError,UnableToEncodeImageFile,image); | |
1691 | + | |
1692 | +#if HAVE_JAS_INIT_LIBRARY | |
1693 | + /* Perform any per-thread clean-up for the JasPer library. */ | |
1694 | + JAS_CLEANUP_THREAD(); | |
1695 | +#endif /* if HAVE_JAS_INIT_LIBRARY */ | |
1594 | 1696 | return(True); |
1595 | 1697 | } |
1596 | 1698 | #endif /* if defined(HasJP2) */ |
@@ -26177,7 +26177,7 @@ | ||
26177 | 26177 | { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 |
26178 | 26178 | $as_echo "yes" >&6; } |
26179 | 26179 | have_jp2='yes' |
26180 | - for ac_func in jas_initialize jp2_decode jpc_decode pgx_decode | |
26180 | + for ac_func in jas_init_library jp2_decode jpc_decode pgx_decode | |
26181 | 26181 | do : |
26182 | 26182 | as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` |
26183 | 26183 | ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" |
@@ -2254,7 +2254,7 @@ | ||
2254 | 2254 | AC_DEFINE([HasJP2],[1],[Define if you have JPEG version 2 "Jasper" library]) |
2255 | 2255 | AC_MSG_RESULT([yes]) |
2256 | 2256 | have_jp2='yes' |
2257 | - AC_CHECK_FUNCS([jas_initialize jp2_decode jpc_decode pgx_decode]) | |
2257 | + AC_CHECK_FUNCS([jas_init_library jp2_decode jpc_decode pgx_decode]) | |
2258 | 2258 | fi |
2259 | 2259 | else |
2260 | 2260 | AC_MSG_RESULT([no]) |
@@ -146,8 +146,8 @@ | ||
146 | 146 | /* Define to 1 if you have the <inttypes.h> header file. */ |
147 | 147 | #undef HAVE_INTTYPES_H |
148 | 148 | |
149 | -/* Define to 1 if you have the `jas_initialize' function. */ | |
150 | -#undef HAVE_JAS_INITIALIZE | |
149 | +/* Define to 1 if you have the `jas_init_library' function. */ | |
150 | +#undef HAVE_JAS_INIT_LIBRARY | |
151 | 151 | |
152 | 152 | /* Define to 1 if you have the `jp2_decode' function. */ |
153 | 153 | #undef HAVE_JP2_DECODE |
@@ -38,8 +38,8 @@ | ||
38 | 38 | #define MagickLibVersion 0x262300 |
39 | 39 | #define MagickLibVersionText "1.4" |
40 | 40 | #define MagickLibVersionNumber 26,23,0 |
41 | -#define MagickChangeDate "20220116" | |
42 | -#define MagickReleaseDate "snapshot-20220116" | |
41 | +#define MagickChangeDate "20220121" | |
42 | +#define MagickReleaseDate "snapshot-20220121" | |
43 | 43 | |
44 | 44 | /* |
45 | 45 | The MagickLibInterfaceNewest and MagickLibInterfaceOldest defines |
@@ -35,6 +35,10 @@ | ||
35 | 35 | <div class="document"> |
36 | 36 | |
37 | 37 | |
38 | +<p>2022-01-21 Bob Friesenhahn <<a class="reference external" href="mailto:bfriesen%40simple.dallas.tx.us">bfriesen<span>@</span>simple<span>.</span>dallas<span>.</span>tx<span>.</span>us</a>></p> | |
39 | +<blockquote> | |
40 | +* coders/jp2.c: Adaptations to work with Jasper 3.0.0's | |
41 | +jas_init_library() and other related functions.</blockquote> | |
38 | 42 | <p>2022-01-16 Bob Friesenhahn <<a class="reference external" href="mailto:bfriesen%40simple.dallas.tx.us">bfriesen<span>@</span>simple<span>.</span>dallas<span>.</span>tx<span>.</span>us</a>></p> |
39 | 43 | <blockquote> |
40 | 44 | <p>* coders/miff.c (ReadMIFFImage): Do not proceed to next image in |