42 #include "magick/studio.h"
43 #include "magick/attribute.h"
44 #include "magick/cache.h"
45 #include "magick/cache-private.h"
46 #include "magick/cache-view.h"
47 #include "magick/color.h"
48 #include "magick/color-private.h"
49 #include "magick/colorspace.h"
50 #include "magick/colorspace-private.h"
51 #include "magick/exception.h"
52 #include "magick/exception-private.h"
53 #include "magick/enhance.h"
54 #include "magick/image.h"
55 #include "magick/image-private.h"
56 #include "magick/gem.h"
57 #include "magick/gem-private.h"
58 #include "magick/memory_.h"
59 #include "magick/monitor.h"
60 #include "magick/monitor-private.h"
61 #include "magick/pixel-private.h"
62 #include "magick/property.h"
63 #include "magick/quantize.h"
64 #include "magick/quantum.h"
65 #include "magick/resource_.h"
66 #include "magick/string_.h"
67 #include "magick/string-private.h"
68 #include "magick/utility.h"
112 MagickExport ColorspaceType GetImageColorspaceType(
const Image *image,
121 assert(image != (
Image *) NULL);
122 assert(image->signature == MagickCoreSignature);
123 if (IsEventLogging() != MagickFalse)
124 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
125 colorspace=image->colorspace;
126 type=IdentifyImageType(image,exception);
127 if ((type == BilevelType) || (type == GrayscaleType) ||
128 (type == GrayscaleMatteType))
129 colorspace=GRAYColorspace;
162 static inline void ConvertRGBToCMY(
const Quantum red,
const Quantum green,
163 const Quantum blue,
double *cyan,
double *magenta,
double *yellow)
165 *cyan=QuantumScale*(QuantumRange-red);
166 *magenta=QuantumScale*(QuantumRange-green);
167 *yellow=QuantumScale*(QuantumRange-blue);
170 static void ConvertRGBToLab(
const Quantum red,
const Quantum green,
171 const Quantum blue,
double *L,
double *a,
double *b)
178 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
179 ConvertXYZToLab(X,Y,Z,L,a,b);
182 static inline void ConvertXYZToLMS(
const double x,
const double y,
183 const double z,
double *L,
double *M,
double *S)
185 *L=0.7328*x+0.4296*y-0.1624*z;
186 *M=(-0.7036*x+1.6975*y+0.0061*z);
187 *S=0.0030*x+0.0136*y+0.9834*z;
190 static void ConvertRGBToLMS(
const Quantum red,
const Quantum green,
191 const Quantum blue,
double *L,
double *M,
double *S)
198 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
199 ConvertXYZToLMS(X,Y,Z,L,M,S);
202 static void ConvertRGBToLuv(
const Quantum red,
const Quantum green,
203 const Quantum blue,
double *L,
double *u,
double *v)
210 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
211 ConvertXYZToLuv(X,Y,Z,L,u,v);
214 static void ConvertRGBToxyY(
const Quantum red,
const Quantum green,
215 const Quantum blue,
double *low_x,
double *low_y,
double *cap_Y)
223 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
224 gamma=PerceptibleReciprocal(X+Y+Z);
230 static void ConvertRGBToYPbPr(
const Quantum red,
const Quantum green,
231 const Quantum blue,
double *Y,
double *Pb,
double *Pr)
233 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
234 *Pb=QuantumScale*((-0.1687367)*red-0.331264*green+0.5*blue)+0.5;
235 *Pr=QuantumScale*(0.5*red-0.418688*green-0.081312*blue)+0.5;
238 static void ConvertRGBToYCbCr(
const Quantum red,
const Quantum green,
239 const Quantum blue,
double *Y,
double *Cb,
double *Cr)
241 ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr);
244 static void ConvertRGBToYUV(
const Quantum red,
const Quantum green,
245 const Quantum blue,
double *Y,
double *U,
double *V)
247 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
248 *U=QuantumScale*((-0.147)*red-0.289*green+0.436*blue)+0.5;
249 *V=QuantumScale*(0.615*red-0.515*green-0.100*blue)+0.5;
252 static void ConvertRGBToYDbDr(
const Quantum red,
const Quantum green,
253 const Quantum blue,
double *Y,
double *Db,
double *Dr)
255 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
256 *Db=QuantumScale*(-0.450*red-0.883*green+1.333*blue)+0.5;
257 *Dr=QuantumScale*(-1.333*red+1.116*green+0.217*blue)+0.5;
260 static void ConvertRGBToYIQ(
const Quantum red,
const Quantum green,
261 const Quantum blue,
double *Y,
double *I,
double *Q)
263 *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
264 *I=QuantumScale*(0.595716*red-0.274453*green-0.321263*blue)+0.5;
265 *Q=QuantumScale*(0.211456*red-0.522591*green+0.311135*blue)+0.5;
268 MagickExport MagickBooleanType RGBTransformImage(
Image *image,
269 const ColorspaceType colorspace)
271 #define RGBTransformImageTag "RGBTransform/Image"
299 assert(image != (
Image *) NULL);
300 assert(image->signature == MagickCoreSignature);
301 assert(colorspace != sRGBColorspace);
302 assert(colorspace != TransparentColorspace);
303 assert(colorspace != UndefinedColorspace);
304 if (IsEventLogging() != MagickFalse)
305 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
308 exception=(&image->exception);
319 if (image->storage_class == PseudoClass)
321 if (SyncImage(image) == MagickFalse)
323 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
326 if (SetImageColorspace(image,colorspace) == MagickFalse)
328 GetMagickPixelPacket(image,&zero);
329 image_view=AcquireAuthenticCacheView(image,exception);
330 #if defined(MAGICKCORE_OPENMP_SUPPORT)
331 #pragma omp parallel for schedule(static) shared(status) \
332 magick_number_threads(image,image,image->rows,1)
334 for (y=0; y < (ssize_t) image->rows; y++)
343 *magick_restrict indexes;
351 if (status == MagickFalse)
353 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
360 indexes=GetCacheViewAuthenticIndexQueue(image_view);
362 for (x=0; x < (ssize_t) image->columns; x++)
364 SetMagickPixelPacket(image,q,indexes+x,&pixel);
365 pixel.red=(MagickRealType) pixel.red;
366 pixel.green=(MagickRealType) pixel.green;
367 pixel.blue=(MagickRealType) pixel.blue;
368 ConvertRGBToCMYK(&pixel);
369 SetPixelPacket(image,&pixel,q,indexes+x);
372 sync=SyncCacheViewAuthenticPixels(image_view,exception);
373 if (sync == MagickFalse)
376 image_view=DestroyCacheView(image_view);
377 image->type=image->matte == MagickFalse ? ColorSeparationType :
378 ColorSeparationMatteType;
379 if (SetImageColorspace(image,colorspace) == MagickFalse)
383 case LinearGRAYColorspace:
388 if (image->storage_class == PseudoClass)
390 if (SyncImage(image) == MagickFalse)
392 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
395 image_view=AcquireAuthenticCacheView(image,exception);
396 #if defined(MAGICKCORE_OPENMP_SUPPORT)
397 #pragma omp parallel for schedule(static) shared(status) \
398 magick_number_threads(image,image,image->rows,1)
400 for (y=0; y < (ssize_t) image->rows; y++)
411 if (status == MagickFalse)
413 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
420 for (x=0; x < (ssize_t) image->columns; x++)
425 gray=0.212656*DecodePixelGamma(GetPixelRed(q))+0.715158*
426 DecodePixelGamma(GetPixelGreen(q))+0.072186*
427 DecodePixelGamma(GetPixelBlue(q));
428 SetPixelGray(q,ClampToQuantum(gray));
431 sync=SyncCacheViewAuthenticPixels(image_view,exception);
432 if (sync == MagickFalse)
435 image_view=DestroyCacheView(image_view);
436 if (SetImageColorspace(image,colorspace) == MagickFalse)
438 image->type=GrayscaleType;
446 if (image->storage_class == PseudoClass)
448 if (SyncImage(image) == MagickFalse)
450 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
453 image_view=AcquireAuthenticCacheView(image,exception);
454 #if defined(MAGICKCORE_OPENMP_SUPPORT)
455 #pragma omp parallel for schedule(static) shared(status) \
456 magick_number_threads(image,image,image->rows,1)
458 for (y=0; y < (ssize_t) image->rows; y++)
469 if (status == MagickFalse)
471 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
478 for (x=0; x < (ssize_t) image->columns; x++)
483 gray=0.212656*GetPixelRed(q)+0.715158*GetPixelGreen(q)+
484 0.072186*GetPixelBlue(q);
485 SetPixelGray(q,ClampToQuantum(gray));
488 sync=SyncCacheViewAuthenticPixels(image_view,exception);
489 if (sync == MagickFalse)
492 image_view=DestroyCacheView(image_view);
493 if (SetImageColorspace(image,colorspace) == MagickFalse)
495 image->type=GrayscaleType;
508 case LCHabColorspace:
509 case LCHuvColorspace:
514 case YCbCrColorspace:
515 case YDbDrColorspace:
517 case YPbPrColorspace:
523 if (image->storage_class == PseudoClass)
525 if (SyncImage(image) == MagickFalse)
527 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
530 image_view=AcquireAuthenticCacheView(image,exception);
531 #if defined(MAGICKCORE_OPENMP_SUPPORT)
532 #pragma omp parallel for schedule(static) shared(status) \
533 magick_number_threads(image,image,image->rows,1)
535 for (y=0; y < (ssize_t) image->rows; y++)
546 if (status == MagickFalse)
548 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
555 for (x=0; x < (ssize_t) image->columns; x++)
567 red=ClampToQuantum((MagickRealType) GetPixelRed(q));
568 green=ClampToQuantum((MagickRealType) GetPixelGreen(q));
569 blue=ClampToQuantum((MagickRealType) GetPixelBlue(q));
574 ConvertRGBToCMY(red,green,blue,&X,&Y,&Z);
579 ConvertRGBToHCL(red,green,blue,&X,&Y,&Z);
584 ConvertRGBToHCLp(red,green,blue,&X,&Y,&Z);
589 ConvertRGBToHSB(red,green,blue,&X,&Y,&Z);
594 ConvertRGBToHSI(red,green,blue,&X,&Y,&Z);
599 ConvertRGBToHSL(red,green,blue,&X,&Y,&Z);
604 ConvertRGBToHSV(red,green,blue,&X,&Y,&Z);
609 ConvertRGBToHWB(red,green,blue,&X,&Y,&Z);
614 ConvertRGBToLab(red,green,blue,&X,&Y,&Z);
618 case LCHabColorspace:
620 ConvertRGBToLCHab(red,green,blue,&X,&Y,&Z);
623 case LCHuvColorspace:
625 ConvertRGBToLCHuv(red,green,blue,&X,&Y,&Z);
630 ConvertRGBToLMS(red,green,blue,&X,&Y,&Z);
635 ConvertRGBToLuv(red,green,blue,&X,&Y,&Z);
640 ConvertRGBToxyY(red,green,blue,&X,&Y,&Z);
645 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
648 case YCbCrColorspace:
650 ConvertRGBToYCbCr(red,green,blue,&X,&Y,&Z);
653 case YDbDrColorspace:
655 ConvertRGBToYDbDr(red,green,blue,&X,&Y,&Z);
660 ConvertRGBToYIQ(red,green,blue,&X,&Y,&Z);
663 case YPbPrColorspace:
665 ConvertRGBToYPbPr(red,green,blue,&X,&Y,&Z);
670 ConvertRGBToYUV(red,green,blue,&X,&Y,&Z);
676 Y=QuantumScale*green;
681 SetPixelRed(q,ClampToQuantum((MagickRealType) QuantumRange*X));
682 SetPixelGreen(q,ClampToQuantum((MagickRealType) QuantumRange*Y));
683 SetPixelBlue(q,ClampToQuantum((MagickRealType) QuantumRange*Z));
686 sync=SyncCacheViewAuthenticPixels(image_view,exception);
687 if (sync == MagickFalse)
690 image_view=DestroyCacheView(image_view);
691 if (SetImageColorspace(image,colorspace) == MagickFalse)
697 #define DisplayGamma (1.0/1.7)
698 #define FilmGamma 0.6
699 #define ReferenceBlack 95.0
700 #define ReferenceWhite 685.0
719 density=DisplayGamma;
721 value=GetImageProperty(image,
"gamma");
722 if (value != (
const char *) NULL)
723 gamma=PerceptibleReciprocal(StringToDouble(value,(
char **) NULL));
724 film_gamma=FilmGamma;
725 value=GetImageProperty(image,
"film-gamma");
726 if (value != (
const char *) NULL)
727 film_gamma=StringToDouble(value,(
char **) NULL);
728 reference_black=ReferenceBlack;
729 value=GetImageProperty(image,
"reference-black");
730 if (value != (
const char *) NULL)
731 reference_black=StringToDouble(value,(
char **) NULL);
732 reference_white=ReferenceWhite;
733 value=GetImageProperty(image,
"reference-white");
734 if (value != (
const char *) NULL)
735 reference_white=StringToDouble(value,(
char **) NULL);
736 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
738 if (logmap == (Quantum *) NULL)
739 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
741 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
742 PerceptibleReciprocal(film_gamma));
743 #if defined(MAGICKCORE_OPENMP_SUPPORT)
744 #pragma omp parallel for schedule(static)
746 for (i=0; i <= (ssize_t) MaxMap; i++)
747 logmap[i]=ScaleMapToQuantum((MagickRealType) (MaxMap*(reference_white+
748 log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002*
749 PerceptibleReciprocal(film_gamma)))/1024.0));
750 image_view=AcquireAuthenticCacheView(image,exception);
751 #if defined(MAGICKCORE_OPENMP_SUPPORT)
752 #pragma omp parallel for schedule(static) shared(status) \
753 magick_number_threads(image,image,image->rows,1)
755 for (y=0; y < (ssize_t) image->rows; y++)
766 if (status == MagickFalse)
768 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
775 for (x=(ssize_t) image->columns; x != 0; x--)
782 red=ClampToQuantum(DecodePixelGamma((MagickRealType)
784 green=ClampToQuantum(DecodePixelGamma((MagickRealType)
786 blue=ClampToQuantum(DecodePixelGamma((MagickRealType)
788 SetPixelRed(q,logmap[ScaleQuantumToMap(red)]);
789 SetPixelGreen(q,logmap[ScaleQuantumToMap(green)]);
790 SetPixelBlue(q,logmap[ScaleQuantumToMap(blue)]);
793 sync=SyncCacheViewAuthenticPixels(image_view,exception);
794 if (sync == MagickFalse)
797 image_view=DestroyCacheView(image_view);
798 logmap=(Quantum *) RelinquishMagickMemory(logmap);
799 if (SetImageColorspace(image,colorspace) == MagickFalse)
804 case scRGBColorspace:
809 if (image->storage_class == PseudoClass)
811 if (SyncImage(image) == MagickFalse)
813 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
816 image_view=AcquireAuthenticCacheView(image,exception);
817 #if defined(MAGICKCORE_OPENMP_SUPPORT)
818 #pragma omp parallel for schedule(static) shared(status) \
819 magick_number_threads(image,image,image->rows,1)
821 for (y=0; y < (ssize_t) image->rows; y++)
832 if (status == MagickFalse)
834 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
841 for (x=0; x < (ssize_t) image->columns; x++)
848 red=ClampToQuantum(DecodePixelGamma((MagickRealType)
850 green=ClampToQuantum(DecodePixelGamma((MagickRealType)
852 blue=ClampToQuantum(DecodePixelGamma((MagickRealType)
855 SetPixelGreen(q,green);
856 SetPixelBlue(q,blue);
859 sync=SyncCacheViewAuthenticPixels(image_view,exception);
860 if (sync == MagickFalse)
863 image_view=DestroyCacheView(image_view);
864 if (SetImageColorspace(image,colorspace) == MagickFalse)
890 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
893 (void) memset(&primary_info,0,
sizeof(primary_info));
908 primary_info.y=(double) (MaxMap+1.0)/2.0;
909 primary_info.z=(double) (MaxMap+1.0)/2.0;
910 #if defined(MAGICKCORE_OPENMP_SUPPORT)
911 #pragma omp parallel for schedule(static)
913 for (i=0; i <= (ssize_t) MaxMap; i++)
915 x_map[i].x=(MagickRealType) (0.33333*(
double) i);
916 x_map[i].y=(MagickRealType) (0.50000*(
double) i);
917 x_map[i].z=(MagickRealType) (-0.25000*(
double) i);
918 y_map[i].x=(MagickRealType) (0.33334*(
double) i);
919 y_map[i].y=(MagickRealType) (0.00000*(
double) i);
920 y_map[i].z=(MagickRealType) (0.50000*(
double) i);
921 z_map[i].x=(MagickRealType) (0.33333*(
double) i);
922 z_map[i].y=(MagickRealType) (-0.50000*(
double) i);
923 z_map[i].z=(MagickRealType) (-0.25000*(
double) i);
927 case Rec601LumaColorspace:
934 #if defined(MAGICKCORE_OPENMP_SUPPORT)
935 #pragma omp parallel for schedule(static)
937 for (i=0; i <= (ssize_t) MaxMap; i++)
939 x_map[i].x=(MagickRealType) (0.298839*(
double) i);
940 x_map[i].y=(MagickRealType) (0.298839*(
double) i);
941 x_map[i].z=(MagickRealType) (0.298839*(
double) i);
942 y_map[i].x=(MagickRealType) (0.586811*(
double) i);
943 y_map[i].y=(MagickRealType) (0.586811*(
double) i);
944 y_map[i].z=(MagickRealType) (0.586811*(
double) i);
945 z_map[i].x=(MagickRealType) (0.114350*(
double) i);
946 z_map[i].y=(MagickRealType) (0.114350*(
double) i);
947 z_map[i].z=(MagickRealType) (0.114350*(
double) i);
951 case Rec601YCbCrColorspace:
963 primary_info.y=(double) (MaxMap+1.0)/2.0;
964 primary_info.z=(double) (MaxMap+1.0)/2.0;
965 #if defined(MAGICKCORE_OPENMP_SUPPORT)
966 #pragma omp parallel for schedule(static)
968 for (i=0; i <= (ssize_t) MaxMap; i++)
970 x_map[i].x=(MagickRealType) (0.298839*(
double) i);
971 x_map[i].y=(MagickRealType) (-0.1687367*(
double) i);
972 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
973 y_map[i].x=(MagickRealType) (0.586811*(
double) i);
974 y_map[i].y=(MagickRealType) (-0.331264*(
double) i);
975 y_map[i].z=(MagickRealType) (-0.418688*(
double) i);
976 z_map[i].x=(MagickRealType) (0.114350*(
double) i);
977 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
978 z_map[i].z=(MagickRealType) (-0.081312*(
double) i);
982 case Rec709LumaColorspace:
989 #if defined(MAGICKCORE_OPENMP_SUPPORT)
990 #pragma omp parallel for schedule(static)
992 for (i=0; i <= (ssize_t) MaxMap; i++)
994 x_map[i].x=(MagickRealType) (0.212656*(
double) i);
995 x_map[i].y=(MagickRealType) (0.212656*(
double) i);
996 x_map[i].z=(MagickRealType) (0.212656*(
double) i);
997 y_map[i].x=(MagickRealType) (0.715158*(
double) i);
998 y_map[i].y=(MagickRealType) (0.715158*(
double) i);
999 y_map[i].z=(MagickRealType) (0.715158*(
double) i);
1000 z_map[i].x=(MagickRealType) (0.072186*(
double) i);
1001 z_map[i].y=(MagickRealType) (0.072186*(
double) i);
1002 z_map[i].z=(MagickRealType) (0.072186*(
double) i);
1006 case Rec709YCbCrColorspace:
1018 primary_info.y=(double) (MaxMap+1.0)/2.0;
1019 primary_info.z=(double) (MaxMap+1.0)/2.0;
1020 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1021 #pragma omp parallel for schedule(static)
1023 for (i=0; i <= (ssize_t) MaxMap; i++)
1025 x_map[i].x=(MagickRealType) (0.212656*(
double) i);
1026 x_map[i].y=(MagickRealType) (-0.114572*(
double) i);
1027 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1028 y_map[i].x=(MagickRealType) (0.715158*(
double) i);
1029 y_map[i].y=(MagickRealType) (-0.385428*(
double) i);
1030 y_map[i].z=(MagickRealType) (-0.454153*(
double) i);
1031 z_map[i].x=(MagickRealType) (0.072186*(
double) i);
1032 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1033 z_map[i].z=(MagickRealType) (-0.045847*(
double) i);
1048 primary_info.y=(double) ScaleQuantumToMap(ScaleCharToQuantum(156));
1049 primary_info.z=(double) ScaleQuantumToMap(ScaleCharToQuantum(137));
1050 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
1052 x_map[i].x=0.005382*i;
1053 x_map[i].y=(-0.003296)*i;
1054 x_map[i].z=0.009410*i;
1055 y_map[i].x=0.010566*i;
1056 y_map[i].y=(-0.006471)*i;
1057 y_map[i].z=(-0.007880)*i;
1058 z_map[i].x=0.002052*i;
1059 z_map[i].y=0.009768*i;
1060 z_map[i].z=(-0.001530)*i;
1062 for ( ; i <= (ssize_t) MaxMap; i++)
1064 x_map[i].x=0.298839*(1.099*i-0.099);
1065 x_map[i].y=(-0.298839)*(1.099*i-0.099);
1066 x_map[i].z=0.70100*(1.099*i-0.099);
1067 y_map[i].x=0.586811*(1.099*i-0.099);
1068 y_map[i].y=(-0.586811)*(1.099*i-0.099);
1069 y_map[i].z=(-0.586811)*(1.099*i-0.099);
1070 z_map[i].x=0.114350*(1.099*i-0.099);
1071 z_map[i].y=0.88600*(1.099*i-0.099);
1072 z_map[i].z=(-0.114350)*(1.099*i-0.099);
1081 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1082 #pragma omp parallel for schedule(static)
1084 for (i=0; i <= (ssize_t) MaxMap; i++)
1086 x_map[i].x=(MagickRealType) (1.0*(
double) i);
1087 y_map[i].x=(MagickRealType) 0.0;
1088 z_map[i].x=(MagickRealType) 0.0;
1089 x_map[i].y=(MagickRealType) 0.0;
1090 y_map[i].y=(MagickRealType) (1.0*(
double) i);
1091 z_map[i].y=(MagickRealType) 0.0;
1092 x_map[i].z=(MagickRealType) 0.0;
1093 y_map[i].z=(MagickRealType) 0.0;
1094 z_map[i].z=(MagickRealType) (1.0*(
double) i);
1102 switch (image->storage_class)
1110 image_view=AcquireAuthenticCacheView(image,exception);
1111 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1112 #pragma omp parallel for schedule(static) shared(status) \
1113 magick_number_threads(image,image,image->rows,1)
1115 for (y=0; y < (ssize_t) image->rows; y++)
1134 if (status == MagickFalse)
1136 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1143 for (x=0; x < (ssize_t) image->columns; x++)
1145 red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1147 green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1149 blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1151 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1152 (MagickRealType) primary_info.x;
1153 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1154 (MagickRealType) primary_info.y;
1155 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1156 (MagickRealType) primary_info.z;
1157 SetPixelRed(q,ScaleMapToQuantum(pixel.red));
1158 SetPixelGreen(q,ScaleMapToQuantum(pixel.green));
1159 SetPixelBlue(q,ScaleMapToQuantum(pixel.blue));
1162 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1163 if (sync == MagickFalse)
1165 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1170 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1174 proceed=SetImageProgress(image,RGBTransformImageTag,progress,
1176 if (proceed == MagickFalse)
1180 image_view=DestroyCacheView(image_view);
1193 for (i=0; i < (ssize_t) image->colors; i++)
1198 red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1199 image->colormap[i].red));
1200 green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1201 image->colormap[i].green));
1202 blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1203 image->colormap[i].blue));
1204 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1205 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1206 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1207 image->colormap[i].red=ScaleMapToQuantum(pixel.red);
1208 image->colormap[i].green=ScaleMapToQuantum(pixel.green);
1209 image->colormap[i].blue=ScaleMapToQuantum(pixel.blue);
1211 (void) SyncImage(image);
1221 if (SetImageColorspace(image,colorspace) == MagickFalse)
1222 return(MagickFalse);
1251 MagickExport MagickBooleanType SetImageColorspace(
Image *image,
1252 const ColorspaceType colorspace)
1260 assert(image != (
Image *) NULL);
1261 assert(image->signature == MagickCoreSignature);
1262 if (IsEventLogging() != MagickFalse)
1263 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1264 if (image->colorspace == colorspace)
1266 image->colorspace=colorspace;
1267 image->rendering_intent=UndefinedIntent;
1268 image->gamma=1.000/2.200;
1269 (void) memset(&image->chromaticity,0,
sizeof(image->chromaticity));
1271 if (IsGrayColorspace(colorspace) != MagickFalse)
1273 if (colorspace == LinearGRAYColorspace)
1278 if ((IsRGBColorspace(colorspace) != MagickFalse) ||
1279 (colorspace == XYZColorspace) || (colorspace == xyYColorspace))
1283 image->rendering_intent=PerceptualIntent;
1284 image->chromaticity.red_primary.x=0.6400;
1285 image->chromaticity.red_primary.y=0.3300;
1286 image->chromaticity.red_primary.z=0.0300;
1287 image->chromaticity.green_primary.x=0.3000;
1288 image->chromaticity.green_primary.y=0.6000;
1289 image->chromaticity.green_primary.z=0.1000;
1290 image->chromaticity.blue_primary.x=0.1500;
1291 image->chromaticity.blue_primary.y=0.0600;
1292 image->chromaticity.blue_primary.z=0.7900;
1293 image->chromaticity.white_point.x=0.3127;
1294 image->chromaticity.white_point.y=0.3290;
1295 image->chromaticity.white_point.z=0.3583;
1297 status=SyncImagePixelCache(image,&image->exception);
1329 MagickExport MagickBooleanType SetImageGray(
Image *image,
1350 assert(image != (
Image *) NULL);
1351 assert(image->signature == MagickCoreSignature);
1352 if (IsEventLogging() != MagickFalse)
1353 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1354 if ((image->type == BilevelType) || (image->type == GrayscaleType) ||
1355 (image->type == GrayscaleMatteType))
1357 if ((IsGrayColorspace(image->colorspace) == MagickFalse) &&
1358 (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse))
1359 return(MagickFalse);
1360 value=GetImageProperty(image,
"colorspace:auto-grayscale");
1361 if (IsStringNotFalse(value) == MagickFalse)
1362 return(MagickFalse);
1364 image_view=AcquireVirtualCacheView(image,exception);
1365 for (y=0; y < (ssize_t) image->rows; y++)
1367 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1370 for (x=0; x < (ssize_t) image->columns; x++)
1372 if (IsGrayPixel(p) == MagickFalse)
1377 if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
1381 if (type == UndefinedType)
1384 image_view=DestroyCacheView(image_view);
1385 if (type == UndefinedType)
1386 return(MagickFalse);
1387 image->colorspace=GRAYColorspace;
1388 if (SyncImagePixelCache((
Image *) image,exception) == MagickFalse)
1389 return(MagickFalse);
1391 if ((type == GrayscaleType) && (image->matte != MagickFalse))
1392 image->type=GrayscaleMatteType;
1423 MagickExport MagickBooleanType SetImageMonochrome(
Image *image,
1444 assert(image != (
Image *) NULL);
1445 assert(image->signature == MagickCoreSignature);
1446 if (IsEventLogging() != MagickFalse)
1447 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1448 if (IsMonochromeImage(image,&image->exception) != MagickFalse)
1450 if ((IsGrayColorspace(image->colorspace) == MagickFalse) &&
1451 (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse))
1452 return(MagickFalse);
1453 value=GetImageProperty(image,
"colorspace:auto-grayscale");
1454 if (IsStringNotFalse(value) == MagickFalse)
1455 return(MagickFalse);
1457 image_view=AcquireVirtualCacheView(image,exception);
1458 for (y=0; y < (ssize_t) image->rows; y++)
1460 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1463 for (x=0; x < (ssize_t) image->columns; x++)
1465 if (IsMonochromePixel(p) == MagickFalse)
1472 if (type == UndefinedType)
1475 image_view=DestroyCacheView(image_view);
1476 if (type == UndefinedType)
1477 return(MagickFalse);
1478 image->colorspace=GRAYColorspace;
1479 if (SyncImagePixelCache((
Image *) image,exception) == MagickFalse)
1480 return(MagickFalse);
1510 MagickExport MagickBooleanType TransformImageColorspace(
Image *image,
1511 const ColorspaceType colorspace)
1516 assert(image != (
Image *) NULL);
1517 assert(image->signature == MagickCoreSignature);
1518 if (IsEventLogging() != MagickFalse)
1519 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1520 if (image->colorspace == colorspace)
1522 (void) DeleteImageProfile(image,
"icc");
1523 (void) DeleteImageProfile(image,
"icm");
1524 if (colorspace == UndefinedColorspace)
1525 return(SetImageColorspace(image,colorspace));
1529 if (IssRGBColorspace(colorspace) != MagickFalse)
1530 return(TransformRGBImage(image,image->colorspace));
1532 if (IssRGBColorspace(image->colorspace) == MagickFalse)
1533 status=TransformRGBImage(image,image->colorspace);
1534 if (status == MagickFalse)
1539 if (RGBTransformImage(image,colorspace) == MagickFalse)
1573 static inline void ConvertCMYToRGB(
const double cyan,
const double magenta,
1574 const double yellow,Quantum *red,Quantum *green,Quantum *blue)
1576 *red=ClampToQuantum(QuantumRange*(1.0-cyan));
1577 *green=ClampToQuantum(QuantumRange*(1.0-magenta));
1578 *blue=ClampToQuantum(QuantumRange*(1.0-yellow));
1581 static inline void ConvertLMSToXYZ(
const double L,
const double M,
const double S,
1582 double *X,
double *Y,
double *Z)
1584 *X=1.096123820835514*L-0.278869000218287*M+0.182745179382773*S;
1585 *Y=0.454369041975359*L+0.473533154307412*M+0.072097803717229*S;
1586 *Z=(-0.009627608738429)*L-0.005698031216113*M+1.015325639954543*S;
1589 static inline void ConvertLMSToRGB(
const double L,
const double M,
1590 const double S,Quantum *red,Quantum *green,Quantum *blue)
1597 ConvertLMSToXYZ(L,M,S,&X,&Y,&Z);
1598 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1601 static inline void ConvertLuvToRGB(
const double L,
const double u,
1602 const double v,Quantum *red,Quantum *green,Quantum *blue)
1609 ConvertLuvToXYZ(100.0*L,354.0*u-134.0,262.0*v-140.0,&X,&Y,&Z);
1610 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1613 static inline ssize_t RoundToYCC(
const MagickRealType value)
1617 if (value >= 1388.0)
1619 return((ssize_t) (value+0.5));
1622 static inline void ConvertLabToRGB(
const double L,
const double a,
1623 const double b,Quantum *red,Quantum *green,Quantum *blue)
1630 ConvertLabToXYZ(100.0*L,255.0*(a-0.5),255.0*(b-0.5),&X,&Y,&Z);
1631 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1634 static inline void ConvertxyYToRGB(
const double low_x,
const double low_y,
1635 const double cap_Y,Quantum *red,Quantum *green,Quantum *blue)
1643 gamma=PerceptibleReciprocal(low_y);
1644 X=gamma*cap_Y*low_x;
1646 Z=gamma*cap_Y*(1.0-low_x-low_y);
1647 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1650 static void ConvertYPbPrToRGB(
const double Y,
const double Pb,
const double Pr,
1651 Quantum *red,Quantum *green,Quantum *blue)
1653 *red=ClampToQuantum(QuantumRange*(0.99999999999914679361*Y-
1654 1.2188941887145875e-06*(Pb-0.5)+1.4019995886561440468*(Pr-0.5)));
1655 *green=ClampToQuantum(QuantumRange*(0.99999975910502514331*Y-
1656 0.34413567816504303521*(Pb-0.5)-0.71413649331646789076*(Pr-0.5)));
1657 *blue=ClampToQuantum(QuantumRange*(1.00000124040004623180*Y+
1658 1.77200006607230409200*(Pb-0.5)+2.1453384174593273e-06*(Pr-0.5)));
1661 static void ConvertYCbCrToRGB(
const double Y,
const double Cb,
1662 const double Cr,Quantum *red,Quantum *green,Quantum *blue)
1664 ConvertYPbPrToRGB(Y,Cb,Cr,red,green,blue);
1667 static void ConvertYDbDrToRGB(
const double Y,
const double Db,
const double Dr,
1668 Quantum *red,Quantum *green,Quantum *blue)
1670 *red=ClampToQuantum(QuantumRange*(Y+9.2303716147657e-05*(Db-0.5)-
1671 0.52591263066186533*(Dr-0.5)));
1672 *green=ClampToQuantum(QuantumRange*(Y-0.12913289889050927*(Db-0.5)+
1673 0.26789932820759876*(Dr-0.5)));
1674 *blue=ClampToQuantum(QuantumRange*(Y+0.66467905997895482*(Db-0.5)-
1675 7.9202543533108e-05*(Dr-0.5)));
1678 static void ConvertYIQToRGB(
const double Y,
const double I,
const double Q,
1679 Quantum *red,Quantum *green,Quantum *blue)
1681 *red=ClampToQuantum(QuantumRange*(Y+0.9562957197589482261*(I-0.5)+
1682 0.6210244164652610754*(Q-0.5)));
1683 *green=ClampToQuantum(QuantumRange*(Y-0.2721220993185104464*(I-0.5)-
1684 0.6473805968256950427*(Q-0.5)));
1685 *blue=ClampToQuantum(QuantumRange*(Y-1.1069890167364901945*(I-0.5)+
1686 1.7046149983646481374*(Q-0.5)));
1689 static void ConvertYUVToRGB(
const double Y,
const double U,
const double V,
1690 Quantum *red,Quantum *green,Quantum *blue)
1692 *red=ClampToQuantum(QuantumRange*(Y-3.945707070708279e-05*(U-0.5)+
1693 1.1398279671717170825*(V-0.5)));
1694 *green=ClampToQuantum(QuantumRange*(Y-0.3946101641414141437*(U-0.5)-
1695 0.5805003156565656797*(V-0.5)));
1696 *blue=ClampToQuantum(QuantumRange*(Y+2.0319996843434342537*(U-0.5)-
1697 4.813762626262513e-04*(V-0.5)));
1700 MagickExport MagickBooleanType TransformRGBImage(
Image *image,
1701 const ColorspaceType colorspace)
1703 #define TransformRGBImageTag "Transform/Image"
1708 0.000000, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1709 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1710 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1711 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1712 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1713 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1714 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1715 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1716 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1717 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1718 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1719 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1720 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1721 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1722 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1723 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1724 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1725 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1726 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1727 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1728 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1729 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1730 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1731 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1732 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1733 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1734 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1735 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1736 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1737 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1738 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1739 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1740 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1741 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1742 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1743 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1744 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1745 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1746 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1747 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1748 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1749 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1750 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1751 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1752 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1753 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1754 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1755 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1756 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1757 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1758 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1759 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1760 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1761 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1762 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1763 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1764 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1765 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1766 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1767 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1768 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1769 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1770 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1771 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1772 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1773 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1774 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1775 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1776 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1777 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1778 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1779 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1780 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1781 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1782 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1783 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1784 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1785 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1786 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1787 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1788 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1789 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1790 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1791 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1792 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1793 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1794 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1795 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1796 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1797 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1798 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1799 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1800 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1801 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1802 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1803 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1804 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1805 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1806 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1807 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1808 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1809 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1810 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1811 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1812 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1813 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1814 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1815 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1816 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1817 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1818 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1819 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1820 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1821 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1822 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1823 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1824 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1825 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1826 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1827 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1828 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1829 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1830 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1831 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1832 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1833 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1834 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1835 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1836 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1837 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1838 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1839 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1840 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1841 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1842 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1843 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1844 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1845 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1846 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1847 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1848 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1849 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1850 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1851 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1852 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1853 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1854 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1855 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1856 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1857 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1858 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1859 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1860 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1861 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1862 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1863 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1864 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1865 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1866 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1867 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1868 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1869 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1870 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1871 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
1872 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
1873 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
1874 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
1875 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
1876 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
1877 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
1878 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
1879 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
1880 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
1881 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
1882 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
1883 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
1884 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
1885 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
1886 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
1887 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
1888 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
1889 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
1890 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
1891 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
1892 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
1893 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
1894 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
1895 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
1896 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
1897 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
1898 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
1899 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
1900 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
1901 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
1902 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
1903 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
1904 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
1905 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
1906 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
1907 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
1908 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
1909 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
1910 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
1911 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
1912 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
1913 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
1914 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
1915 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
1916 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
1917 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
1918 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
1919 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
1920 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
1921 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
1922 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
1923 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
1924 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
1925 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
1926 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
1927 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
1928 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
1929 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
1930 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
1931 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
1932 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
1933 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
1934 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
1935 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
1936 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
1937 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
1938 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
1939 0.998559f, 0.999280f, 1.000000
1965 assert(image != (
Image *) NULL);
1966 assert(image->signature == MagickCoreSignature);
1967 if (IsEventLogging() != MagickFalse)
1968 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1971 exception=(&image->exception);
1974 case CMYKColorspace:
1982 if (image->storage_class == PseudoClass)
1984 if (SyncImage(image) == MagickFalse)
1985 return(MagickFalse);
1986 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
1987 return(MagickFalse);
1989 GetMagickPixelPacket(image,&zero);
1990 image_view=AcquireAuthenticCacheView(image,exception);
1991 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1992 #pragma omp parallel for schedule(static) shared(status) \
1993 magick_number_threads(image,image,image->rows,1)
1995 for (y=0; y < (ssize_t) image->rows; y++)
2004 *magick_restrict indexes;
2012 if (status == MagickFalse)
2014 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2021 indexes=GetCacheViewAuthenticIndexQueue(image_view);
2023 for (x=0; x < (ssize_t) image->columns; x++)
2025 SetMagickPixelPacket(image,q,indexes+x,&pixel);
2026 ConvertCMYKToRGB(&pixel);
2027 SetPixelPacket(image,&pixel,q,indexes+x);
2030 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2031 if (sync == MagickFalse)
2034 image_view=DestroyCacheView(image_view);
2035 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2036 return(MagickFalse);
2039 case LinearGRAYColorspace:
2040 case Rec601LumaColorspace:
2045 if (image->storage_class == PseudoClass)
2047 if (SyncImage(image) == MagickFalse)
2048 return(MagickFalse);
2049 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2050 return(MagickFalse);
2052 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2053 return(MagickFalse);
2054 image_view=AcquireAuthenticCacheView(image,exception);
2055 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2056 #pragma omp parallel for schedule(static) shared(status) \
2057 magick_number_threads(image,image,image->rows,1)
2059 for (y=0; y < (ssize_t) image->rows; y++)
2070 if (status == MagickFalse)
2072 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2079 for (x=(ssize_t) image->columns; x != 0; x--)
2084 gray=0.212656*EncodePixelGamma(GetPixelRed(q))+0.715158*
2085 EncodePixelGamma(GetPixelGreen(q))+0.072186*
2086 EncodePixelGamma(GetPixelBlue(q));
2087 SetPixelRed(q,ClampToQuantum(gray));
2088 SetPixelGreen(q,ClampToQuantum(gray));
2089 SetPixelBlue(q,ClampToQuantum(gray));
2092 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2093 if (sync == MagickFalse)
2096 image_view=DestroyCacheView(image_view);
2097 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2098 return(MagickFalse);
2101 case GRAYColorspace:
2102 case Rec709LumaColorspace:
2107 if (image->storage_class == PseudoClass)
2109 if (SyncImage(image) == MagickFalse)
2110 return(MagickFalse);
2111 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2112 return(MagickFalse);
2114 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2115 return(MagickFalse);
2116 image_view=AcquireAuthenticCacheView(image,exception);
2117 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2118 #pragma omp parallel for schedule(static) shared(status) \
2119 magick_number_threads(image,image,image->rows,1)
2121 for (y=0; y < (ssize_t) image->rows; y++)
2132 if (status == MagickFalse)
2134 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2141 for (x=(ssize_t) image->columns; x != 0; x--)
2146 gray=0.212656*GetPixelRed(q)+0.715158*GetPixelGreen(q)+
2147 0.072186*GetPixelBlue(q);
2148 SetPixelRed(q,ClampToQuantum(gray));
2149 SetPixelGreen(q,ClampToQuantum(gray));
2150 SetPixelBlue(q,ClampToQuantum(gray));
2153 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2154 if (sync == MagickFalse)
2157 image_view=DestroyCacheView(image_view);
2158 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2159 return(MagickFalse);
2164 case HCLpColorspace:
2172 case LCHabColorspace:
2173 case LCHuvColorspace:
2178 case YCbCrColorspace:
2179 case YDbDrColorspace:
2181 case YPbPrColorspace:
2187 if (image->storage_class == PseudoClass)
2189 if (SyncImage(image) == MagickFalse)
2190 return(MagickFalse);
2191 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2192 return(MagickFalse);
2194 image_view=AcquireAuthenticCacheView(image,exception);
2195 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2196 #pragma omp parallel for schedule(static) shared(status) \
2197 magick_number_threads(image,image,image->rows,1)
2199 for (y=0; y < (ssize_t) image->rows; y++)
2210 if (status == MagickFalse)
2212 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2219 for (x=0; x < (ssize_t) image->columns; x++)
2231 X=QuantumScale*GetPixelRed(q);
2232 Y=QuantumScale*GetPixelGreen(q);
2233 Z=QuantumScale*GetPixelBlue(q);
2238 ConvertCMYToRGB(X,Y,Z,&red,&green,&blue);
2243 ConvertHCLToRGB(X,Y,Z,&red,&green,&blue);
2246 case HCLpColorspace:
2248 ConvertHCLpToRGB(X,Y,Z,&red,&green,&blue);
2253 ConvertHSBToRGB(X,Y,Z,&red,&green,&blue);
2258 ConvertHSIToRGB(X,Y,Z,&red,&green,&blue);
2263 ConvertHSLToRGB(X,Y,Z,&red,&green,&blue);
2268 ConvertHSVToRGB(X,Y,Z,&red,&green,&blue);
2273 ConvertHWBToRGB(X,Y,Z,&red,&green,&blue);
2278 ConvertLabToRGB(X,Y,Z,&red,&green,&blue);
2282 case LCHabColorspace:
2284 ConvertLCHabToRGB(X,Y,Z,&red,&green,&blue);
2287 case LCHuvColorspace:
2289 ConvertLCHuvToRGB(X,Y,Z,&red,&green,&blue);
2294 ConvertLMSToRGB(X,Y,Z,&red,&green,&blue);
2299 ConvertLuvToRGB(X,Y,Z,&red,&green,&blue);
2304 ConvertxyYToRGB(X,Y,Z,&red,&green,&blue);
2309 ConvertXYZToRGB(X,Y,Z,&red,&green,&blue);
2312 case YCbCrColorspace:
2314 ConvertYCbCrToRGB(X,Y,Z,&red,&green,&blue);
2317 case YDbDrColorspace:
2319 ConvertYDbDrToRGB(X,Y,Z,&red,&green,&blue);
2324 ConvertYIQToRGB(X,Y,Z,&red,&green,&blue);
2327 case YPbPrColorspace:
2329 ConvertYPbPrToRGB(X,Y,Z,&red,&green,&blue);
2334 ConvertYUVToRGB(X,Y,Z,&red,&green,&blue);
2339 red=ClampToQuantum(QuantumRange*X);
2340 green=ClampToQuantum(QuantumRange*Y);
2341 blue=ClampToQuantum(QuantumRange*Z);
2345 SetPixelRed(q,ClampToQuantum((MagickRealType) red));
2346 SetPixelGreen(q,ClampToQuantum((MagickRealType) green));
2347 SetPixelBlue(q,ClampToQuantum((MagickRealType) blue));
2350 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2351 if (sync == MagickFalse)
2354 image_view=DestroyCacheView(image_view);
2355 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2356 return(MagickFalse);
2378 density=DisplayGamma;
2380 value=GetImageProperty(image,
"gamma");
2381 if (value != (
const char *) NULL)
2382 gamma=PerceptibleReciprocal(StringToDouble(value,(
char **) NULL));
2383 film_gamma=FilmGamma;
2384 value=GetImageProperty(image,
"film-gamma");
2385 if (value != (
const char *) NULL)
2386 film_gamma=StringToDouble(value,(
char **) NULL);
2387 reference_black=ReferenceBlack;
2388 value=GetImageProperty(image,
"reference-black");
2389 if (value != (
const char *) NULL)
2390 reference_black=StringToDouble(value,(
char **) NULL);
2391 reference_white=ReferenceWhite;
2392 value=GetImageProperty(image,
"reference-white");
2393 if (value != (
const char *) NULL)
2394 reference_white=StringToDouble(value,(
char **) NULL);
2395 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2397 if (logmap == (Quantum *) NULL)
2398 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2400 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
2401 PerceptibleReciprocal(film_gamma));
2402 for (i=0; i <= (ssize_t) (reference_black*MaxMap/1024.0); i++)
2403 logmap[i]=(Quantum) 0;
2404 for ( ; i < (ssize_t) (reference_white*MaxMap/1024.0); i++)
2405 logmap[i]=ClampToQuantum((MagickRealType) QuantumRange/(1.0-black)*
2406 (pow(10.0,(1024.0*i/MaxMap-reference_white)*(gamma/density)*0.002*
2407 PerceptibleReciprocal(film_gamma))-black));
2408 for ( ; i <= (ssize_t) MaxMap; i++)
2409 logmap[i]=QuantumRange;
2410 if (image->storage_class == PseudoClass)
2412 if (SyncImage(image) == MagickFalse)
2413 return(MagickFalse);
2414 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2415 return(MagickFalse);
2417 image_view=AcquireAuthenticCacheView(image,exception);
2418 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2419 #pragma omp parallel for schedule(static) shared(status) \
2420 magick_number_threads(image,image,image->rows,1)
2422 for (y=0; y < (ssize_t) image->rows; y++)
2433 if (status == MagickFalse)
2435 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2442 for (x=(ssize_t) image->columns; x != 0; x--)
2449 red=ClampToQuantum(EncodePixelGamma((MagickRealType)
2450 logmap[ScaleQuantumToMap(GetPixelRed(q))]));
2451 green=ClampToQuantum(EncodePixelGamma((MagickRealType)
2452 logmap[ScaleQuantumToMap(GetPixelGreen(q))]));
2453 blue=ClampToQuantum(EncodePixelGamma((MagickRealType)
2454 logmap[ScaleQuantumToMap(GetPixelBlue(q))]));
2456 SetPixelGreen(q,green);
2457 SetPixelBlue(q,blue);
2460 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2461 if (sync == MagickFalse)
2464 image_view=DestroyCacheView(image_view);
2465 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2466 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2467 return(MagickFalse);
2471 case scRGBColorspace:
2476 if (image->storage_class == PseudoClass)
2478 if (SyncImage(image) == MagickFalse)
2479 return(MagickFalse);
2480 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2481 return(MagickFalse);
2483 image_view=AcquireAuthenticCacheView(image,exception);
2484 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2485 #pragma omp parallel for schedule(static) shared(status) \
2486 magick_number_threads(image,image,image->rows,1)
2488 for (y=0; y < (ssize_t) image->rows; y++)
2499 if (status == MagickFalse)
2501 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2508 for (x=(ssize_t) image->columns; x != 0; x--)
2515 red=ClampToQuantum(EncodePixelGamma((MagickRealType) GetPixelRed(q)));
2516 green=ClampToQuantum(EncodePixelGamma((MagickRealType)
2518 blue=ClampToQuantum(EncodePixelGamma((MagickRealType)
2521 SetPixelGreen(q,green);
2522 SetPixelBlue(q,blue);
2525 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2526 if (sync == MagickFalse)
2529 image_view=DestroyCacheView(image_view);
2530 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2531 return(MagickFalse);
2556 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2561 case OHTAColorspace:
2573 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2574 #pragma omp parallel for schedule(static)
2576 for (i=0; i <= (ssize_t) MaxMap; i++)
2578 x_map[i].x=(1.0*(double) i);
2579 y_map[i].x=(0.5*1.00000*(2.0*(double) i-MaxMap));
2580 z_map[i].x=(-0.5*0.66668*(2.0*(double) i-MaxMap));
2581 x_map[i].y=(1.0*(double) i);
2582 y_map[i].y=(0.5*0.00000*(2.0*(double) i-MaxMap));
2583 z_map[i].y=(0.5*1.33333*(2.0*(double) i-MaxMap));
2584 x_map[i].z=(1.0*(double) i);
2585 y_map[i].z=(-0.5*1.00000*(2.0*(double) i-MaxMap));
2586 z_map[i].z=(-0.5*0.66668*(2.0*(double) i-MaxMap));
2590 case Rec601YCbCrColorspace:
2602 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2603 #pragma omp parallel for schedule(static)
2605 for (i=0; i <= (ssize_t) MaxMap; i++)
2607 x_map[i].x=0.99999999999914679361*(double) i;
2608 y_map[i].x=0.5*(-1.2188941887145875e-06)*(2.00*(
double) i-MaxMap);
2609 z_map[i].x=0.5*1.4019995886561440468*(2.00*(double) i-MaxMap);
2610 x_map[i].y=0.99999975910502514331*(double) i;
2611 y_map[i].y=0.5*(-0.34413567816504303521)*(2.00*(double) i-MaxMap);
2612 z_map[i].y=0.5*(-0.71413649331646789076)*(2.00*(double) i-MaxMap);
2613 x_map[i].z=1.00000124040004623180*(double) i;
2614 y_map[i].z=0.5*1.77200006607230409200*(2.00*(double) i-MaxMap);
2615 z_map[i].z=0.5*2.1453384174593273e-06*(2.00*(double) i-MaxMap);
2619 case Rec709YCbCrColorspace:
2631 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2632 #pragma omp parallel for schedule(static)
2634 for (i=0; i <= (ssize_t) MaxMap; i++)
2636 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2637 y_map[i].x=(MagickRealType) (0.5*0.000000*(2.0*(
double) i-MaxMap));
2638 z_map[i].x=(MagickRealType) (0.5*1.574800*(2.0*(
double) i-MaxMap));
2639 x_map[i].y=(MagickRealType) (1.0*(
double) i);
2640 y_map[i].y=(MagickRealType) (0.5*(-0.187324)*(2.0*(double) i-MaxMap));
2641 z_map[i].y=(MagickRealType) (0.5*(-0.468124)*(2.0*(double) i-MaxMap));
2642 x_map[i].z=(MagickRealType) (1.0*(
double) i);
2643 y_map[i].z=(MagickRealType) (0.5*1.855600*(2.0*(
double) i-MaxMap));
2644 z_map[i].z=(MagickRealType) (0.5*0.000000*(2.0*(
double) i-MaxMap));
2659 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2660 #pragma omp parallel for schedule(static)
2662 for (i=0; i <= (ssize_t) MaxMap; i++)
2664 x_map[i].x=(MagickRealType) (1.3584000*(
double) i);
2665 y_map[i].x=(MagickRealType) (0.0000000);
2666 z_map[i].x=(MagickRealType) (1.8215000*((
double) i-(MagickRealType)
2667 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2668 x_map[i].y=(MagickRealType) (1.3584000*(
double) i);
2669 y_map[i].y=(MagickRealType) ((-0.4302726)*((double) i-(MagickRealType)
2670 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2671 z_map[i].y=(MagickRealType) ((-0.9271435)*((double) i-(MagickRealType)
2672 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2673 x_map[i].z=(MagickRealType) (1.3584000*(
double) i);
2674 y_map[i].z=(MagickRealType) (2.2179000*((
double) i-(MagickRealType)
2675 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2676 z_map[i].z=(MagickRealType) (0.0000000);
2685 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2686 #pragma omp parallel for schedule(static)
2688 for (i=0; i <= (ssize_t) MaxMap; i++)
2690 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2691 y_map[i].x=(MagickRealType) 0.0;
2692 z_map[i].x=(MagickRealType) 0.0;
2693 x_map[i].y=(MagickRealType) 0.0;
2694 y_map[i].y=(MagickRealType) (1.0*(
double) i);
2695 z_map[i].y=(MagickRealType) 0.0;
2696 x_map[i].z=(MagickRealType) 0.0;
2697 y_map[i].z=(MagickRealType) 0.0;
2698 z_map[i].z=(MagickRealType) (1.0*(
double) i);
2706 switch (image->storage_class)
2714 image_view=AcquireAuthenticCacheView(image,exception);
2715 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2716 #pragma omp parallel for schedule(static) shared(status) \
2717 magick_number_threads(image,image,image->rows,1)
2719 for (y=0; y < (ssize_t) image->rows; y++)
2733 if (status == MagickFalse)
2735 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2742 for (x=0; x < (ssize_t) image->columns; x++)
2749 red=ScaleQuantumToMap(GetPixelRed(q));
2750 green=ScaleQuantumToMap(GetPixelGreen(q));
2751 blue=ScaleQuantumToMap(GetPixelBlue(q));
2752 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2753 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2754 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2755 if (colorspace == YCCColorspace)
2757 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
2759 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
2761 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
2766 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2767 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2768 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2770 SetPixelRed(q,ClampToQuantum(pixel.red));
2771 SetPixelGreen(q,ClampToQuantum(pixel.green));
2772 SetPixelBlue(q,ClampToQuantum(pixel.blue));
2775 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2776 if (sync == MagickFalse)
2778 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2783 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2787 proceed=SetImageProgress(image,TransformRGBImageTag,progress,
2789 if (proceed == MagickFalse)
2793 image_view=DestroyCacheView(image_view);
2801 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2802 #pragma omp parallel for schedule(static) shared(status) \
2803 magick_number_threads(image,image,image->colors,1)
2805 for (i=0; i < (ssize_t) image->colors; i++)
2815 red=ScaleQuantumToMap(image->colormap[i].red);
2816 green=ScaleQuantumToMap(image->colormap[i].green);
2817 blue=ScaleQuantumToMap(image->colormap[i].blue);
2818 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2819 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2820 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2821 if (colorspace == YCCColorspace)
2823 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
2825 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
2827 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
2832 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2833 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2834 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2836 image->colormap[i].red=ClampToQuantum(pixel.red);
2837 image->colormap[i].green=ClampToQuantum(pixel.green);
2838 image->colormap[i].blue=ClampToQuantum(pixel.blue);
2840 (void) SyncImage(image);
2850 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2851 return(MagickFalse);