70 #if defined(MAGICKCORE_LCMS_DELEGATE)
71 #if defined(MAGICKCORE_HAVE_LCMS_LCMS2_H)
73 #include <lcms/lcms2.h>
79 #if defined(MAGICKCORE_XML_DELEGATE)
80 # if defined(MAGICKCORE_WINDOWS_SUPPORT)
81 # if !defined(__MINGW32__)
82 # include <win32config.h>
85 # include <libxml/parser.h>
86 # include <libxml/tree.h>
93 #if !defined(MAGICKCORE_HDRI_SUPPORT)
94 #if (MAGICKCORE_QUANTUM_DEPTH == 8)
96 #define LCMSScaleSource(pixel) ScaleQuantumToShort(pixel)
97 #define LCMSScaleTarget(pixel) ScaleShortToQuantum(pixel)
98 typedef unsigned short
100 #elif (MAGICKCORE_QUANTUM_DEPTH == 16)
102 #define LCMSScaleSource(pixel) (pixel)
103 #define LCMSScaleTarget(pixel) (pixel)
104 typedef unsigned short
109 #if defined(LCMSHDRI)
110 #define LCMSScaleSource(pixel) (source_scale*QuantumScale*(pixel))
111 #define LCMSScaleTarget(pixel) ClampToQuantum(target_scale*QuantumRange*(pixel))
179 const Image *clone_image)
181 assert(image != (
Image *) NULL);
185 assert(clone_image != (
const Image *) NULL);
187 if (clone_image->
profiles != (
void *) NULL)
189 if (image->
profiles != (
void *) NULL)
223 assert(image != (
Image *) NULL);
291 assert(image != (
Image *) NULL);
326 assert(image != (
Image *) NULL);
331 return((
char *) NULL);
376 #if defined(MAGICKCORE_LCMS_DELEGATE)
378 #if LCMS_VERSION < 2060
379 static void* cmsGetContextUserData(cmsContext ContextID)
384 static cmsContext cmsCreateContext(
void *
magick_unused(Plugin),
void *UserData)
387 return((cmsContext) UserData);
390 static void cmsSetLogErrorHandlerTHR(cmsContext
magick_unused(ContextID),
391 cmsLogErrorHandlerFunction Fn)
394 cmsSetLogErrorHandler(Fn);
397 static void cmsDeleteContext(cmsContext
magick_unused(ContextID))
418 const size_t channels)
433 (void) memset(pixels,0,number_threads*
sizeof(*pixels));
434 for (i=0; i < (ssize_t) number_threads; i++)
444 static cmsHTRANSFORM *DestroyTransformThreadSet(cmsHTRANSFORM *transform)
449 assert(transform != (cmsHTRANSFORM *) NULL);
451 if (transform[i] != (cmsHTRANSFORM) NULL)
452 cmsDeleteTransform(transform[i]);
457 static cmsHTRANSFORM *AcquireTransformThreadSet(
458 const cmsHPROFILE source_profile,
const cmsUInt32Number source_type,
459 const cmsHPROFILE target_profile,
const cmsUInt32Number target_type,
460 const int intent,
const cmsUInt32Number flags,cmsContext cms_context)
474 if (transform == (cmsHTRANSFORM *) NULL)
475 return((cmsHTRANSFORM *) NULL);
476 (void) memset(transform,0,number_threads*
sizeof(*transform));
477 for (i=0; i < (ssize_t) number_threads; i++)
479 transform[i]=cmsCreateTransformTHR(cms_context,source_profile,source_type,
480 target_profile,target_type,intent,flags);
481 if (transform[i] == (cmsHTRANSFORM) NULL)
482 return(DestroyTransformThreadSet(transform));
487 static void CMSExceptionHandler(cmsContext context,cmsUInt32Number severity,
505 image=cms_exception->
image;
506 if (image == (
Image *) NULL)
509 "UnableToTransformColorspace",
"`%s'",
"unknown context");
514 severity,message != (
char *) NULL ? message :
"no message");
516 "UnableToTransformColorspace",
"`%s', %s (#%u)",image->
filename,
517 message != (
char *) NULL ? message :
"no message",severity);
527 0x00, 0x00, 0x0c, 0x8c, 0x61, 0x72, 0x67, 0x6c, 0x02, 0x20, 0x00, 0x00,
528 0x6d, 0x6e, 0x74, 0x72, 0x52, 0x47, 0x42, 0x20, 0x58, 0x59, 0x5a, 0x20,
529 0x07, 0xde, 0x00, 0x01, 0x00, 0x06, 0x00, 0x16, 0x00, 0x0f, 0x00, 0x3a,
530 0x61, 0x63, 0x73, 0x70, 0x4d, 0x53, 0x46, 0x54, 0x00, 0x00, 0x00, 0x00,
531 0x49, 0x45, 0x43, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00, 0x00, 0x00, 0x00,
532 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf6, 0xd6,
533 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d, 0x61, 0x72, 0x67, 0x6c,
534 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
535 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
538 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x01, 0x50, 0x00, 0x00, 0x00, 0x99,
539 0x63, 0x70, 0x72, 0x74, 0x00, 0x00, 0x01, 0xec, 0x00, 0x00, 0x00, 0x67,
540 0x64, 0x6d, 0x6e, 0x64, 0x00, 0x00, 0x02, 0x54, 0x00, 0x00, 0x00, 0x70,
541 0x64, 0x6d, 0x64, 0x64, 0x00, 0x00, 0x02, 0xc4, 0x00, 0x00, 0x00, 0x88,
542 0x74, 0x65, 0x63, 0x68, 0x00, 0x00, 0x03, 0x4c, 0x00, 0x00, 0x00, 0x0c,
543 0x76, 0x75, 0x65, 0x64, 0x00, 0x00, 0x03, 0x58, 0x00, 0x00, 0x00, 0x67,
544 0x76, 0x69, 0x65, 0x77, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x24,
545 0x6c, 0x75, 0x6d, 0x69, 0x00, 0x00, 0x03, 0xe4, 0x00, 0x00, 0x00, 0x14,
546 0x6d, 0x65, 0x61, 0x73, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x24,
547 0x77, 0x74, 0x70, 0x74, 0x00, 0x00, 0x04, 0x1c, 0x00, 0x00, 0x00, 0x14,
548 0x62, 0x6b, 0x70, 0x74, 0x00, 0x00, 0x04, 0x30, 0x00, 0x00, 0x00, 0x14,
549 0x72, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x04, 0x44, 0x00, 0x00, 0x00, 0x14,
550 0x67, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x04, 0x58, 0x00, 0x00, 0x00, 0x14,
551 0x62, 0x58, 0x59, 0x5a, 0x00, 0x00, 0x04, 0x6c, 0x00, 0x00, 0x00, 0x14,
552 0x72, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x08, 0x0c,
553 0x67, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x08, 0x0c,
554 0x62, 0x54, 0x52, 0x43, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x08, 0x0c,
555 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
556 0x73, 0x52, 0x47, 0x42, 0x20, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36,
557 0x36, 0x2d, 0x32, 0x2e, 0x31, 0x20, 0x28, 0x45, 0x71, 0x75, 0x69, 0x76,
558 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x77, 0x77,
559 0x2e, 0x73, 0x72, 0x67, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x20, 0x31, 0x39,
560 0x39, 0x38, 0x20, 0x48, 0x50, 0x20, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c,
561 0x65, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
562 0x00, 0x3f, 0x73, 0x52, 0x47, 0x42, 0x20, 0x49, 0x45, 0x43, 0x36, 0x31,
563 0x39, 0x36, 0x36, 0x2d, 0x32, 0x2e, 0x31, 0x20, 0x28, 0x45, 0x71, 0x75,
564 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x77,
565 0x77, 0x77, 0x2e, 0x73, 0x72, 0x67, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x20,
566 0x31, 0x39, 0x39, 0x38, 0x20, 0x48, 0x50, 0x20, 0x70, 0x72, 0x6f, 0x66,
567 0x69, 0x6c, 0x65, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
568 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x43, 0x72, 0x65, 0x61,
569 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x47, 0x72, 0x61, 0x65, 0x6d,
570 0x65, 0x20, 0x57, 0x2e, 0x20, 0x47, 0x69, 0x6c, 0x6c, 0x2e, 0x20, 0x52,
571 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f,
572 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20,
573 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x20, 0x4e, 0x6f, 0x20, 0x57,
574 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x2c, 0x20, 0x55, 0x73, 0x65,
575 0x20, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x77, 0x6e,
576 0x20, 0x72, 0x69, 0x73, 0x6b, 0x2e, 0x00, 0x00, 0x64, 0x65, 0x73, 0x63,
577 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x49, 0x45, 0x43, 0x20,
578 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69,
579 0x65, 0x63, 0x2e, 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580 0x00, 0x00, 0x00, 0x00, 0x16, 0x49, 0x45, 0x43, 0x20, 0x68, 0x74, 0x74,
581 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x65, 0x63, 0x2e,
582 0x63, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
583 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
584 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
586 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e,
587 0x49, 0x45, 0x43, 0x20, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2d, 0x32, 0x2e,
588 0x31, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x52, 0x47,
589 0x42, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x75, 0x72, 0x20, 0x73, 0x70, 0x61,
590 0x63, 0x65, 0x20, 0x2d, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00, 0x00, 0x00,
591 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x49, 0x45, 0x43,
592 0x20, 0x36, 0x31, 0x39, 0x36, 0x36, 0x2d, 0x32, 0x2e, 0x31, 0x20, 0x44,
593 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x20, 0x52, 0x47, 0x42, 0x20, 0x63,
594 0x6f, 0x6c, 0x6f, 0x75, 0x72, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20,
595 0x2d, 0x20, 0x73, 0x52, 0x47, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
597 0x00, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x20, 0x00, 0x00, 0x00, 0x00,
598 0x43, 0x52, 0x54, 0x20, 0x64, 0x65, 0x73, 0x63, 0x00, 0x00, 0x00, 0x00,
599 0x00, 0x00, 0x00, 0x0d, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36,
600 0x2d, 0x32, 0x2e, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601 0x00, 0x00, 0x00, 0x0d, 0x49, 0x45, 0x43, 0x36, 0x31, 0x39, 0x36, 0x36,
602 0x2d, 0x32, 0x2e, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
603 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
605 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
607 0x76, 0x69, 0x65, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xa4, 0x7c,
608 0x00, 0x14, 0x5f, 0x30, 0x00, 0x10, 0xce, 0x02, 0x00, 0x03, 0xed, 0xb2,
609 0x00, 0x04, 0x13, 0x0a, 0x00, 0x03, 0x5c, 0x67, 0x00, 0x00, 0x00, 0x01,
610 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x0a, 0x3d,
611 0x00, 0x50, 0x00, 0x00, 0x00, 0x57, 0x1e, 0xb8, 0x6d, 0x65, 0x61, 0x73,
612 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
613 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
614 0x00, 0x00, 0x02, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x58, 0x59, 0x5a, 0x20,
615 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x51, 0x00, 0x01, 0x00, 0x00,
616 0x00, 0x01, 0x16, 0xcc, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00,
617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xa0,
619 0x00, 0x00, 0x38, 0xf5, 0x00, 0x00, 0x03, 0x90, 0x58, 0x59, 0x5a, 0x20,
620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x97, 0x00, 0x00, 0xb7, 0x87,
621 0x00, 0x00, 0x18, 0xd9, 0x58, 0x59, 0x5a, 0x20, 0x00, 0x00, 0x00, 0x00,
622 0x00, 0x00, 0x24, 0x9f, 0x00, 0x00, 0x0f, 0x84, 0x00, 0x00, 0xb6, 0xc4,
623 0x63, 0x75, 0x72, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
624 0x00, 0x00, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x19,
625 0x00, 0x1e, 0x00, 0x23, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x37,
626 0x00, 0x3b, 0x00, 0x40, 0x00, 0x45, 0x00, 0x4a, 0x00, 0x4f, 0x00, 0x54,
627 0x00, 0x59, 0x00, 0x5e, 0x00, 0x63, 0x00, 0x68, 0x00, 0x6d, 0x00, 0x72,
628 0x00, 0x77, 0x00, 0x7c, 0x00, 0x81, 0x00, 0x86, 0x00, 0x8b, 0x00, 0x90,
629 0x00, 0x95, 0x00, 0x9a, 0x00, 0x9f, 0x00, 0xa4, 0x00, 0xa9, 0x00, 0xae,
630 0x00, 0xb2, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xc1, 0x00, 0xc6, 0x00, 0xcb,
631 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xdb, 0x00, 0xe0, 0x00, 0xe5, 0x00, 0xeb,
632 0x00, 0xf0, 0x00, 0xf6, 0x00, 0xfb, 0x01, 0x01, 0x01, 0x07, 0x01, 0x0d,
633 0x01, 0x13, 0x01, 0x19, 0x01, 0x1f, 0x01, 0x25, 0x01, 0x2b, 0x01, 0x32,
634 0x01, 0x38, 0x01, 0x3e, 0x01, 0x45, 0x01, 0x4c, 0x01, 0x52, 0x01, 0x59,
635 0x01, 0x60, 0x01, 0x67, 0x01, 0x6e, 0x01, 0x75, 0x01, 0x7c, 0x01, 0x83,
636 0x01, 0x8b, 0x01, 0x92, 0x01, 0x9a, 0x01, 0xa1, 0x01, 0xa9, 0x01, 0xb1,
637 0x01, 0xb9, 0x01, 0xc1, 0x01, 0xc9, 0x01, 0xd1, 0x01, 0xd9, 0x01, 0xe1,
638 0x01, 0xe9, 0x01, 0xf2, 0x01, 0xfa, 0x02, 0x03, 0x02, 0x0c, 0x02, 0x14,
639 0x02, 0x1d, 0x02, 0x26, 0x02, 0x2f, 0x02, 0x38, 0x02, 0x41, 0x02, 0x4b,
640 0x02, 0x54, 0x02, 0x5d, 0x02, 0x67, 0x02, 0x71, 0x02, 0x7a, 0x02, 0x84,
641 0x02, 0x8e, 0x02, 0x98, 0x02, 0xa2, 0x02, 0xac, 0x02, 0xb6, 0x02, 0xc1,
642 0x02, 0xcb, 0x02, 0xd5, 0x02, 0xe0, 0x02, 0xeb, 0x02, 0xf5, 0x03, 0x00,
643 0x03, 0x0b, 0x03, 0x16, 0x03, 0x21, 0x03, 0x2d, 0x03, 0x38, 0x03, 0x43,
644 0x03, 0x4f, 0x03, 0x5a, 0x03, 0x66, 0x03, 0x72, 0x03, 0x7e, 0x03, 0x8a,
645 0x03, 0x96, 0x03, 0xa2, 0x03, 0xae, 0x03, 0xba, 0x03, 0xc7, 0x03, 0xd3,
646 0x03, 0xe0, 0x03, 0xec, 0x03, 0xf9, 0x04, 0x06, 0x04, 0x13, 0x04, 0x20,
647 0x04, 0x2d, 0x04, 0x3b, 0x04, 0x48, 0x04, 0x55, 0x04, 0x63, 0x04, 0x71,
648 0x04, 0x7e, 0x04, 0x8c, 0x04, 0x9a, 0x04, 0xa8, 0x04, 0xb6, 0x04, 0xc4,
649 0x04, 0xd3, 0x04, 0xe1, 0x04, 0xf0, 0x04, 0xfe, 0x05, 0x0d, 0x05, 0x1c,
650 0x05, 0x2b, 0x05, 0x3a, 0x05, 0x49, 0x05, 0x58, 0x05, 0x67, 0x05, 0x77,
651 0x05, 0x86, 0x05, 0x96, 0x05, 0xa6, 0x05, 0xb5, 0x05, 0xc5, 0x05, 0xd5,
652 0x05, 0xe5, 0x05, 0xf6, 0x06, 0x06, 0x06, 0x16, 0x06, 0x27, 0x06, 0x37,
653 0x06, 0x48, 0x06, 0x59, 0x06, 0x6a, 0x06, 0x7b, 0x06, 0x8c, 0x06, 0x9d,
654 0x06, 0xaf, 0x06, 0xc0, 0x06, 0xd1, 0x06, 0xe3, 0x06, 0xf5, 0x07, 0x07,
655 0x07, 0x19, 0x07, 0x2b, 0x07, 0x3d, 0x07, 0x4f, 0x07, 0x61, 0x07, 0x74,
656 0x07, 0x86, 0x07, 0x99, 0x07, 0xac, 0x07, 0xbf, 0x07, 0xd2, 0x07, 0xe5,
657 0x07, 0xf8, 0x08, 0x0b, 0x08, 0x1f, 0x08, 0x32, 0x08, 0x46, 0x08, 0x5a,
658 0x08, 0x6e, 0x08, 0x82, 0x08, 0x96, 0x08, 0xaa, 0x08, 0xbe, 0x08, 0xd2,
659 0x08, 0xe7, 0x08, 0xfb, 0x09, 0x10, 0x09, 0x25, 0x09, 0x3a, 0x09, 0x4f,
660 0x09, 0x64, 0x09, 0x79, 0x09, 0x8f, 0x09, 0xa4, 0x09, 0xba, 0x09, 0xcf,
661 0x09, 0xe5, 0x09, 0xfb, 0x0a, 0x11, 0x0a, 0x27, 0x0a, 0x3d, 0x0a, 0x54,
662 0x0a, 0x6a, 0x0a, 0x81, 0x0a, 0x98, 0x0a, 0xae, 0x0a, 0xc5, 0x0a, 0xdc,
663 0x0a, 0xf3, 0x0b, 0x0b, 0x0b, 0x22, 0x0b, 0x39, 0x0b, 0x51, 0x0b, 0x69,
664 0x0b, 0x80, 0x0b, 0x98, 0x0b, 0xb0, 0x0b, 0xc8, 0x0b, 0xe1, 0x0b, 0xf9,
665 0x0c, 0x12, 0x0c, 0x2a, 0x0c, 0x43, 0x0c, 0x5c, 0x0c, 0x75, 0x0c, 0x8e,
666 0x0c, 0xa7, 0x0c, 0xc0, 0x0c, 0xd9, 0x0c, 0xf3, 0x0d, 0x0d, 0x0d, 0x26,
667 0x0d, 0x40, 0x0d, 0x5a, 0x0d, 0x74, 0x0d, 0x8e, 0x0d, 0xa9, 0x0d, 0xc3,
668 0x0d, 0xde, 0x0d, 0xf8, 0x0e, 0x13, 0x0e, 0x2e, 0x0e, 0x49, 0x0e, 0x64,
669 0x0e, 0x7f, 0x0e, 0x9b, 0x0e, 0xb6, 0x0e, 0xd2, 0x0e, 0xee, 0x0f, 0x09,
670 0x0f, 0x25, 0x0f, 0x41, 0x0f, 0x5e, 0x0f, 0x7a, 0x0f, 0x96, 0x0f, 0xb3,
671 0x0f, 0xcf, 0x0f, 0xec, 0x10, 0x09, 0x10, 0x26, 0x10, 0x43, 0x10, 0x61,
672 0x10, 0x7e, 0x10, 0x9b, 0x10, 0xb9, 0x10, 0xd7, 0x10, 0xf5, 0x11, 0x13,
673 0x11, 0x31, 0x11, 0x4f, 0x11, 0x6d, 0x11, 0x8c, 0x11, 0xaa, 0x11, 0xc9,
674 0x11, 0xe8, 0x12, 0x07, 0x12, 0x26, 0x12, 0x45, 0x12, 0x64, 0x12, 0x84,
675 0x12, 0xa3, 0x12, 0xc3, 0x12, 0xe3, 0x13, 0x03, 0x13, 0x23, 0x13, 0x43,
676 0x13, 0x63, 0x13, 0x83, 0x13, 0xa4, 0x13, 0xc5, 0x13, 0xe5, 0x14, 0x06,
677 0x14, 0x27, 0x14, 0x49, 0x14, 0x6a, 0x14, 0x8b, 0x14, 0xad, 0x14, 0xce,
678 0x14, 0xf0, 0x15, 0x12, 0x15, 0x34, 0x15, 0x56, 0x15, 0x78, 0x15, 0x9b,
679 0x15, 0xbd, 0x15, 0xe0, 0x16, 0x03, 0x16, 0x26, 0x16, 0x49, 0x16, 0x6c,
680 0x16, 0x8f, 0x16, 0xb2, 0x16, 0xd6, 0x16, 0xfa, 0x17, 0x1d, 0x17, 0x41,
681 0x17, 0x65, 0x17, 0x89, 0x17, 0xae, 0x17, 0xd2, 0x17, 0xf7, 0x18, 0x1b,
682 0x18, 0x40, 0x18, 0x65, 0x18, 0x8a, 0x18, 0xaf, 0x18, 0xd5, 0x18, 0xfa,
683 0x19, 0x20, 0x19, 0x45, 0x19, 0x6b, 0x19, 0x91, 0x19, 0xb7, 0x19, 0xdd,
684 0x1a, 0x04, 0x1a, 0x2a, 0x1a, 0x51, 0x1a, 0x77, 0x1a, 0x9e, 0x1a, 0xc5,
685 0x1a, 0xec, 0x1b, 0x14, 0x1b, 0x3b, 0x1b, 0x63, 0x1b, 0x8a, 0x1b, 0xb2,
686 0x1b, 0xda, 0x1c, 0x02, 0x1c, 0x2a, 0x1c, 0x52, 0x1c, 0x7b, 0x1c, 0xa3,
687 0x1c, 0xcc, 0x1c, 0xf5, 0x1d, 0x1e, 0x1d, 0x47, 0x1d, 0x70, 0x1d, 0x99,
688 0x1d, 0xc3, 0x1d, 0xec, 0x1e, 0x16, 0x1e, 0x40, 0x1e, 0x6a, 0x1e, 0x94,
689 0x1e, 0xbe, 0x1e, 0xe9, 0x1f, 0x13, 0x1f, 0x3e, 0x1f, 0x69, 0x1f, 0x94,
690 0x1f, 0xbf, 0x1f, 0xea, 0x20, 0x15, 0x20, 0x41, 0x20, 0x6c, 0x20, 0x98,
691 0x20, 0xc4, 0x20, 0xf0, 0x21, 0x1c, 0x21, 0x48, 0x21, 0x75, 0x21, 0xa1,
692 0x21, 0xce, 0x21, 0xfb, 0x22, 0x27, 0x22, 0x55, 0x22, 0x82, 0x22, 0xaf,
693 0x22, 0xdd, 0x23, 0x0a, 0x23, 0x38, 0x23, 0x66, 0x23, 0x94, 0x23, 0xc2,
694 0x23, 0xf0, 0x24, 0x1f, 0x24, 0x4d, 0x24, 0x7c, 0x24, 0xab, 0x24, 0xda,
695 0x25, 0x09, 0x25, 0x38, 0x25, 0x68, 0x25, 0x97, 0x25, 0xc7, 0x25, 0xf7,
696 0x26, 0x27, 0x26, 0x57, 0x26, 0x87, 0x26, 0xb7, 0x26, 0xe8, 0x27, 0x18,
697 0x27, 0x49, 0x27, 0x7a, 0x27, 0xab, 0x27, 0xdc, 0x28, 0x0d, 0x28, 0x3f,
698 0x28, 0x71, 0x28, 0xa2, 0x28, 0xd4, 0x29, 0x06, 0x29, 0x38, 0x29, 0x6b,
699 0x29, 0x9d, 0x29, 0xd0, 0x2a, 0x02, 0x2a, 0x35, 0x2a, 0x68, 0x2a, 0x9b,
700 0x2a, 0xcf, 0x2b, 0x02, 0x2b, 0x36, 0x2b, 0x69, 0x2b, 0x9d, 0x2b, 0xd1,
701 0x2c, 0x05, 0x2c, 0x39, 0x2c, 0x6e, 0x2c, 0xa2, 0x2c, 0xd7, 0x2d, 0x0c,
702 0x2d, 0x41, 0x2d, 0x76, 0x2d, 0xab, 0x2d, 0xe1, 0x2e, 0x16, 0x2e, 0x4c,
703 0x2e, 0x82, 0x2e, 0xb7, 0x2e, 0xee, 0x2f, 0x24, 0x2f, 0x5a, 0x2f, 0x91,
704 0x2f, 0xc7, 0x2f, 0xfe, 0x30, 0x35, 0x30, 0x6c, 0x30, 0xa4, 0x30, 0xdb,
705 0x31, 0x12, 0x31, 0x4a, 0x31, 0x82, 0x31, 0xba, 0x31, 0xf2, 0x32, 0x2a,
706 0x32, 0x63, 0x32, 0x9b, 0x32, 0xd4, 0x33, 0x0d, 0x33, 0x46, 0x33, 0x7f,
707 0x33, 0xb8, 0x33, 0xf1, 0x34, 0x2b, 0x34, 0x65, 0x34, 0x9e, 0x34, 0xd8,
708 0x35, 0x13, 0x35, 0x4d, 0x35, 0x87, 0x35, 0xc2, 0x35, 0xfd, 0x36, 0x37,
709 0x36, 0x72, 0x36, 0xae, 0x36, 0xe9, 0x37, 0x24, 0x37, 0x60, 0x37, 0x9c,
710 0x37, 0xd7, 0x38, 0x14, 0x38, 0x50, 0x38, 0x8c, 0x38, 0xc8, 0x39, 0x05,
711 0x39, 0x42, 0x39, 0x7f, 0x39, 0xbc, 0x39, 0xf9, 0x3a, 0x36, 0x3a, 0x74,
712 0x3a, 0xb2, 0x3a, 0xef, 0x3b, 0x2d, 0x3b, 0x6b, 0x3b, 0xaa, 0x3b, 0xe8,
713 0x3c, 0x27, 0x3c, 0x65, 0x3c, 0xa4, 0x3c, 0xe3, 0x3d, 0x22, 0x3d, 0x61,
714 0x3d, 0xa1, 0x3d, 0xe0, 0x3e, 0x20, 0x3e, 0x60, 0x3e, 0xa0, 0x3e, 0xe0,
715 0x3f, 0x21, 0x3f, 0x61, 0x3f, 0xa2, 0x3f, 0xe2, 0x40, 0x23, 0x40, 0x64,
716 0x40, 0xa6, 0x40, 0xe7, 0x41, 0x29, 0x41, 0x6a, 0x41, 0xac, 0x41, 0xee,
717 0x42, 0x30, 0x42, 0x72, 0x42, 0xb5, 0x42, 0xf7, 0x43, 0x3a, 0x43, 0x7d,
718 0x43, 0xc0, 0x44, 0x03, 0x44, 0x47, 0x44, 0x8a, 0x44, 0xce, 0x45, 0x12,
719 0x45, 0x55, 0x45, 0x9a, 0x45, 0xde, 0x46, 0x22, 0x46, 0x67, 0x46, 0xab,
720 0x46, 0xf0, 0x47, 0x35, 0x47, 0x7b, 0x47, 0xc0, 0x48, 0x05, 0x48, 0x4b,
721 0x48, 0x91, 0x48, 0xd7, 0x49, 0x1d, 0x49, 0x63, 0x49, 0xa9, 0x49, 0xf0,
722 0x4a, 0x37, 0x4a, 0x7d, 0x4a, 0xc4, 0x4b, 0x0c, 0x4b, 0x53, 0x4b, 0x9a,
723 0x4b, 0xe2, 0x4c, 0x2a, 0x4c, 0x72, 0x4c, 0xba, 0x4d, 0x02, 0x4d, 0x4a,
724 0x4d, 0x93, 0x4d, 0xdc, 0x4e, 0x25, 0x4e, 0x6e, 0x4e, 0xb7, 0x4f, 0x00,
725 0x4f, 0x49, 0x4f, 0x93, 0x4f, 0xdd, 0x50, 0x27, 0x50, 0x71, 0x50, 0xbb,
726 0x51, 0x06, 0x51, 0x50, 0x51, 0x9b, 0x51, 0xe6, 0x52, 0x31, 0x52, 0x7c,
727 0x52, 0xc7, 0x53, 0x13, 0x53, 0x5f, 0x53, 0xaa, 0x53, 0xf6, 0x54, 0x42,
728 0x54, 0x8f, 0x54, 0xdb, 0x55, 0x28, 0x55, 0x75, 0x55, 0xc2, 0x56, 0x0f,
729 0x56, 0x5c, 0x56, 0xa9, 0x56, 0xf7, 0x57, 0x44, 0x57, 0x92, 0x57, 0xe0,
730 0x58, 0x2f, 0x58, 0x7d, 0x58, 0xcb, 0x59, 0x1a, 0x59, 0x69, 0x59, 0xb8,
731 0x5a, 0x07, 0x5a, 0x56, 0x5a, 0xa6, 0x5a, 0xf5, 0x5b, 0x45, 0x5b, 0x95,
732 0x5b, 0xe5, 0x5c, 0x35, 0x5c, 0x86, 0x5c, 0xd6, 0x5d, 0x27, 0x5d, 0x78,
733 0x5d, 0xc9, 0x5e, 0x1a, 0x5e, 0x6c, 0x5e, 0xbd, 0x5f, 0x0f, 0x5f, 0x61,
734 0x5f, 0xb3, 0x60, 0x05, 0x60, 0x57, 0x60, 0xaa, 0x60, 0xfc, 0x61, 0x4f,
735 0x61, 0xa2, 0x61, 0xf5, 0x62, 0x49, 0x62, 0x9c, 0x62, 0xf0, 0x63, 0x43,
736 0x63, 0x97, 0x63, 0xeb, 0x64, 0x40, 0x64, 0x94, 0x64, 0xe9, 0x65, 0x3d,
737 0x65, 0x92, 0x65, 0xe7, 0x66, 0x3d, 0x66, 0x92, 0x66, 0xe8, 0x67, 0x3d,
738 0x67, 0x93, 0x67, 0xe9, 0x68, 0x3f, 0x68, 0x96, 0x68, 0xec, 0x69, 0x43,
739 0x69, 0x9a, 0x69, 0xf1, 0x6a, 0x48, 0x6a, 0x9f, 0x6a, 0xf7, 0x6b, 0x4f,
740 0x6b, 0xa7, 0x6b, 0xff, 0x6c, 0x57, 0x6c, 0xaf, 0x6d, 0x08, 0x6d, 0x60,
741 0x6d, 0xb9, 0x6e, 0x12, 0x6e, 0x6b, 0x6e, 0xc4, 0x6f, 0x1e, 0x6f, 0x78,
742 0x6f, 0xd1, 0x70, 0x2b, 0x70, 0x86, 0x70, 0xe0, 0x71, 0x3a, 0x71, 0x95,
743 0x71, 0xf0, 0x72, 0x4b, 0x72, 0xa6, 0x73, 0x01, 0x73, 0x5d, 0x73, 0xb8,
744 0x74, 0x14, 0x74, 0x70, 0x74, 0xcc, 0x75, 0x28, 0x75, 0x85, 0x75, 0xe1,
745 0x76, 0x3e, 0x76, 0x9b, 0x76, 0xf8, 0x77, 0x56, 0x77, 0xb3, 0x78, 0x11,
746 0x78, 0x6e, 0x78, 0xcc, 0x79, 0x2a, 0x79, 0x89, 0x79, 0xe7, 0x7a, 0x46,
747 0x7a, 0xa5, 0x7b, 0x04, 0x7b, 0x63, 0x7b, 0xc2, 0x7c, 0x21, 0x7c, 0x81,
748 0x7c, 0xe1, 0x7d, 0x41, 0x7d, 0xa1, 0x7e, 0x01, 0x7e, 0x62, 0x7e, 0xc2,
749 0x7f, 0x23, 0x7f, 0x84, 0x7f, 0xe5, 0x80, 0x47, 0x80, 0xa8, 0x81, 0x0a,
750 0x81, 0x6b, 0x81, 0xcd, 0x82, 0x30, 0x82, 0x92, 0x82, 0xf4, 0x83, 0x57,
751 0x83, 0xba, 0x84, 0x1d, 0x84, 0x80, 0x84, 0xe3, 0x85, 0x47, 0x85, 0xab,
752 0x86, 0x0e, 0x86, 0x72, 0x86, 0xd7, 0x87, 0x3b, 0x87, 0x9f, 0x88, 0x04,
753 0x88, 0x69, 0x88, 0xce, 0x89, 0x33, 0x89, 0x99, 0x89, 0xfe, 0x8a, 0x64,
754 0x8a, 0xca, 0x8b, 0x30, 0x8b, 0x96, 0x8b, 0xfc, 0x8c, 0x63, 0x8c, 0xca,
755 0x8d, 0x31, 0x8d, 0x98, 0x8d, 0xff, 0x8e, 0x66, 0x8e, 0xce, 0x8f, 0x36,
756 0x8f, 0x9e, 0x90, 0x06, 0x90, 0x6e, 0x90, 0xd6, 0x91, 0x3f, 0x91, 0xa8,
757 0x92, 0x11, 0x92, 0x7a, 0x92, 0xe3, 0x93, 0x4d, 0x93, 0xb6, 0x94, 0x20,
758 0x94, 0x8a, 0x94, 0xf4, 0x95, 0x5f, 0x95, 0xc9, 0x96, 0x34, 0x96, 0x9f,
759 0x97, 0x0a, 0x97, 0x75, 0x97, 0xe0, 0x98, 0x4c, 0x98, 0xb8, 0x99, 0x24,
760 0x99, 0x90, 0x99, 0xfc, 0x9a, 0x68, 0x9a, 0xd5, 0x9b, 0x42, 0x9b, 0xaf,
761 0x9c, 0x1c, 0x9c, 0x89, 0x9c, 0xf7, 0x9d, 0x64, 0x9d, 0xd2, 0x9e, 0x40,
762 0x9e, 0xae, 0x9f, 0x1d, 0x9f, 0x8b, 0x9f, 0xfa, 0xa0, 0x69, 0xa0, 0xd8,
763 0xa1, 0x47, 0xa1, 0xb6, 0xa2, 0x26, 0xa2, 0x96, 0xa3, 0x06, 0xa3, 0x76,
764 0xa3, 0xe6, 0xa4, 0x56, 0xa4, 0xc7, 0xa5, 0x38, 0xa5, 0xa9, 0xa6, 0x1a,
765 0xa6, 0x8b, 0xa6, 0xfd, 0xa7, 0x6e, 0xa7, 0xe0, 0xa8, 0x52, 0xa8, 0xc4,
766 0xa9, 0x37, 0xa9, 0xa9, 0xaa, 0x1c, 0xaa, 0x8f, 0xab, 0x02, 0xab, 0x75,
767 0xab, 0xe9, 0xac, 0x5c, 0xac, 0xd0, 0xad, 0x44, 0xad, 0xb8, 0xae, 0x2d,
768 0xae, 0xa1, 0xaf, 0x16, 0xaf, 0x8b, 0xb0, 0x00, 0xb0, 0x75, 0xb0, 0xea,
769 0xb1, 0x60, 0xb1, 0xd6, 0xb2, 0x4b, 0xb2, 0xc2, 0xb3, 0x38, 0xb3, 0xae,
770 0xb4, 0x25, 0xb4, 0x9c, 0xb5, 0x13, 0xb5, 0x8a, 0xb6, 0x01, 0xb6, 0x79,
771 0xb6, 0xf0, 0xb7, 0x68, 0xb7, 0xe0, 0xb8, 0x59, 0xb8, 0xd1, 0xb9, 0x4a,
772 0xb9, 0xc2, 0xba, 0x3b, 0xba, 0xb5, 0xbb, 0x2e, 0xbb, 0xa7, 0xbc, 0x21,
773 0xbc, 0x9b, 0xbd, 0x15, 0xbd, 0x8f, 0xbe, 0x0a, 0xbe, 0x84, 0xbe, 0xff,
774 0xbf, 0x7a, 0xbf, 0xf5, 0xc0, 0x70, 0xc0, 0xec, 0xc1, 0x67, 0xc1, 0xe3,
775 0xc2, 0x5f, 0xc2, 0xdb, 0xc3, 0x58, 0xc3, 0xd4, 0xc4, 0x51, 0xc4, 0xce,
776 0xc5, 0x4b, 0xc5, 0xc8, 0xc6, 0x46, 0xc6, 0xc3, 0xc7, 0x41, 0xc7, 0xbf,
777 0xc8, 0x3d, 0xc8, 0xbc, 0xc9, 0x3a, 0xc9, 0xb9, 0xca, 0x38, 0xca, 0xb7,
778 0xcb, 0x36, 0xcb, 0xb6, 0xcc, 0x35, 0xcc, 0xb5, 0xcd, 0x35, 0xcd, 0xb5,
779 0xce, 0x36, 0xce, 0xb6, 0xcf, 0x37, 0xcf, 0xb8, 0xd0, 0x39, 0xd0, 0xba,
780 0xd1, 0x3c, 0xd1, 0xbe, 0xd2, 0x3f, 0xd2, 0xc1, 0xd3, 0x44, 0xd3, 0xc6,
781 0xd4, 0x49, 0xd4, 0xcb, 0xd5, 0x4e, 0xd5, 0xd1, 0xd6, 0x55, 0xd6, 0xd8,
782 0xd7, 0x5c, 0xd7, 0xe0, 0xd8, 0x64, 0xd8, 0xe8, 0xd9, 0x6c, 0xd9, 0xf1,
783 0xda, 0x76, 0xda, 0xfb, 0xdb, 0x80, 0xdc, 0x05, 0xdc, 0x8a, 0xdd, 0x10,
784 0xdd, 0x96, 0xde, 0x1c, 0xde, 0xa2, 0xdf, 0x29, 0xdf, 0xaf, 0xe0, 0x36,
785 0xe0, 0xbd, 0xe1, 0x44, 0xe1, 0xcc, 0xe2, 0x53, 0xe2, 0xdb, 0xe3, 0x63,
786 0xe3, 0xeb, 0xe4, 0x73, 0xe4, 0xfc, 0xe5, 0x84, 0xe6, 0x0d, 0xe6, 0x96,
787 0xe7, 0x1f, 0xe7, 0xa9, 0xe8, 0x32, 0xe8, 0xbc, 0xe9, 0x46, 0xe9, 0xd0,
788 0xea, 0x5b, 0xea, 0xe5, 0xeb, 0x70, 0xeb, 0xfb, 0xec, 0x86, 0xed, 0x11,
789 0xed, 0x9c, 0xee, 0x28, 0xee, 0xb4, 0xef, 0x40, 0xef, 0xcc, 0xf0, 0x58,
790 0xf0, 0xe5, 0xf1, 0x72, 0xf1, 0xff, 0xf2, 0x8c, 0xf3, 0x19, 0xf3, 0xa7,
791 0xf4, 0x34, 0xf4, 0xc2, 0xf5, 0x50, 0xf5, 0xde, 0xf6, 0x6d, 0xf6, 0xfb,
792 0xf7, 0x8a, 0xf8, 0x19, 0xf8, 0xa8, 0xf9, 0x38, 0xf9, 0xc7, 0xfa, 0x57,
793 0xfa, 0xe7, 0xfb, 0x77, 0xfc, 0x07, 0xfc, 0x98, 0xfd, 0x29, 0xfd, 0xba,
794 0xfe, 0x4b, 0xfe, 0xdc, 0xff, 0x6d, 0xff, 0xff
803 assert(image != (
Image *) NULL);
815 const void *datum,
const size_t length,
ExceptionInfo *exception)
817 #define ProfileImageTag "Profile/Image"
818 #define ThrowProfileException(severity,tag,context) \
820 if (cms_context != (cmsContext) NULL) \
821 cmsDeleteContext(cms_context); \
822 if (source_profile != (cmsHPROFILE) NULL) \
823 (void) cmsCloseProfile(source_profile); \
824 if (target_profile != (cmsHPROFILE) NULL) \
825 (void) cmsCloseProfile(target_profile); \
826 ThrowBinaryException(severity,tag,context); \
835 assert(image != (
Image *) NULL);
839 assert(name != (
const char *) NULL);
840 if ((datum == (
const void *) NULL) || (length == 0))
874 if ((icc_profile != (
const StringInfo *) NULL) &&
894 if ((icc_profile != (
const StringInfo *) NULL) &&
900 #if !defined(MAGICKCORE_LCMS_DELEGATE)
918 cms_exception.
image=image;
920 cms_context=cmsCreateContext(NULL,&cms_exception);
921 if (cms_context == (cmsContext) NULL)
923 "ColorspaceColorProfileMismatch",name);
924 cmsSetLogErrorHandlerTHR(cms_context,CMSExceptionHandler);
925 source_profile=cmsOpenProfileFromMemTHR(cms_context,
928 if (source_profile == (cmsHPROFILE) NULL)
930 cmsDeleteContext(cms_context);
932 "ColorspaceColorProfileMismatch",name);
934 if ((cmsGetDeviceClass(source_profile) != cmsSigLinkClass) &&
946 cmsColorSpaceSignature
967 #if defined(LCMSHDRI)
983 target_profile=(cmsHPROFILE) NULL;
986 target_profile=source_profile;
987 source_profile=cmsOpenProfileFromMemTHR(cms_context,
990 if (source_profile == (cmsHPROFILE) NULL)
992 "ColorspaceColorProfileMismatch",name);
994 #if defined(LCMSHDRI)
999 switch (cmsGetColorSpace(source_profile))
1001 case cmsSigCmykData:
1005 #if defined(LCMSHDRI)
1006 source_type=(cmsUInt32Number) TYPE_CMYK_DBL;
1009 source_type=(cmsUInt32Number) TYPE_CMYK_16;
1013 case cmsSigGrayData:
1017 #if defined(LCMSHDRI)
1018 source_type=(cmsUInt32Number) TYPE_GRAY_DBL;
1020 source_type=(cmsUInt32Number) TYPE_GRAY_16;
1027 #if defined(LCMSHDRI)
1028 source_type=(cmsUInt32Number) TYPE_Lab_DBL;
1031 source_type=(cmsUInt32Number) TYPE_Lab_16;
1035 #if !defined(LCMSHDRI)
1039 source_type=(cmsUInt32Number) TYPE_YUV_16;
1046 #if defined(LCMSHDRI)
1047 source_type=(cmsUInt32Number) TYPE_RGB_DBL;
1049 source_type=(cmsUInt32Number) TYPE_RGB_16;
1056 #if defined(LCMSHDRI)
1057 source_type=(cmsUInt32Number) TYPE_XYZ_DBL;
1059 source_type=(cmsUInt32Number) TYPE_XYZ_16;
1063 #if !defined(LCMSHDRI)
1064 case cmsSigYCbCrData:
1067 source_type=(cmsUInt32Number) TYPE_YCbCr_16;
1073 "ColorspaceColorProfileMismatch",name);
1075 (void) source_colorspace;
1076 signature=cmsGetPCS(source_profile);
1077 if (target_profile != (cmsHPROFILE) NULL)
1078 signature=cmsGetColorSpace(target_profile);
1079 #if defined(LCMSHDRI)
1085 case cmsSigCmykData:
1089 #if defined(LCMSHDRI)
1090 target_type=(cmsUInt32Number) TYPE_CMYK_DBL;
1093 target_type=(cmsUInt32Number) TYPE_CMYK_16;
1097 case cmsSigGrayData:
1101 #if defined(LCMSHDRI)
1102 target_type=(cmsUInt32Number) TYPE_GRAY_DBL;
1104 target_type=(cmsUInt32Number) TYPE_GRAY_16;
1111 #if defined(LCMSHDRI)
1112 target_type=(cmsUInt32Number) TYPE_Lab_DBL;
1115 target_type=(cmsUInt32Number) TYPE_Lab_16;
1119 #if !defined(LCMSHDRI)
1123 target_type=(cmsUInt32Number) TYPE_YUV_16;
1130 #if defined(LCMSHDRI)
1131 target_type=(cmsUInt32Number) TYPE_RGB_DBL;
1133 target_type=(cmsUInt32Number) TYPE_RGB_16;
1140 #if defined(LCMSHDRI)
1141 target_type=(cmsUInt32Number) TYPE_XYZ_DBL;
1143 target_type=(cmsUInt32Number) TYPE_XYZ_16;
1147 #if !defined(LCMSHDRI)
1148 case cmsSigYCbCrData:
1151 target_type=(cmsUInt32Number) TYPE_YCbCr_16;
1157 "ColorspaceColorProfileMismatch",name);
1165 default: intent=INTENT_PERCEPTUAL;
break;
1167 flags=cmsFLAGS_HIGHRESPRECALC;
1168 #if defined(cmsFLAGS_BLACKPOINTCOMPENSATION)
1170 flags|=cmsFLAGS_BLACKPOINTCOMPENSATION;
1172 transform=AcquireTransformThreadSet(source_profile,source_type,
1173 target_profile,target_type,intent,flags,cms_context);
1174 if (transform == (cmsHTRANSFORM *) NULL)
1182 if ((source_pixels == (
LCMSType **) NULL) ||
1183 (target_pixels == (
LCMSType **) NULL))
1187 transform=DestroyTransformThreadSet(transform);
1189 "MemoryAllocationFailed",image->
filename);
1195 transform=DestroyTransformThreadSet(transform);
1196 if (source_profile != (cmsHPROFILE) NULL)
1197 (void) cmsCloseProfile(source_profile);
1198 if (target_profile != (cmsHPROFILE) NULL)
1199 (
void) cmsCloseProfile(target_profile);
1206 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1207 #pragma omp parallel for schedule(static) shared(status) \
1208 magick_number_threads(image,image,image->rows,1)
1210 for (y=0; y < (ssize_t) image->
rows; y++)
1236 p=source_pixels[id];
1237 for (x=0; x < (ssize_t) image->
columns; x++)
1240 if (source_channels > 1)
1245 if (source_channels > 3)
1249 cmsDoTransform(transform[
id],source_pixels[
id],target_pixels[
id],
1250 (
unsigned int) image->
columns);
1251 p=target_pixels[id];
1253 for (x=0; x < (ssize_t) image->
columns; x++)
1255 if (target_channels == 1)
1260 if (target_channels > 1)
1267 if (target_channels > 3)
1282 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1302 case cmsSigCmykData:
1308 case cmsSigGrayData:
1319 transform=DestroyTransformThreadSet(transform);
1321 (cmsGetDeviceClass(source_profile) != cmsSigLinkClass))
1323 if (target_profile != (cmsHPROFILE) NULL)
1324 (void) cmsCloseProfile(target_profile);
1326 (void) cmsCloseProfile(source_profile);
1327 cmsDeleteContext(cms_context);
1365 assert(image != (
Image *) NULL);
1403 assert(image != (
Image *) NULL);
1449 unsigned char *quantum)
1456 unsigned int *quantum)
1458 *quantum=(
unsigned int) (*p++) << 24;
1459 *quantum|=(
unsigned int) (*p++) << 16;
1460 *quantum|=(
unsigned int) (*p++) << 8;
1461 *quantum|=(
unsigned int) (*p++);
1466 unsigned short *quantum)
1468 *quantum=(
unsigned short) (*p++) << 8;
1469 *quantum|=(
unsigned short) (*p++);
1474 const unsigned int quantum)
1479 buffer[0]=(
unsigned char) (quantum >> 24);
1480 buffer[1]=(
unsigned char) (quantum >> 16);
1481 buffer[2]=(
unsigned char) (quantum >> 8);
1482 buffer[3]=(
unsigned char) quantum;
1483 (void) memcpy(p,buffer,4);
1493 register const unsigned char
1531 for (p=datum; p < (datum+length-16); )
1540 if (((length_byte+1) & 0x01) != 0)
1542 if (p > (datum+length-4))
1545 count=(ssize_t) value;
1546 if ((count & 0x01) != 0)
1548 if ((count < 0) || (p > (datum+length-count)) || (count > (ssize_t) length))
1550 if (
id != profile_id)
1565 extent=(datum+length)-(p+count);
1570 (void) memcpy(extract_profile->
datum,datum,offset);
1575 extract_extent=profile->
length;
1576 if ((extract_extent & 0x01) != 0)
1579 (void) memcpy(extract_profile->
datum,datum,offset-4);
1582 (void) memcpy(extract_profile->
datum+offset,
1585 (void) memcpy(extract_profile->
datum+offset+extract_extent,
1601 register const unsigned char
1624 for (p=datum; p < (datum+length-16); )
1632 if (((length_byte+1) & 0x01) != 0)
1634 if (p > (datum+length-4))
1637 count=(ssize_t) value;
1638 if ((p > (datum+length-count)) || (count > (ssize_t) length) || (count < 0))
1656 image->
resolution.
x=((double) resolution)/65536.0;
1659 image->
resolution.
y=((double) resolution)/65536.0;
1739 if ((count & 0x01) != 0)
1744 #if defined(MAGICKCORE_XML_DELEGATE)
1755 XML_PARSE_NOWARNING);
1756 if (document == (xmlDocPtr) NULL)
1758 xmlFreeDoc(document);
1768 if (p != (
char *) NULL)
1785 assert(image != (
Image *) NULL);
1793 "CorruptImageProfile",
"`%s'",name);
1862 unsigned char *buffer)
1878 value=(
unsigned short) buffer[1] << 8;
1879 value|=(
unsigned short) buffer[0];
1880 quantum.unsigned_value=value & 0xffff;
1881 return(quantum.signed_value);
1883 value=(
unsigned short) buffer[0] << 8;
1884 value|=(
unsigned short) buffer[1];
1885 quantum.unsigned_value=value & 0xffff;
1886 return(quantum.signed_value);
1890 unsigned char *buffer)
1906 value=(
unsigned int) buffer[3] << 24;
1907 value|=(
unsigned int) buffer[2] << 16;
1908 value|=(
unsigned int) buffer[1] << 8;
1909 value|=(
unsigned int) buffer[0];
1910 quantum.unsigned_value=value & 0xffffffff;
1911 return(quantum.signed_value);
1913 value=(
unsigned int) buffer[0] << 24;
1914 value|=(
unsigned int) buffer[1] << 16;
1915 value|=(
unsigned int) buffer[2] << 8;
1916 value|=(
unsigned int) buffer[3];
1917 quantum.unsigned_value=value & 0xffffffff;
1918 return(quantum.signed_value);
1949 const size_t value,
unsigned char *p)
1956 buffer[0]=(
unsigned char) value;
1957 buffer[1]=(
unsigned char) (value >> 8);
1958 buffer[2]=(
unsigned char) (value >> 16);
1959 buffer[3]=(
unsigned char) (value >> 24);
1960 (void) memcpy(p,buffer,4);
1963 buffer[0]=(
unsigned char) (value >> 24);
1964 buffer[1]=(
unsigned char) (value >> 16);
1965 buffer[2]=(
unsigned char) (value >> 8);
1966 buffer[3]=(
unsigned char) value;
1967 (void) memcpy(p,buffer,4);
1971 const unsigned short value,
unsigned char *p)
1978 buffer[0]=(
unsigned char) value;
1979 buffer[1]=(
unsigned char) (value >> 8);
1980 (void) memcpy(p,buffer,2);
1983 buffer[0]=(
unsigned char) (value >> 8);
1984 buffer[1]=(
unsigned char) value;
1985 (void) memcpy(p,buffer,2);
2018 if ((count >= (ssize_t) length) || (count < 0))
2022 if ((*p & 0x01) == 0)
2025 if ((count > (ssize_t) length) || (count < 0))
2027 if ((
id == 0x3ED) && (count == 16))
2052 #define MaxDirectoryStack 16
2053 #define EXIF_DELIMITER "\n"
2054 #define EXIF_NUM_FORMATS 12
2055 #define TAG_EXIF_OFFSET 0x8769
2056 #define TAG_INTEROP_OFFSET 0xa005
2058 typedef struct _DirectoryInfo
2087 format_bytes[] = {0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8};
2101 if ((
id != 0x4949) && (
id != 0x4D4D))
2137 if ((offset < 0) || ((size_t) offset >= length))
2139 directory=exif+offset;
2142 exif_resources=
NewSplayTree((
int (*)(
const void *,
const void *)) NULL,
2143 (
void *(*)(
void *)) NULL,(
void *(*)(
void *)) NULL);
2149 directory=directory_stack[level].directory;
2150 entry=directory_stack[level].entry;
2152 if ((directory < exif) || (directory > (exif+length-2)))
2158 for ( ; entry < number_entries; entry++)
2163 register unsigned char
2174 q=(
unsigned char *) (directory+2+(12*entry));
2175 if (q > (exif+length-12))
2187 number_bytes=(size_t) components*format_bytes[format];
2188 if ((ssize_t) number_bytes < components)
2190 if (number_bytes <= 4)
2198 if ((offset < 0) || ((size_t) (offset+number_bytes) > length))
2200 if (~length < number_bytes)
2202 p=(
unsigned char *) (exif+offset);
2209 if (number_bytes == 8)
2216 if (number_bytes == 8)
2222 if (number_bytes == 4)
2233 if (number_bytes == 4)
2249 directory_stack[level].directory=directory;
2251 directory_stack[level].entry=entry;
2253 directory_stack[level].directory=exif+offset;
2254 directory_stack[level].entry=0;
2256 if ((directory+2+(12*number_entries)) > (exif+length))
2260 if ((offset != 0) && ((size_t) offset < length) &&
2263 directory_stack[level].directory=exif+offset;
2264 directory_stack[level].entry=0;
2271 }
while (level > 0);
MagickExport CacheView * DestroyCacheView(CacheView *cache_view)
MagickExport int CompareStringInfo(const StringInfo *target, const StringInfo *source)
MagickExport MagickBooleanType IsOptionMember(const char *option, const char *options)
MagickExport MagickBooleanType AddValueToSplayTree(SplayTreeInfo *splay_tree, const void *key, const void *value)
MagickProgressMonitor progress_monitor
static signed int ReadProfileLong(const EndianType endian, unsigned char *buffer)
static Quantum GetPixelRed(const Image *magick_restrict image, const Quantum *magick_restrict pixel)
static MagickBooleanType SetImageProfileInternal(Image *, const char *, const StringInfo *, const MagickBooleanType, ExceptionInfo *)
MagickExport MagickBooleanType DeleteImageProfile(Image *image, const char *name)
static const unsigned char * ReadResourceByte(const unsigned char *p, unsigned char *quantum)
static void SetPixelGray(const Image *magick_restrict image, const Quantum gray, Quantum *magick_restrict pixel)
#define ThrowProfileException(severity, tag, context)
static void * DestroyProfile(void *profile)
struct _CMSExceptionInfo CMSExceptionInfo
MagickBooleanType SyncExifProfile(Image *image, StringInfo *profile)
MagickExport void DestroyImageProfiles(Image *image)
MagickExport ssize_t FormatLocaleString(char *magick_restrict string, const size_t length, const char *magick_restrict format,...)
MagickExport size_t CopyMagickString(char *magick_restrict destination, const char *magick_restrict source, const size_t length)
static void WriteProfileShort(const EndianType endian, const unsigned short value, unsigned char *p)
#define ThrowBinaryException(severity, tag, context)
#define MagickCoreSignature
MagickExport Quantum * GetCacheViewAuthenticPixels(CacheView *cache_view, const ssize_t x, const ssize_t y, const size_t columns, const size_t rows, ExceptionInfo *exception)
MagickExport unsigned char * GetStringInfoDatum(const StringInfo *string_info)
#define LCMSScaleTarget(pixel)
#define MaxDirectoryStack
MagickExport void LocaleLower(char *string)
static void WriteProfileLong(const EndianType endian, const size_t value, unsigned char *p)
MagickBooleanType black_point_compensation
static MagickBooleanType ValidateXMPProfile(const StringInfo *profile)
MagickExport StringInfo * DestroyStringInfo(StringInfo *string_info)
static void GetProfilesFromResourceBlock(Image *image, const StringInfo *resource_block, ExceptionInfo *exception)
MagickExport void * AcquireQuantumMemory(const size_t count, const size_t quantum)
MagickExport MagickBooleanType CloneImageProfiles(Image *image, const Image *clone_image)
MagickExport int LocaleNCompare(const char *p, const char *q, const size_t length)
static int GetOpenMPThreadId(void)
static signed short ReadProfileShort(const EndianType endian, unsigned char *buffer)
MagickExport const StringInfo * GetImageProfile(const Image *image, const char *name)
static MagickBooleanType SetsRGBImageProfile(Image *image, ExceptionInfo *exception)
MagickExport SplayTreeInfo * DestroySplayTree(SplayTreeInfo *splay_tree)
static Quantum GetPixelGreen(const Image *magick_restrict image, const Quantum *magick_restrict pixel)
static void WriteTo8BimProfile(Image *, const char *, const StringInfo *)
MagickExport SplayTreeInfo * NewSplayTree(int(*compare)(const void *, const void *), void *(*relinquish_key)(void *), void *(*relinquish_value)(void *))
static Quantum GetPixelBlack(const Image *magick_restrict image, const Quantum *magick_restrict pixel)
MagickExport MagickBooleanType ThrowMagickException(ExceptionInfo *exception, const char *module, const char *function, const size_t line, const ExceptionType severity, const char *tag, const char *format,...)
MagickExport MagickBooleanType LogMagickEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
MagickExport MagickSizeType GetMagickResourceLimit(const ResourceType type)
static DoublePixelPacket ** DestroyPixelThreadSet(DoublePixelPacket **pixels)
static const unsigned char * ReadResourceShort(const unsigned char *p, unsigned short *quantum)
static DoublePixelPacket ** AcquirePixelThreadSet(const size_t count)
#define LCMSScaleSource(pixel)
static void SetPixelBlue(const Image *magick_restrict image, const Quantum blue, Quantum *magick_restrict pixel)
MagickExport MagickBooleanType SetImageStorageClass(Image *image, const ClassType storage_class, ExceptionInfo *exception)
MagickExport StringInfo * RemoveImageProfile(Image *image, const char *name)
MagickExport const void * GetValueFromSplayTree(SplayTreeInfo *splay_tree, const void *key)
MagickExport char * GetNextImageProfile(const Image *image)
MagickExport StringInfo * AcquireStringInfo(const size_t length)
MagickExport MagickBooleanType SetImageProfile(Image *image, const char *name, const StringInfo *profile, ExceptionInfo *exception)
static MagickBooleanType Sync8BimProfile(Image *image, StringInfo *profile)
static size_t GetPixelChannels(const Image *magick_restrict image)
MagickExport int LocaleCompare(const char *p, const char *q)
char filename[MagickPathExtent]
MagickExport SplayTreeInfo * CloneSplayTree(SplayTreeInfo *splay_tree, void *(*clone_key)(void *), void *(*clone_value)(void *))
#define GetMagickModule()
MagickExport int CompareSplayTreeString(const void *target, const void *source)
RenderingIntent rendering_intent
MagickExport const void * GetNextKeyInSplayTree(SplayTreeInfo *splay_tree)
MagickExport MagickBooleanType SetImageColorspace(Image *image, const ColorspaceType colorspace, ExceptionInfo *exception)
MagickExport const char * GetImageProperty(const Image *image, const char *property, ExceptionInfo *exception)
static signed int ReadProfileMSBLong(unsigned char **p, size_t *length)
MagickExport void * RemoveNodeFromSplayTree(SplayTreeInfo *splay_tree, const void *key)
MagickExport MagickBooleanType DeleteNodeFromSplayTree(SplayTreeInfo *splay_tree, const void *key)
static void WriteResourceLong(unsigned char *p, const unsigned int quantum)
MagickPrivate MagickBooleanType SyncImageProfiles(Image *)
MagickExport void ResetSplayTreeIterator(SplayTreeInfo *splay_tree)
MagickExport void * RelinquishMagickMemory(void *memory)
#define magick_unreferenced(x)
MagickBooleanType(* MagickProgressMonitor)(const char *, const MagickOffsetType, const MagickSizeType, void *)
static int ReadProfileByte(unsigned char **p, size_t *length)
static void SetPixelRed(const Image *magick_restrict image, const Quantum red, Quantum *magick_restrict pixel)
MagickExport void ResetImageProfileIterator(const Image *image)
MagickExport MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *magick_restrict cache_view, ExceptionInfo *exception)
OrientationType orientation
MagickExport CacheView * AcquireAuthenticCacheView(const Image *image, ExceptionInfo *exception)
MagickExport MagickBooleanType ProfileImage(Image *image, const char *name, const void *datum, const size_t length, ExceptionInfo *exception)
static void SetPixelBlack(const Image *magick_restrict image, const Quantum black, Quantum *magick_restrict pixel)
static char * StringLocateSubstring(const char *haystack, const char *needle)
static Quantum GetPixelBlue(const Image *magick_restrict image, const Quantum *magick_restrict pixel)
#define TAG_INTEROP_OFFSET
MagickExport size_t GetStringInfoLength(const StringInfo *string_info)
static signed short ReadProfileMSBShort(unsigned char **p, size_t *length)
MagickExport char * ConstantString(const char *source)
static const unsigned char * ReadResourceLong(const unsigned char *p, unsigned int *quantum)
MagickExport StringInfo * CloneStringInfo(const StringInfo *string_info)
MagickExport MagickBooleanType SetImageProgress(const Image *image, const char *tag, const MagickOffsetType offset, const MagickSizeType extent)
MagickExport void SetStringInfoDatum(StringInfo *string_info, const unsigned char *source)
ExceptionInfo * exception
static void SetPixelGreen(const Image *magick_restrict image, const Quantum green, Quantum *magick_restrict pixel)