42 #include "MagickCore/studio.h"
43 #include "MagickCore/artifact.h"
44 #include "MagickCore/attribute.h"
45 #include "MagickCore/property.h"
46 #include "MagickCore/cache.h"
47 #include "MagickCore/cache-private.h"
48 #include "MagickCore/cache-view.h"
49 #include "MagickCore/color.h"
50 #include "MagickCore/color-private.h"
51 #include "MagickCore/colorspace.h"
52 #include "MagickCore/colorspace-private.h"
53 #include "MagickCore/exception.h"
54 #include "MagickCore/exception-private.h"
55 #include "MagickCore/enhance.h"
56 #include "MagickCore/image.h"
57 #include "MagickCore/image-private.h"
58 #include "MagickCore/gem.h"
59 #include "MagickCore/gem-private.h"
60 #include "MagickCore/memory_.h"
61 #include "MagickCore/monitor.h"
62 #include "MagickCore/monitor-private.h"
63 #include "MagickCore/option.h"
64 #include "MagickCore/pixel-accessor.h"
65 #include "MagickCore/quantize.h"
66 #include "MagickCore/quantum.h"
67 #include "MagickCore/quantum-private.h"
68 #include "MagickCore/resource_.h"
69 #include "MagickCore/string_.h"
70 #include "MagickCore/string-private.h"
71 #include "MagickCore/utility.h"
87 static MagickBooleanType
121 MagickExport ColorspaceType GetImageColorspaceType(
const Image *image,
130 assert(image != (
Image *) NULL);
131 assert(image->signature == MagickCoreSignature);
132 if (IsEventLogging() != MagickFalse)
133 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
134 colorspace=image->colorspace;
135 type=IdentifyImageType(image,exception);
136 if (IsGrayImageType(type))
137 colorspace=GRAYColorspace;
172 static inline void ConvertAdobe98ToRGB(
const double r,
const double g,
173 const double b,
double *red,
double *green,
double *blue)
180 ConvertAdobe98ToXYZ(r,g,b,&X,&Y,&Z);
181 ConvertXYZToRGB(X,Y,Z,red,green,blue);
184 static inline void ConvertDisplayP3ToRGB(
const double r,
const double g,
185 const double b,
double *red,
double *green,
double *blue)
192 ConvertDisplayP3ToXYZ(r,g,b,&X,&Y,&Z);
193 ConvertXYZToRGB(X,Y,Z,red,green,blue);
196 static inline void ConvertProPhotoToRGB(
const double r,
const double g,
197 const double b,
double *red,
double *green,
double *blue)
204 ConvertProPhotoToXYZ(r,g,b,&X,&Y,&Z);
205 ConvertXYZToRGB(X,Y,Z,red,green,blue);
208 static inline void ConvertRGBToCMY(
const double red,
const double green,
209 const double blue,
double *cyan,
double *magenta,
double *yellow)
211 *cyan=QuantumScale*(QuantumRange-red);
212 *magenta=QuantumScale*(QuantumRange-green);
213 *yellow=QuantumScale*(QuantumRange-blue);
216 static void ConvertRGBToAdobe98(
const double red,
const double green,
217 const double blue,
double *r,
double *g,
double *b)
224 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
225 ConvertXYZToAdobe98(X,Y,Z,r,g,b);
228 static void ConvertRGBToDisplayP3(
const double red,
const double green,
229 const double blue,
double *r,
double *g,
double *b)
236 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
237 ConvertXYZToDisplayP3(X,Y,Z,r,g,b);
240 static void ConvertRGBToProPhoto(
const double red,
const double green,
241 const double blue,
double *r,
double *g,
double *b)
248 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
249 ConvertXYZToProPhoto(X,Y,Z,r,g,b);
252 static inline void ConvertXYZToLMS(
const double x,
const double y,
253 const double z,
double *L,
double *M,
double *S)
255 *L=0.7328*x+0.4296*y-0.1624*z;
256 *M=(-0.7036*x+1.6975*y+0.0061*z);
257 *S=0.0030*x+0.0136*y+0.9834*z;
260 static void ConvertRGBToLMS(
const double red,
const double green,
261 const double blue,
double *L,
double *M,
double *S)
268 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
269 ConvertXYZToLMS(X,Y,Z,L,M,S);
272 static void ConvertRGBToLuv(
const double red,
const double green,
273 const double blue,
const IlluminantType illuminant,
double *L,
double *u,
281 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
282 ConvertXYZToLuv(X,Y,Z,illuminant,L,u,v);
285 static void ConvertRGBToxyY(
const double red,
const double green,
286 const double blue,
double *low_x,
double *low_y,
double *cap_Y)
294 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
295 gamma=PerceptibleReciprocal(X+Y+Z);
301 static void inline ConvertXYZToJzazbz(
const double X,
const double Y,
302 const double Z,
const double white_luminance,
double *Jz,
double *az,
double *bz)
304 #define Jzazbz_b 1.15
305 #define Jzazbz_g 0.66
306 #define Jzazbz_c1 (3424.0/4096.0)
307 #define Jzazbz_c2 (2413.0/128.0)
308 #define Jzazbz_c3 (2392.0/128.0)
309 #define Jzazbz_n (2610.0/16384.0)
310 #define Jzazbz_p (1.7*2523.0/32.0)
311 #define Jzazbz_d (-0.56)
312 #define Jzazbz_d0 (1.6295499532821566e-11)
327 Xp=(Jzazbz_b*X-Z*(Jzazbz_b-1));
328 Yp=(Jzazbz_g*Y-X*(Jzazbz_g-1));
330 L=0.41478972*Xp+0.579999*Yp+0.0146480*Zp;
331 M=(-0.2015100)*Xp+1.120649*Yp+0.0531008*Zp;
332 S=(-0.0166008)*Xp+0.264800*Yp+0.6684799*Zp;
333 gamma=pow(L*PerceptibleReciprocal(white_luminance),Jzazbz_n);
334 Lp=pow((Jzazbz_c1+Jzazbz_c2*gamma)/(1.0+Jzazbz_c3*gamma),Jzazbz_p);
335 gamma=pow(M*PerceptibleReciprocal(white_luminance),Jzazbz_n);
336 Mp=pow((Jzazbz_c1+Jzazbz_c2*gamma)/(1.0+Jzazbz_c3*gamma),Jzazbz_p);
337 gamma=pow(S*PerceptibleReciprocal(white_luminance),Jzazbz_n);
338 Sp=pow((Jzazbz_c1+Jzazbz_c2*gamma)/(1.0+Jzazbz_c3*gamma),Jzazbz_p);
340 *az=3.52400*Lp-4.066708*Mp+0.542708*Sp+0.5;
341 *bz=0.199076*Lp+1.096799*Mp-1.295875*Sp+0.5;
342 *Jz=((Jzazbz_d+1.0)*Iz)/(Jzazbz_d*Iz+1.0)-Jzazbz_d0;
345 static void inline ConvertJzazbzToXYZ(
const double Jz,
const double az,
346 const double bz,
const double white_luminance,
double *X,
double *Y,
double *Z)
364 Iz=gamma/(Jzazbz_d-Jzazbz_d*gamma+1.0);
367 Lp=Iz+0.138605043271539*azz+0.0580473161561189*bzz;
368 Mp=Iz-0.138605043271539*azz-0.0580473161561189*bzz;
369 Sp=Iz-0.0960192420263189*azz-0.811891896056039*bzz;
370 gamma=pow(Lp,1.0/Jzazbz_p);
371 L=white_luminance*pow((Jzazbz_c1-gamma)/(Jzazbz_c3*gamma-Jzazbz_c2),1.0/
373 gamma=pow(Mp,1.0/Jzazbz_p);
374 M=white_luminance*pow((Jzazbz_c1-gamma)/(Jzazbz_c3*gamma-Jzazbz_c2),1.0/
376 gamma=pow(Sp,1.0/Jzazbz_p);
377 S=white_luminance*pow((Jzazbz_c1-gamma)/(Jzazbz_c3*gamma-Jzazbz_c2),1.0/
379 Xp=1.92422643578761*L-1.00479231259537*M+0.037651404030618*S;
380 Yp=0.350316762094999*L+0.726481193931655*M-0.065384422948085*S;
381 Zp=(-0.0909828109828476)*L-0.312728290523074*M+1.52276656130526*S;
382 *X=(Xp+(Jzazbz_b-1.0)*Zp)/Jzazbz_b;
383 *Y=(Yp+(Jzazbz_g-1.0)**X)/Jzazbz_g;
387 static void ConvertRGBToJzazbz(
const double red,
const double green,
388 const double blue,
const double white_luminance,
double *Jz,
double *az,
396 ConvertRGBToXYZ(red,blue,green,&X,&Y,&Z);
397 ConvertXYZToJzazbz(X,Y,Z,white_luminance,Jz,az,bz);
400 static void ConvertJzazbzToRGB(
const double Jz,
const double az,
401 const double bz,
const double white_luminance,
double *red,
double *green,
409 ConvertJzazbzToXYZ(Jz,az,bz,white_luminance,&X,&Y,&Z);
410 ConvertXYZToRGB(X,Y,Z,red,blue,green);
413 static void ConvertRGBToYDbDr(
const double red,
const double green,
414 const double blue,
double *Y,
double *Db,
double *Dr)
416 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
417 *Db=QuantumScale*(-0.450*red-0.883*green+1.333*blue)+0.5;
418 *Dr=QuantumScale*(-1.333*red+1.116*green+0.217*blue)+0.5;
421 static void ConvertRGBToYIQ(
const double red,
const double green,
422 const double blue,
double *Y,
double *I,
double *Q)
424 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
425 *I=QuantumScale*(0.595716*red-0.274453*green-0.321263*blue)+0.5;
426 *Q=QuantumScale*(0.211456*red-0.522591*green+0.311135*blue)+0.5;
429 static void ConvertRGBToYPbPr(
const double red,
const double green,
430 const double blue,
double *Y,
double *Pb,
double *Pr)
432 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
433 *Pb=QuantumScale*((-0.1687367)*red-0.331264*green+0.5*blue)+0.5;
434 *Pr=QuantumScale*(0.5*red-0.418688*green-0.081312*blue)+0.5;
437 static void ConvertRGBToYCbCr(
const double red,
const double green,
438 const double blue,
double *Y,
double *Cb,
double *Cr)
440 ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr);
443 static void ConvertRGBToYUV(
const double red,
const double green,
444 const double blue,
double *Y,
double *U,
double *V)
446 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
447 *U=QuantumScale*((-0.147)*red-0.289*green+0.436*blue)+0.5;
448 *V=QuantumScale*(0.615*red-0.515*green-0.100*blue)+0.5;
451 static MagickBooleanType sRGBTransformImage(
Image *image,
454 #define sRGBTransformImageTag "RGBTransform/Image"
463 illuminant = D65Illuminant;
485 assert(image != (
Image *) NULL);
486 assert(image->signature == MagickCoreSignature);
487 assert(colorspace != sRGBColorspace);
488 assert(colorspace != TransparentColorspace);
489 assert(colorspace != UndefinedColorspace);
490 if (IsEventLogging() != MagickFalse)
491 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
492 artifact=GetImageArtifact(image,
"color:illuminant");
493 if (artifact != (
const char *) NULL)
495 illuminant=(IlluminantType) ParseCommandOption(MagickIlluminantOptions,
496 MagickFalse,artifact);
497 if ((ssize_t) illuminant < 0)
498 illuminant=UndefinedIlluminant;
512 if (image->storage_class == PseudoClass)
514 if (SyncImage(image,exception) == MagickFalse)
516 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
519 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
521 GetPixelInfo(image,&zero);
522 image_view=AcquireAuthenticCacheView(image,exception);
523 #if defined(MAGICKCORE_OPENMP_SUPPORT)
524 #pragma omp parallel for schedule(static) shared(status) \
525 magick_number_threads(image,image,image->rows,1)
527 for (y=0; y < (ssize_t) image->rows; y++)
541 if (status == MagickFalse)
543 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
545 if (q == (Quantum *) NULL)
551 for (x=0; x < (ssize_t) image->columns; x++)
553 GetPixelInfoPixel(image,q,&pixel);
554 ConvertRGBToCMYK(&pixel);
555 SetPixelViaPixelInfo(image,&pixel,q);
556 q+=GetPixelChannels(image);
558 sync=SyncCacheViewAuthenticPixels(image_view,exception);
559 if (sync == MagickFalse)
562 image_view=DestroyCacheView(image_view);
563 image->type=image->alpha_trait == UndefinedPixelTrait ?
564 ColorSeparationType : ColorSeparationAlphaType;
565 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
569 case LinearGRAYColorspace:
574 if (image->storage_class == PseudoClass)
576 if (SyncImage(image,exception) == MagickFalse)
578 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
581 image_view=AcquireAuthenticCacheView(image,exception);
582 #if defined(MAGICKCORE_OPENMP_SUPPORT)
583 #pragma omp parallel for schedule(static) shared(status) \
584 magick_number_threads(image,image,image->rows,1)
586 for (y=0; y < (ssize_t) image->rows; y++)
597 if (status == MagickFalse)
599 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
601 if (q == (Quantum *) NULL)
606 for (x=0; x < (ssize_t) image->columns; x++)
611 gray=0.212656*DecodePixelGamma(GetPixelRed(image,q))+0.715158*
612 DecodePixelGamma(GetPixelGreen(image,q))+0.072186*
613 DecodePixelGamma(GetPixelBlue(image,q));
614 SetPixelGray(image,ClampToQuantum(gray),q);
615 q+=GetPixelChannels(image);
617 sync=SyncCacheViewAuthenticPixels(image_view,exception);
618 if (sync == MagickFalse)
621 image_view=DestroyCacheView(image_view);
622 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
624 image->type=GrayscaleType;
632 if (image->storage_class == PseudoClass)
634 if (SyncImage(image,exception) == MagickFalse)
636 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
639 image_view=AcquireAuthenticCacheView(image,exception);
640 #if defined(MAGICKCORE_OPENMP_SUPPORT)
641 #pragma omp parallel for schedule(static) shared(status) \
642 magick_number_threads(image,image,image->rows,1)
644 for (y=0; y < (ssize_t) image->rows; y++)
655 if (status == MagickFalse)
657 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
659 if (q == (Quantum *) NULL)
664 for (x=0; x < (ssize_t) image->columns; x++)
669 gray=0.212656*GetPixelRed(image,q)+0.715158*GetPixelGreen(image,q)+
670 0.072186*GetPixelBlue(image,q);
671 SetPixelGray(image,ClampToQuantum(gray),q);
672 q+=GetPixelChannels(image);
674 sync=SyncCacheViewAuthenticPixels(image_view,exception);
675 if (sync == MagickFalse)
678 image_view=DestroyCacheView(image_view);
679 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
681 image->type=GrayscaleType;
685 case Adobe98Colorspace:
686 case DisplayP3Colorspace:
694 case JzazbzColorspace:
697 case LCHabColorspace:
698 case LCHuvColorspace:
701 case ProPhotoColorspace:
704 case YCbCrColorspace:
705 case YDbDrColorspace:
707 case YPbPrColorspace:
719 white_luminance=10000.0;
720 value=GetImageProperty(image,
"white-luminance",exception);
721 if (value != (
const char *) NULL)
722 white_luminance=StringToDouble(value,(
char **) NULL);
723 if (image->storage_class == PseudoClass)
725 if (SyncImage(image,exception) == MagickFalse)
727 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
730 image_view=AcquireAuthenticCacheView(image,exception);
731 #if defined(MAGICKCORE_OPENMP_SUPPORT)
732 #pragma omp parallel for schedule(static) shared(status) \
733 magick_number_threads(image,image,image->rows,1)
735 for (y=0; y < (ssize_t) image->rows; y++)
746 if (status == MagickFalse)
748 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
750 if (q == (Quantum *) NULL)
755 for (x=0; x < (ssize_t) image->columns; x++)
765 red=(double) GetPixelRed(image,q);
766 green=(double) GetPixelGreen(image,q);
767 blue=(double) GetPixelBlue(image,q);
770 case Adobe98Colorspace:
772 ConvertRGBToAdobe98(red,green,blue,&X,&Y,&Z);
777 ConvertRGBToCMY(red,green,blue,&X,&Y,&Z);
780 case DisplayP3Colorspace:
782 ConvertRGBToDisplayP3(red,green,blue,&X,&Y,&Z);
787 ConvertRGBToHCL(red,green,blue,&X,&Y,&Z);
792 ConvertRGBToHCLp(red,green,blue,&X,&Y,&Z);
797 ConvertRGBToHSB(red,green,blue,&X,&Y,&Z);
802 ConvertRGBToHSI(red,green,blue,&X,&Y,&Z);
807 ConvertRGBToHSL(red,green,blue,&X,&Y,&Z);
812 ConvertRGBToHSV(red,green,blue,&X,&Y,&Z);
817 ConvertRGBToHWB(red,green,blue,&X,&Y,&Z);
820 case JzazbzColorspace:
822 ConvertRGBToJzazbz(red,green,blue,white_luminance,&X,&Y,&Z);
827 ConvertRGBToLab(red,green,blue,illuminant,&X,&Y,&Z);
831 case LCHabColorspace:
833 ConvertRGBToLCHab(red,green,blue,illuminant,&X,&Y,&Z);
836 case LCHuvColorspace:
838 ConvertRGBToLCHuv(red,green,blue,illuminant,&X,&Y,&Z);
843 ConvertRGBToLMS(red,green,blue,&X,&Y,&Z);
848 ConvertRGBToLuv(red,green,blue,illuminant,&X,&Y,&Z);
851 case ProPhotoColorspace:
853 ConvertRGBToProPhoto(red,green,blue,&X,&Y,&Z);
858 ConvertRGBToxyY(red,green,blue,&X,&Y,&Z);
863 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
866 case YCbCrColorspace:
868 ConvertRGBToYCbCr(red,green,blue,&X,&Y,&Z);
871 case YDbDrColorspace:
873 ConvertRGBToYDbDr(red,green,blue,&X,&Y,&Z);
878 ConvertRGBToYIQ(red,green,blue,&X,&Y,&Z);
881 case YPbPrColorspace:
883 ConvertRGBToYPbPr(red,green,blue,&X,&Y,&Z);
888 ConvertRGBToYUV(red,green,blue,&X,&Y,&Z);
894 Y=QuantumScale*green;
899 SetPixelRed(image,ClampToQuantum(QuantumRange*X),q);
900 SetPixelGreen(image,ClampToQuantum(QuantumRange*Y),q);
901 SetPixelBlue(image,ClampToQuantum(QuantumRange*Z),q);
902 q+=GetPixelChannels(image);
904 sync=SyncCacheViewAuthenticPixels(image_view,exception);
905 if (sync == MagickFalse)
908 image_view=DestroyCacheView(image_view);
909 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
915 #define DisplayGamma (1.0/1.7)
916 #define FilmGamma 0.6
917 #define ReferenceBlack 95.0
918 #define ReferenceWhite 685.0
937 density=DisplayGamma;
939 value=GetImageProperty(image,
"gamma",exception);
940 if (value != (
const char *) NULL)
941 gamma=PerceptibleReciprocal(StringToDouble(value,(
char **) NULL));
942 film_gamma=FilmGamma;
943 value=GetImageProperty(image,
"film-gamma",exception);
944 if (value != (
const char *) NULL)
945 film_gamma=StringToDouble(value,(
char **) NULL);
946 reference_black=ReferenceBlack;
947 value=GetImageProperty(image,
"reference-black",exception);
948 if (value != (
const char *) NULL)
949 reference_black=StringToDouble(value,(
char **) NULL);
950 reference_white=ReferenceWhite;
951 value=GetImageProperty(image,
"reference-white",exception);
952 if (value != (
const char *) NULL)
953 reference_white=StringToDouble(value,(
char **) NULL);
954 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
956 if (logmap == (Quantum *) NULL)
957 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
959 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
960 PerceptibleReciprocal(film_gamma));
961 #if defined(MAGICKCORE_OPENMP_SUPPORT)
962 #pragma omp parallel for schedule(static)
964 for (i=0; i <= (ssize_t) MaxMap; i++)
965 logmap[i]=ScaleMapToQuantum((
double) (MaxMap*(reference_white+
966 log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002*
967 PerceptibleReciprocal(film_gamma)))/1024.0));
968 image_view=AcquireAuthenticCacheView(image,exception);
969 #if defined(MAGICKCORE_OPENMP_SUPPORT)
970 #pragma omp parallel for schedule(static) shared(status) \
971 magick_number_threads(image,image,image->rows,1)
973 for (y=0; y < (ssize_t) image->rows; y++)
984 if (status == MagickFalse)
986 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
988 if (q == (Quantum *) NULL)
993 for (x=(ssize_t) image->columns; x != 0; x--)
1000 red=(double) DecodePixelGamma((MagickRealType)
1001 GetPixelRed(image,q));
1002 green=(double) DecodePixelGamma((MagickRealType)
1003 GetPixelGreen(image,q));
1004 blue=(double) DecodePixelGamma((MagickRealType)
1005 GetPixelBlue(image,q));
1006 SetPixelRed(image,logmap[ScaleQuantumToMap(ClampToQuantum(red))],q);
1007 SetPixelGreen(image,logmap[ScaleQuantumToMap(ClampToQuantum(green))],
1009 SetPixelBlue(image,logmap[ScaleQuantumToMap(ClampToQuantum(blue))],q);
1010 q+=GetPixelChannels(image);
1012 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1013 if (sync == MagickFalse)
1016 image_view=DestroyCacheView(image_view);
1017 logmap=(Quantum *) RelinquishMagickMemory(logmap);
1018 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1019 return(MagickFalse);
1023 case scRGBColorspace:
1028 if (image->storage_class == PseudoClass)
1030 if (SyncImage(image,exception) == MagickFalse)
1031 return(MagickFalse);
1032 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1033 return(MagickFalse);
1035 image_view=AcquireAuthenticCacheView(image,exception);
1036 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1037 #pragma omp parallel for schedule(static) shared(status) \
1038 magick_number_threads(image,image,image->rows,1)
1040 for (y=0; y < (ssize_t) image->rows; y++)
1051 if (status == MagickFalse)
1053 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1055 if (q == (Quantum *) NULL)
1060 for (x=0; x < (ssize_t) image->columns; x++)
1067 red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q));
1068 green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q));
1069 blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q));
1070 SetPixelRed(image,ClampToQuantum(red),q);
1071 SetPixelGreen(image,ClampToQuantum(green),q);
1072 SetPixelBlue(image,ClampToQuantum(blue),q);
1073 q+=GetPixelChannels(image);
1075 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1076 if (sync == MagickFalse)
1079 image_view=DestroyCacheView(image_view);
1080 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1081 return(MagickFalse);
1106 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
1109 (void) memset(&primary_info,0,
sizeof(primary_info));
1112 case OHTAColorspace:
1124 primary_info.y=(double) (MaxMap+1.0)/2.0;
1125 primary_info.z=(double) (MaxMap+1.0)/2.0;
1126 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1127 #pragma omp parallel for schedule(static)
1129 for (i=0; i <= (ssize_t) MaxMap; i++)
1131 x_map[i].x=(MagickRealType) (0.33333*(
double) i);
1132 x_map[i].y=(MagickRealType) (0.50000*(
double) i);
1133 x_map[i].z=(MagickRealType) (-0.25000*(
double) i);
1134 y_map[i].x=(MagickRealType) (0.33334*(
double) i);
1135 y_map[i].y=(MagickRealType) (0.00000*(
double) i);
1136 y_map[i].z=(MagickRealType) (0.50000*(
double) i);
1137 z_map[i].x=(MagickRealType) (0.33333*(
double) i);
1138 z_map[i].y=(MagickRealType) (-0.50000*(
double) i);
1139 z_map[i].z=(MagickRealType) (-0.25000*(
double) i);
1143 case Rec601YCbCrColorspace:
1155 primary_info.y=(double) (MaxMap+1.0)/2.0;
1156 primary_info.z=(double) (MaxMap+1.0)/2.0;
1157 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1158 #pragma omp parallel for schedule(static)
1160 for (i=0; i <= (ssize_t) MaxMap; i++)
1162 x_map[i].x=(MagickRealType) (0.298839*(
double) i);
1163 x_map[i].y=(MagickRealType) (-0.1687367*(
double) i);
1164 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1165 y_map[i].x=(MagickRealType) (0.586811*(
double) i);
1166 y_map[i].y=(MagickRealType) (-0.331264*(
double) i);
1167 y_map[i].z=(MagickRealType) (-0.418688*(
double) i);
1168 z_map[i].x=(MagickRealType) (0.114350*(
double) i);
1169 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1170 z_map[i].z=(MagickRealType) (-0.081312*(
double) i);
1174 case Rec709YCbCrColorspace:
1186 primary_info.y=(double) (MaxMap+1.0)/2.0;
1187 primary_info.z=(double) (MaxMap+1.0)/2.0;
1188 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1189 #pragma omp parallel for schedule(static)
1191 for (i=0; i <= (ssize_t) MaxMap; i++)
1193 x_map[i].x=(MagickRealType) (0.212656*(
double) i);
1194 x_map[i].y=(MagickRealType) (-0.114572*(
double) i);
1195 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1196 y_map[i].x=(MagickRealType) (0.715158*(
double) i);
1197 y_map[i].y=(MagickRealType) (-0.385428*(
double) i);
1198 y_map[i].z=(MagickRealType) (-0.454153*(
double) i);
1199 z_map[i].x=(MagickRealType) (0.072186*(
double) i);
1200 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1201 z_map[i].z=(MagickRealType) (-0.045847*(
double) i);
1216 primary_info.y=(double) ScaleQuantumToMap(ScaleCharToQuantum(156));
1217 primary_info.z=(double) ScaleQuantumToMap(ScaleCharToQuantum(137));
1218 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
1220 x_map[i].x=0.005382*i;
1221 x_map[i].y=(-0.003296)*i;
1222 x_map[i].z=0.009410*i;
1223 y_map[i].x=0.010566*i;
1224 y_map[i].y=(-0.006471)*i;
1225 y_map[i].z=(-0.007880)*i;
1226 z_map[i].x=0.002052*i;
1227 z_map[i].y=0.009768*i;
1228 z_map[i].z=(-0.001530)*i;
1230 for ( ; i <= (ssize_t) MaxMap; i++)
1232 x_map[i].x=0.298839*(1.099*i-0.099);
1233 x_map[i].y=(-0.298839)*(1.099*i-0.099);
1234 x_map[i].z=0.70100*(1.099*i-0.099);
1235 y_map[i].x=0.586811*(1.099*i-0.099);
1236 y_map[i].y=(-0.586811)*(1.099*i-0.099);
1237 y_map[i].z=(-0.586811)*(1.099*i-0.099);
1238 z_map[i].x=0.114350*(1.099*i-0.099);
1239 z_map[i].y=0.88600*(1.099*i-0.099);
1240 z_map[i].z=(-0.114350)*(1.099*i-0.099);
1249 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1250 #pragma omp parallel for schedule(static)
1252 for (i=0; i <= (ssize_t) MaxMap; i++)
1254 x_map[i].x=(MagickRealType) (1.0*(
double) i);
1255 x_map[i].y=(MagickRealType) 0.0;
1256 x_map[i].z=(MagickRealType) 0.0;
1257 y_map[i].x=(MagickRealType) 0.0;
1258 y_map[i].y=(MagickRealType) (1.0*(
double) i);
1259 y_map[i].z=(MagickRealType) 0.0;
1260 z_map[i].x=(MagickRealType) 0.0;
1261 z_map[i].y=(MagickRealType) 0.0;
1262 z_map[i].z=(MagickRealType) (1.0*(
double) i);
1270 switch (image->storage_class)
1278 image_view=AcquireAuthenticCacheView(image,exception);
1279 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1280 #pragma omp parallel for schedule(static) shared(status) \
1281 magick_number_threads(image,image,image->rows,1)
1283 for (y=0; y < (ssize_t) image->rows; y++)
1302 if (status == MagickFalse)
1304 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1306 if (q == (Quantum *) NULL)
1311 for (x=0; x < (ssize_t) image->columns; x++)
1313 red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1314 GetPixelRed(image,q)));
1315 green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1316 GetPixelGreen(image,q)));
1317 blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1318 GetPixelBlue(image,q)));
1319 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1321 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1323 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1325 SetPixelRed(image,ScaleMapToQuantum(pixel.red),q);
1326 SetPixelGreen(image,ScaleMapToQuantum(pixel.green),q);
1327 SetPixelBlue(image,ScaleMapToQuantum(pixel.blue),q);
1328 q+=GetPixelChannels(image);
1330 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1331 if (sync == MagickFalse)
1333 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1338 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1342 proceed=SetImageProgress(image,sRGBTransformImageTag,progress,
1344 if (proceed == MagickFalse)
1348 image_view=DestroyCacheView(image_view);
1361 for (i=0; i < (ssize_t) image->colors; i++)
1366 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
1367 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
1368 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
1369 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1370 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1371 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1372 image->colormap[i].red=(double) ScaleMapToQuantum(pixel.red);
1373 image->colormap[i].green=(double) ScaleMapToQuantum(pixel.green);
1374 image->colormap[i].blue=(double) ScaleMapToQuantum(pixel.blue);
1376 (void) SyncImage(image,exception);
1386 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1387 return(MagickFalse);
1418 MagickExport MagickBooleanType SetImageColorspace(
Image *image,
1427 assert(image != (
Image *) NULL);
1428 assert(image->signature == MagickCoreSignature);
1430 assert(exception->signature == MagickCoreSignature);
1431 if (IsEventLogging() != MagickFalse)
1432 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1433 if (image->colorspace == colorspace)
1435 image->colorspace=colorspace;
1436 image->rendering_intent=UndefinedIntent;
1437 image->gamma=1.000/2.200;
1438 (void) memset(&image->chromaticity,0,
sizeof(image->chromaticity));
1440 if (IsGrayColorspace(colorspace) != MagickFalse)
1442 if (colorspace == LinearGRAYColorspace)
1447 if ((IsRGBColorspace(colorspace) != MagickFalse) ||
1448 (colorspace == XYZColorspace) || (colorspace == xyYColorspace))
1452 image->rendering_intent=PerceptualIntent;
1453 image->chromaticity.red_primary.x=0.6400;
1454 image->chromaticity.red_primary.y=0.3300;
1455 image->chromaticity.red_primary.z=0.0300;
1456 image->chromaticity.green_primary.x=0.3000;
1457 image->chromaticity.green_primary.y=0.6000;
1458 image->chromaticity.green_primary.z=0.1000;
1459 image->chromaticity.blue_primary.x=0.1500;
1460 image->chromaticity.blue_primary.y=0.0600;
1461 image->chromaticity.blue_primary.z=0.7900;
1462 image->chromaticity.white_point.x=0.3127;
1463 image->chromaticity.white_point.y=0.3290;
1464 image->chromaticity.white_point.z=0.3583;
1466 status=SyncImagePixelCache(image,exception);
1498 MagickExport MagickBooleanType SetImageGray(
Image *image,
1507 assert(image != (
Image *) NULL);
1508 assert(image->signature == MagickCoreSignature);
1509 if (IsEventLogging() != MagickFalse)
1510 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1511 if (IsImageGray(image) != MagickFalse)
1513 if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1514 return(MagickFalse);
1515 value=GetImageProperty(image,
"colorspace:auto-grayscale",exception);
1516 if (IsStringFalse(value) != MagickFalse)
1517 return(MagickFalse);
1518 type=IdentifyImageGray(image,exception);
1519 if (type == UndefinedType)
1520 return(MagickFalse);
1521 image->colorspace=GRAYColorspace;
1522 if (SyncImagePixelCache(image,exception) == MagickFalse)
1523 return(MagickFalse);
1555 MagickExport MagickBooleanType SetImageMonochrome(
Image *image,
1561 assert(image != (
Image *) NULL);
1562 assert(image->signature == MagickCoreSignature);
1563 if (IsEventLogging() != MagickFalse)
1564 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1565 if (IsImageMonochrome(image) != MagickFalse)
1567 if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1568 return(MagickFalse);
1569 is_bilevel=IdentifyImageMonochrome(image,exception);
1570 if (is_bilevel == MagickFalse)
1571 return(MagickFalse);
1572 image->colorspace=GRAYColorspace;
1573 if (SyncImagePixelCache((
Image *) image,exception) == MagickFalse)
1574 return(MagickFalse);
1575 image->type=BilevelType;
1607 MagickExport MagickBooleanType TransformImageColorspace(
Image *image,
1613 assert(image != (
Image *) NULL);
1614 assert(image->signature == MagickCoreSignature);
1615 if (IsEventLogging() != MagickFalse)
1616 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1617 if (image->colorspace == colorspace)
1618 return(SetImageColorspace(image,colorspace,exception));
1619 (void) DeleteImageProfile(image,
"icc");
1620 (void) DeleteImageProfile(image,
"icm");
1621 if (colorspace == UndefinedColorspace)
1622 return(SetImageColorspace(image,colorspace,exception));
1626 if (IssRGBColorspace(colorspace) != MagickFalse)
1627 return(TransformsRGBImage(image,exception));
1629 if (IssRGBColorspace(image->colorspace) == MagickFalse)
1630 status=TransformsRGBImage(image,exception);
1631 if (status == MagickFalse)
1636 if (sRGBTransformImage(image,colorspace,exception) == MagickFalse)
1670 static inline void ConvertCMYToRGB(
const double cyan,
const double magenta,
1671 const double yellow,
double *red,
double *green,
double *blue)
1673 *red=QuantumRange*(1.0-cyan);
1674 *green=QuantumRange*(1.0-magenta);
1675 *blue=QuantumRange*(1.0-yellow);
1678 static inline void ConvertLMSToXYZ(
const double L,
const double M,
const double S,
1679 double *X,
double *Y,
double *Z)
1681 *X=1.096123820835514*L-0.278869000218287*M+0.182745179382773*S;
1682 *Y=0.454369041975359*L+0.473533154307412*M+0.072097803717229*S;
1683 *Z=(-0.009627608738429)*L-0.005698031216113*M+1.015325639954543*S;
1686 static inline void ConvertLMSToRGB(
const double L,
const double M,
1687 const double S,
double *red,
double *green,
double *blue)
1694 ConvertLMSToXYZ(L,M,S,&X,&Y,&Z);
1695 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1698 static inline void ConvertLuvToRGB(
const double L,
const double u,
1699 const double v,
const IlluminantType illuminant,
double *red,
double *green,
1707 ConvertLuvToXYZ(100.0*L,354.0*u-134.0,262.0*v-140.0,illuminant,&X,&Y,&Z);
1708 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1711 static inline ssize_t RoundToYCC(
const double value)
1715 if (value >= 1388.0)
1717 return((ssize_t) (value+0.5));
1720 static inline void ConvertLabToRGB(
const double L,
const double a,
1721 const double b,
const IlluminantType illuminant,
double *red,
double *green,
1729 ConvertLabToXYZ(100.0*L,255.0*(a-0.5),255.0*(b-0.5),illuminant,&X,&Y,&Z);
1730 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1733 static inline void ConvertxyYToRGB(
const double low_x,
const double low_y,
1734 const double cap_Y,
double *red,
double *green,
double *blue)
1742 gamma=PerceptibleReciprocal(low_y);
1743 X=gamma*cap_Y*low_x;
1745 Z=gamma*cap_Y*(1.0-low_x-low_y);
1746 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1749 static void ConvertYPbPrToRGB(
const double Y,
const double Pb,
const double Pr,
1750 double *red,
double *green,
double *blue)
1752 *red=QuantumRange*(0.99999999999914679361*Y-1.2188941887145875e-06*(Pb-0.5)+
1753 1.4019995886561440468*(Pr-0.5));
1754 *green=QuantumRange*(0.99999975910502514331*Y-0.34413567816504303521*(Pb-0.5)-
1755 0.71413649331646789076*(Pr-0.5));
1756 *blue=QuantumRange*(1.00000124040004623180*Y+1.77200006607230409200*(Pb-0.5)+
1757 2.1453384174593273e-06*(Pr-0.5));
1760 static void ConvertYCbCrToRGB(
const double Y,
const double Cb,
1761 const double Cr,
double *red,
double *green,
double *blue)
1763 ConvertYPbPrToRGB(Y,Cb,Cr,red,green,blue);
1766 static void ConvertYIQToRGB(
const double Y,
const double I,
const double Q,
1767 double *red,
double *green,
double *blue)
1769 *red=QuantumRange*(Y+0.9562957197589482261*(I-0.5)+0.6210244164652610754*
1771 *green=QuantumRange*(Y-0.2721220993185104464*(I-0.5)-0.6473805968256950427*
1773 *blue=QuantumRange*(Y-1.1069890167364901945*(I-0.5)+1.7046149983646481374*
1777 static void ConvertYDbDrToRGB(
const double Y,
const double Db,
const double Dr,
1778 double *red,
double *green,
double *blue)
1780 *red=QuantumRange*(Y+9.2303716147657e-05*(Db-0.5)-
1781 0.52591263066186533*(Dr-0.5));
1782 *green=QuantumRange*(Y-0.12913289889050927*(Db-0.5)+
1783 0.26789932820759876*(Dr-0.5));
1784 *blue=QuantumRange*(Y+0.66467905997895482*(Db-0.5)-
1785 7.9202543533108e-05*(Dr-0.5));
1788 static void ConvertYUVToRGB(
const double Y,
const double U,
const double V,
1789 double *red,
double *green,
double *blue)
1791 *red=QuantumRange*(Y-3.945707070708279e-05*(U-0.5)+1.1398279671717170825*
1793 *green=QuantumRange*(Y-0.3946101641414141437*(U-0.5)-0.5805003156565656797*
1795 *blue=QuantumRange*(Y+2.0319996843434342537*(U-0.5)-4.813762626262513e-04*
1799 static MagickBooleanType TransformsRGBImage(
Image *image,
1802 #define TransformsRGBImageTag "Transform/Image"
1807 0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1808 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1809 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1810 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1811 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1812 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1813 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1814 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1815 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1816 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1817 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1818 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1819 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1820 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1821 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1822 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1823 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1824 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1825 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1826 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1827 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1828 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1829 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1830 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1831 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1832 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1833 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1834 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1835 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1836 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1837 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1838 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1839 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1840 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1841 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1842 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1843 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1844 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1845 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1846 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1847 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1848 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1849 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1850 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1851 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1852 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1853 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1854 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1855 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1856 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1857 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1858 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1859 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1860 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1861 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1862 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1863 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1864 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1865 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1866 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1867 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1868 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1869 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1870 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1871 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1872 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1873 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1874 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1875 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1876 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1877 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1878 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1879 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1880 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1881 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1882 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1883 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1884 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1885 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1886 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1887 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1888 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1889 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1890 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1891 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1892 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1893 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1894 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1895 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1896 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1897 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1898 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1899 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1900 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1901 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1902 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1903 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1904 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1905 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1906 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1907 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1908 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1909 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1910 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1911 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1912 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1913 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1914 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1915 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1916 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1917 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1918 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1919 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1920 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1921 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1922 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1923 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1924 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1925 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1926 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1927 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1928 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1929 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1930 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1931 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1932 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1933 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1934 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1935 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1936 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1937 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1938 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1939 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1940 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1941 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1942 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1943 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1944 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1945 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1946 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1947 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1948 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1949 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1950 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1951 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1952 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1953 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1954 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1955 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1956 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1957 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1958 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1959 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1960 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1961 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1962 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1963 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1964 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1965 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1966 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1967 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1968 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1969 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1970 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
1971 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
1972 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
1973 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
1974 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
1975 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
1976 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
1977 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
1978 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
1979 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
1980 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
1981 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
1982 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
1983 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
1984 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
1985 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
1986 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
1987 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
1988 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
1989 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
1990 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
1991 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
1992 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
1993 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
1994 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
1995 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
1996 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
1997 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
1998 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
1999 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
2000 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
2001 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
2002 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
2003 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
2004 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
2005 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
2006 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
2007 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
2008 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
2009 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
2010 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
2011 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
2012 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
2013 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
2014 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
2015 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
2016 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
2017 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
2018 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
2019 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
2020 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
2021 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
2022 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
2023 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
2024 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
2025 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
2026 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
2027 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
2028 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
2029 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
2030 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
2031 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
2032 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
2033 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
2034 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
2035 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
2036 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
2037 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
2038 0.998559f, 0.999280f, 1.000000f
2048 illuminant = D65Illuminant;
2067 assert(image != (
Image *) NULL);
2068 assert(image->signature == MagickCoreSignature);
2069 if (IsEventLogging() != MagickFalse)
2070 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2071 artifact=GetImageArtifact(image,
"color:illuminant");
2072 if (artifact != (
const char *) NULL)
2074 illuminant=(IlluminantType) ParseCommandOption(MagickIlluminantOptions,
2075 MagickFalse,artifact);
2076 if ((ssize_t) illuminant < 0)
2077 illuminant=UndefinedIlluminant;
2081 switch (image->colorspace)
2083 case CMYKColorspace:
2091 if (image->storage_class == PseudoClass)
2093 if (SyncImage(image,exception) == MagickFalse)
2094 return(MagickFalse);
2095 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2096 return(MagickFalse);
2098 GetPixelInfo(image,&zero);
2099 image_view=AcquireAuthenticCacheView(image,exception);
2100 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2101 #pragma omp parallel for schedule(static) shared(status) \
2102 magick_number_threads(image,image,image->rows,1)
2104 for (y=0; y < (ssize_t) image->rows; y++)
2118 if (status == MagickFalse)
2120 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2122 if (q == (Quantum *) NULL)
2128 for (x=0; x < (ssize_t) image->columns; x++)
2130 GetPixelInfoPixel(image,q,&pixel);
2131 ConvertCMYKToRGB(&pixel);
2132 SetPixelViaPixelInfo(image,&pixel,q);
2133 q+=GetPixelChannels(image);
2135 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2136 if (sync == MagickFalse)
2139 image_view=DestroyCacheView(image_view);
2140 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2141 return(MagickFalse);
2144 case LinearGRAYColorspace:
2149 if (image->storage_class == PseudoClass)
2151 if (SyncImage(image,exception) == MagickFalse)
2152 return(MagickFalse);
2153 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2154 return(MagickFalse);
2156 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2157 return(MagickFalse);
2158 image_view=AcquireAuthenticCacheView(image,exception);
2159 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2160 #pragma omp parallel for schedule(static) shared(status) \
2161 magick_number_threads(image,image,image->rows,1)
2163 for (y=0; y < (ssize_t) image->rows; y++)
2174 if (status == MagickFalse)
2176 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2178 if (q == (Quantum *) NULL)
2183 for (x=(ssize_t) image->columns; x != 0; x--)
2188 gray=0.212656*EncodePixelGamma(GetPixelRed(image,q))+0.715158*
2189 EncodePixelGamma(GetPixelGreen(image,q))+0.072186*
2190 EncodePixelGamma(GetPixelBlue(image,q));
2191 SetPixelRed(image,ClampToQuantum(gray),q);
2192 SetPixelGreen(image,ClampToQuantum(gray),q);
2193 SetPixelBlue(image,ClampToQuantum(gray),q);
2194 q+=GetPixelChannels(image);
2196 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2197 if (sync == MagickFalse)
2200 image_view=DestroyCacheView(image_view);
2201 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2202 return(MagickFalse);
2205 case GRAYColorspace:
2210 if (image->storage_class == PseudoClass)
2212 if (SyncImage(image,exception) == MagickFalse)
2213 return(MagickFalse);
2214 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2215 return(MagickFalse);
2217 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2218 return(MagickFalse);
2219 image_view=AcquireAuthenticCacheView(image,exception);
2220 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2221 #pragma omp parallel for schedule(static) shared(status) \
2222 magick_number_threads(image,image,image->rows,1)
2224 for (y=0; y < (ssize_t) image->rows; y++)
2235 if (status == MagickFalse)
2237 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2239 if (q == (Quantum *) NULL)
2244 for (x=(ssize_t) image->columns; x != 0; x--)
2249 gray=0.212656*GetPixelRed(image,q)+0.715158*GetPixelGreen(image,q)+
2250 0.072186*GetPixelBlue(image,q);
2251 SetPixelRed(image,ClampToQuantum(gray),q);
2252 SetPixelGreen(image,ClampToQuantum(gray),q);
2253 SetPixelBlue(image,ClampToQuantum(gray),q);
2254 q+=GetPixelChannels(image);
2256 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2257 if (sync == MagickFalse)
2260 image_view=DestroyCacheView(image_view);
2261 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2262 return(MagickFalse);
2265 case Adobe98Colorspace:
2267 case DisplayP3Colorspace:
2269 case HCLpColorspace:
2275 case JzazbzColorspace:
2278 case LCHabColorspace:
2279 case LCHuvColorspace:
2282 case ProPhotoColorspace:
2285 case YCbCrColorspace:
2286 case YDbDrColorspace:
2288 case YPbPrColorspace:
2300 white_luminance=10000.0;
2301 value=GetImageProperty(image,
"white-luminance",exception);
2302 if (value != (
const char *) NULL)
2303 white_luminance=StringToDouble(value,(
char **) NULL);
2304 if (image->storage_class == PseudoClass)
2306 if (SyncImage(image,exception) == MagickFalse)
2307 return(MagickFalse);
2308 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2309 return(MagickFalse);
2311 image_view=AcquireAuthenticCacheView(image,exception);
2312 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2313 #pragma omp parallel for schedule(static) shared(status) \
2314 magick_number_threads(image,image,image->rows,1)
2316 for (y=0; y < (ssize_t) image->rows; y++)
2327 if (status == MagickFalse)
2329 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2331 if (q == (Quantum *) NULL)
2336 for (x=0; x < (ssize_t) image->columns; x++)
2346 X=QuantumScale*GetPixelRed(image,q);
2347 Y=QuantumScale*GetPixelGreen(image,q);
2348 Z=QuantumScale*GetPixelBlue(image,q);
2349 switch (image->colorspace)
2351 case Adobe98Colorspace:
2353 ConvertAdobe98ToRGB(X,Y,Z,&red,&green,&blue);
2358 ConvertCMYToRGB(X,Y,Z,&red,&green,&blue);
2361 case DisplayP3Colorspace:
2363 ConvertDisplayP3ToRGB(X,Y,Z,&red,&green,&blue);
2368 ConvertHCLToRGB(X,Y,Z,&red,&green,&blue);
2371 case HCLpColorspace:
2373 ConvertHCLpToRGB(X,Y,Z,&red,&green,&blue);
2378 ConvertHSBToRGB(X,Y,Z,&red,&green,&blue);
2383 ConvertHSIToRGB(X,Y,Z,&red,&green,&blue);
2388 ConvertHSLToRGB(X,Y,Z,&red,&green,&blue);
2393 ConvertHSVToRGB(X,Y,Z,&red,&green,&blue);
2398 ConvertHWBToRGB(X,Y,Z,&red,&green,&blue);
2401 case JzazbzColorspace:
2403 ConvertJzazbzToRGB(X,Y,Z,white_luminance,&red,&green,&blue);
2408 ConvertLabToRGB(X,Y,Z,illuminant,&red,&green,&blue);
2412 case LCHabColorspace:
2414 ConvertLCHabToRGB(X,Y,Z,illuminant,&red,&green,&blue);
2417 case LCHuvColorspace:
2419 ConvertLCHuvToRGB(X,Y,Z,illuminant,&red,&green,&blue);
2424 ConvertLMSToRGB(X,Y,Z,&red,&green,&blue);
2429 ConvertLuvToRGB(X,Y,Z,illuminant,&red,&green,&blue);
2432 case ProPhotoColorspace:
2434 ConvertProPhotoToRGB(X,Y,Z,&red,&green,&blue);
2439 ConvertxyYToRGB(X,Y,Z,&red,&green,&blue);
2444 ConvertXYZToRGB(X,Y,Z,&red,&green,&blue);
2447 case YCbCrColorspace:
2449 ConvertYCbCrToRGB(X,Y,Z,&red,&green,&blue);
2452 case YDbDrColorspace:
2454 ConvertYDbDrToRGB(X,Y,Z,&red,&green,&blue);
2459 ConvertYIQToRGB(X,Y,Z,&red,&green,&blue);
2462 case YPbPrColorspace:
2464 ConvertYPbPrToRGB(X,Y,Z,&red,&green,&blue);
2469 ConvertYUVToRGB(X,Y,Z,&red,&green,&blue);
2475 green=QuantumRange*Y;
2476 blue=QuantumRange*Z;
2480 SetPixelRed(image,ClampToQuantum(red),q);
2481 SetPixelGreen(image,ClampToQuantum(green),q);
2482 SetPixelBlue(image,ClampToQuantum(blue),q);
2483 q+=GetPixelChannels(image);
2485 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2486 if (sync == MagickFalse)
2489 image_view=DestroyCacheView(image_view);
2490 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2491 return(MagickFalse);
2513 density=DisplayGamma;
2515 value=GetImageProperty(image,
"gamma",exception);
2516 if (value != (
const char *) NULL)
2517 gamma=PerceptibleReciprocal(StringToDouble(value,(
char **) NULL));
2518 film_gamma=FilmGamma;
2519 value=GetImageProperty(image,
"film-gamma",exception);
2520 if (value != (
const char *) NULL)
2521 film_gamma=StringToDouble(value,(
char **) NULL);
2522 reference_black=ReferenceBlack;
2523 value=GetImageProperty(image,
"reference-black",exception);
2524 if (value != (
const char *) NULL)
2525 reference_black=StringToDouble(value,(
char **) NULL);
2526 reference_white=ReferenceWhite;
2527 value=GetImageProperty(image,
"reference-white",exception);
2528 if (value != (
const char *) NULL)
2529 reference_white=StringToDouble(value,(
char **) NULL);
2530 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2532 if (logmap == (Quantum *) NULL)
2533 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2535 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
2536 PerceptibleReciprocal(film_gamma));
2537 for (i=0; i <= (ssize_t) (reference_black*MaxMap/1024.0); i++)
2538 logmap[i]=(Quantum) 0;
2539 for ( ; i < (ssize_t) (reference_white*MaxMap/1024.0); i++)
2540 logmap[i]=ClampToQuantum(QuantumRange/(1.0-black)*
2541 (pow(10.0,(1024.0*i/MaxMap-reference_white)*(gamma/density)*0.002*
2542 PerceptibleReciprocal(film_gamma))-black));
2543 for ( ; i <= (ssize_t) MaxMap; i++)
2544 logmap[i]=QuantumRange;
2545 if (image->storage_class == PseudoClass)
2547 if (SyncImage(image,exception) == MagickFalse)
2548 return(MagickFalse);
2549 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2550 return(MagickFalse);
2552 image_view=AcquireAuthenticCacheView(image,exception);
2553 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2554 #pragma omp parallel for schedule(static) shared(status) \
2555 magick_number_threads(image,image,image->rows,1)
2557 for (y=0; y < (ssize_t) image->rows; y++)
2568 if (status == MagickFalse)
2570 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2572 if (q == (Quantum *) NULL)
2577 for (x=(ssize_t) image->columns; x != 0; x--)
2584 red=(double) logmap[ScaleQuantumToMap(GetPixelRed(image,q))];
2585 green=(double) logmap[ScaleQuantumToMap(GetPixelGreen(image,q))];
2586 blue=(double) logmap[ScaleQuantumToMap(GetPixelBlue(image,q))];
2587 SetPixelRed(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2589 SetPixelGreen(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2591 SetPixelBlue(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2593 q+=GetPixelChannels(image);
2595 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2596 if (sync == MagickFalse)
2599 image_view=DestroyCacheView(image_view);
2600 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2601 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2602 return(MagickFalse);
2606 case scRGBColorspace:
2611 if (image->storage_class == PseudoClass)
2613 if (SyncImage(image,exception) == MagickFalse)
2614 return(MagickFalse);
2615 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2616 return(MagickFalse);
2618 image_view=AcquireAuthenticCacheView(image,exception);
2619 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2620 #pragma omp parallel for schedule(static) shared(status) \
2621 magick_number_threads(image,image,image->rows,1)
2623 for (y=0; y < (ssize_t) image->rows; y++)
2634 if (status == MagickFalse)
2636 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2638 if (q == (Quantum *) NULL)
2643 for (x=(ssize_t) image->columns; x != 0; x--)
2650 red=EncodePixelGamma((MagickRealType) GetPixelRed(image,q));
2651 green=EncodePixelGamma((MagickRealType) GetPixelGreen(image,q));
2652 blue=EncodePixelGamma((MagickRealType) GetPixelBlue(image,q));
2653 SetPixelRed(image,ClampToQuantum(red),q);
2654 SetPixelGreen(image,ClampToQuantum(green),q);
2655 SetPixelBlue(image,ClampToQuantum(blue),q);
2656 q+=GetPixelChannels(image);
2658 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2659 if (sync == MagickFalse)
2662 image_view=DestroyCacheView(image_view);
2663 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2664 return(MagickFalse);
2689 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2692 switch (image->colorspace)
2694 case OHTAColorspace:
2709 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2710 #pragma omp parallel for schedule(static)
2712 for (i=0; i <= (ssize_t) MaxMap; i++)
2714 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2715 y_map[i].x=(MagickRealType) (0.5*1.00000*(2.0*(
double) i-MaxMap));
2716 z_map[i].x=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2717 x_map[i].y=(MagickRealType) (1.0*(
double) i);
2718 y_map[i].y=(MagickRealType) (0.5*0.00000*(2.0*(
double) i-MaxMap));
2719 z_map[i].y=(MagickRealType) (0.5*1.33333*(2.0*(
double) i-MaxMap));
2720 x_map[i].z=(MagickRealType) (1.0*(
double) i);
2721 y_map[i].z=(MagickRealType) (-0.5*1.00000*(2.0*(
double) i-MaxMap));
2722 z_map[i].z=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2726 case Rec601YCbCrColorspace:
2738 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2739 #pragma omp parallel for schedule(static)
2741 for (i=0; i <= (ssize_t) MaxMap; i++)
2743 x_map[i].x=0.99999999999914679361*(double) i;
2744 y_map[i].x=0.5*(-1.2188941887145875e-06)*(2.00*(
double) i-MaxMap);
2745 z_map[i].x=0.5*1.4019995886561440468*(2.00*(double) i-MaxMap);
2746 x_map[i].y=0.99999975910502514331*(double) i;
2747 y_map[i].y=0.5*(-0.34413567816504303521)*(2.00*(
double) i-MaxMap);
2748 z_map[i].y=0.5*(-0.71413649331646789076)*(2.00*(
double) i-MaxMap);
2749 x_map[i].z=1.00000124040004623180*(double) i;
2750 y_map[i].z=0.5*1.77200006607230409200*(2.00*(double) i-MaxMap);
2751 z_map[i].z=0.5*2.1453384174593273e-06*(2.00*(double) i-MaxMap);
2755 case Rec709YCbCrColorspace:
2767 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2768 #pragma omp parallel for schedule(static)
2770 for (i=0; i <= (ssize_t) MaxMap; i++)
2772 x_map[i].x=(MagickRealType) (1.0*i);
2773 y_map[i].x=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2774 z_map[i].x=(MagickRealType) (0.5*1.574800*(2.0*i-MaxMap));
2775 x_map[i].y=(MagickRealType) (1.0*i);
2776 y_map[i].y=(MagickRealType) (0.5*(-0.187324)*(2.0*i-MaxMap));
2777 z_map[i].y=(MagickRealType) (0.5*(-0.468124)*(2.0*i-MaxMap));
2778 x_map[i].z=(MagickRealType) (1.0*i);
2779 y_map[i].z=(MagickRealType) (0.5*1.855600*(2.0*i-MaxMap));
2780 z_map[i].z=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2795 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2796 #pragma omp parallel for schedule(static)
2798 for (i=0; i <= (ssize_t) MaxMap; i++)
2800 x_map[i].x=(MagickRealType) (1.3584000*(
double) i);
2801 y_map[i].x=(MagickRealType) 0.0000000;
2802 z_map[i].x=(MagickRealType) (1.8215000*(1.0*(
double) i-(double)
2803 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2804 x_map[i].y=(MagickRealType) (1.3584000*(
double) i);
2805 y_map[i].y=(MagickRealType) (-0.4302726*(1.0*(
double) i-(double)
2806 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2807 z_map[i].y=(MagickRealType) (-0.9271435*(1.0*(
double) i-(double)
2808 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2809 x_map[i].z=(MagickRealType) (1.3584000*(
double) i);
2810 y_map[i].z=(MagickRealType) (2.2179000*(1.0*(
double) i-(double)
2811 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2812 z_map[i].z=(MagickRealType) 0.0000000;
2821 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2822 #pragma omp parallel for schedule(static)
2824 for (i=0; i <= (ssize_t) MaxMap; i++)
2826 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2827 y_map[i].x=(MagickRealType) 0.0;
2828 z_map[i].x=(MagickRealType) 0.0;
2829 x_map[i].y=(MagickRealType) 0.0;
2830 y_map[i].y=(MagickRealType) (1.0*(
double) i);
2831 z_map[i].y=(MagickRealType) 0.0;
2832 x_map[i].z=(MagickRealType) 0.0;
2833 y_map[i].z=(MagickRealType) 0.0;
2834 z_map[i].z=(MagickRealType) (1.0*(
double) i);
2842 switch (image->storage_class)
2850 image_view=AcquireAuthenticCacheView(image,exception);
2851 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2852 #pragma omp parallel for schedule(static) shared(status) \
2853 magick_number_threads(image,image,image->rows,1)
2855 for (y=0; y < (ssize_t) image->rows; y++)
2869 if (status == MagickFalse)
2871 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2873 if (q == (Quantum *) NULL)
2878 for (x=0; x < (ssize_t) image->columns; x++)
2885 red=ScaleQuantumToMap(GetPixelRed(image,q));
2886 green=ScaleQuantumToMap(GetPixelGreen(image,q));
2887 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
2888 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2889 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2890 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2891 if (image->colorspace == YCCColorspace)
2893 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
2895 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
2897 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
2902 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2903 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2904 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2906 SetPixelRed(image,ClampToQuantum(pixel.red),q);
2907 SetPixelGreen(image,ClampToQuantum(pixel.green),q);
2908 SetPixelBlue(image,ClampToQuantum(pixel.blue),q);
2909 q+=GetPixelChannels(image);
2911 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2912 if (sync == MagickFalse)
2914 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2919 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2923 proceed=SetImageProgress(image,TransformsRGBImageTag,progress,
2925 if (proceed == MagickFalse)
2929 image_view=DestroyCacheView(image_view);
2937 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2938 #pragma omp parallel for schedule(static) shared(status) \
2939 magick_number_threads(image,image,image->rows,1)
2941 for (i=0; i < (ssize_t) image->colors; i++)
2951 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
2952 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
2953 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
2954 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2955 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2956 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2957 if (image->colorspace == YCCColorspace)
2959 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
2961 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
2963 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
2968 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2969 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2970 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2972 image->colormap[i].red=(double) ClampToQuantum(pixel.red);
2973 image->colormap[i].green=(double) ClampToQuantum(pixel.green);
2974 image->colormap[i].blue=(double) ClampToQuantum(pixel.blue);
2976 (void) SyncImage(image,exception);
2986 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2987 return(MagickFalse);