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*((double) QuantumRange-(
double) red);
166 *magenta=QuantumScale*((double) QuantumRange-(
double) green);
167 *yellow=QuantumScale*((double) QuantumRange-(
double) 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*(double) red+0.586811*(
double) green+0.114350*
235 *Pb=QuantumScale*((-0.1687367)*(
double) red-0.331264*(double) green+0.5*
237 *Pr=QuantumScale*(0.5*(double) red-0.418688*(
double) green-0.081312*
241 static void ConvertRGBToYCbCr(
const Quantum red,
const Quantum green,
242 const Quantum blue,
double *Y,
double *Cb,
double *Cr)
244 ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr);
247 static void ConvertRGBToYUV(
const Quantum red,
const Quantum green,
248 const Quantum blue,
double *Y,
double *U,
double *V)
250 *Y=QuantumScale*(0.298839*(double) red+0.586811*(
double) green+0.114350*
252 *U=QuantumScale*((-0.147)*(
double) red-0.289*(double) green+0.436*
254 *V=QuantumScale*(0.615*(double) red-0.515*(
double) green-0.100*
258 static void ConvertRGBToYDbDr(
const Quantum red,
const Quantum green,
259 const Quantum blue,
double *Y,
double *Db,
double *Dr)
261 *Y=QuantumScale*(0.298839*(double) red+0.586811*(
double) green+0.114350*
263 *Db=QuantumScale*(-0.450*(double) red-0.883*(
double) green+1.333*
265 *Dr=QuantumScale*(-1.333*(double) red+1.116*(
double) green+0.217*
269 static void ConvertRGBToYIQ(
const Quantum red,
const Quantum green,
270 const Quantum blue,
double *Y,
double *I,
double *Q)
272 *Y=QuantumScale*(0.298839*(double) red+0.586811*(
double) green+0.114350*
274 *I=QuantumScale*(0.595716*(double) red-0.274453*(
double) green-0.321263*
276 *Q=QuantumScale*(0.211456*(double) red-0.522591*(
double) green+0.311135*
280 MagickExport MagickBooleanType RGBTransformImage(
Image *image,
281 const ColorspaceType colorspace)
283 #define RGBTransformImageTag "RGBTransform/Image"
311 assert(image != (
Image *) NULL);
312 assert(image->signature == MagickCoreSignature);
313 assert(colorspace != sRGBColorspace);
314 assert(colorspace != TransparentColorspace);
315 assert(colorspace != UndefinedColorspace);
316 if (IsEventLogging() != MagickFalse)
317 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
320 exception=(&image->exception);
331 if (image->storage_class == PseudoClass)
333 if (SyncImage(image) == MagickFalse)
335 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
338 if (SetImageColorspace(image,colorspace) == MagickFalse)
340 GetMagickPixelPacket(image,&zero);
341 image_view=AcquireAuthenticCacheView(image,exception);
342 #if defined(MAGICKCORE_OPENMP_SUPPORT)
343 #pragma omp parallel for schedule(static) shared(status) \
344 magick_number_threads(image,image,image->rows,1)
346 for (y=0; y < (ssize_t) image->rows; y++)
355 *magick_restrict indexes;
363 if (status == MagickFalse)
365 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
372 indexes=GetCacheViewAuthenticIndexQueue(image_view);
374 for (x=0; x < (ssize_t) image->columns; x++)
376 SetMagickPixelPacket(image,q,indexes+x,&pixel);
377 pixel.red=(MagickRealType) pixel.red;
378 pixel.green=(MagickRealType) pixel.green;
379 pixel.blue=(MagickRealType) pixel.blue;
380 ConvertRGBToCMYK(&pixel);
381 SetPixelPacket(image,&pixel,q,indexes+x);
384 sync=SyncCacheViewAuthenticPixels(image_view,exception);
385 if (sync == MagickFalse)
388 image_view=DestroyCacheView(image_view);
389 image->type=image->matte == MagickFalse ? ColorSeparationType :
390 ColorSeparationMatteType;
391 if (SetImageColorspace(image,colorspace) == MagickFalse)
395 case LinearGRAYColorspace:
400 if (image->storage_class == PseudoClass)
402 if (SyncImage(image) == MagickFalse)
404 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
407 image_view=AcquireAuthenticCacheView(image,exception);
408 #if defined(MAGICKCORE_OPENMP_SUPPORT)
409 #pragma omp parallel for schedule(static) shared(status) \
410 magick_number_threads(image,image,image->rows,1)
412 for (y=0; y < (ssize_t) image->rows; y++)
423 if (status == MagickFalse)
425 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
432 for (x=0; x < (ssize_t) image->columns; x++)
437 gray=0.212656*DecodePixelGamma(GetPixelRed(q))+0.715158*
438 DecodePixelGamma(GetPixelGreen(q))+0.072186*
439 DecodePixelGamma(GetPixelBlue(q));
440 SetPixelGray(q,ClampToQuantum(gray));
443 sync=SyncCacheViewAuthenticPixels(image_view,exception);
444 if (sync == MagickFalse)
447 image_view=DestroyCacheView(image_view);
448 if (SetImageColorspace(image,colorspace) == MagickFalse)
450 image->type=GrayscaleType;
458 if (image->storage_class == PseudoClass)
460 if (SyncImage(image) == MagickFalse)
462 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
465 image_view=AcquireAuthenticCacheView(image,exception);
466 #if defined(MAGICKCORE_OPENMP_SUPPORT)
467 #pragma omp parallel for schedule(static) shared(status) \
468 magick_number_threads(image,image,image->rows,1)
470 for (y=0; y < (ssize_t) image->rows; y++)
481 if (status == MagickFalse)
483 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
490 for (x=0; x < (ssize_t) image->columns; x++)
495 gray=0.212656*(double) GetPixelRed(q)+0.715158*(double)
496 GetPixelGreen(q)+0.072186*(double) GetPixelBlue(q);
497 SetPixelGray(q,ClampToQuantum(gray));
500 sync=SyncCacheViewAuthenticPixels(image_view,exception);
501 if (sync == MagickFalse)
504 image_view=DestroyCacheView(image_view);
505 if (SetImageColorspace(image,colorspace) == MagickFalse)
507 image->type=GrayscaleType;
520 case LCHabColorspace:
521 case LCHuvColorspace:
526 case YCbCrColorspace:
527 case YDbDrColorspace:
529 case YPbPrColorspace:
535 if (image->storage_class == PseudoClass)
537 if (SyncImage(image) == MagickFalse)
539 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
542 image_view=AcquireAuthenticCacheView(image,exception);
543 #if defined(MAGICKCORE_OPENMP_SUPPORT)
544 #pragma omp parallel for schedule(static) shared(status) \
545 magick_number_threads(image,image,image->rows,1)
547 for (y=0; y < (ssize_t) image->rows; y++)
558 if (status == MagickFalse)
560 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
567 for (x=0; x < (ssize_t) image->columns; x++)
579 red=ClampToQuantum((MagickRealType) GetPixelRed(q));
580 green=ClampToQuantum((MagickRealType) GetPixelGreen(q));
581 blue=ClampToQuantum((MagickRealType) GetPixelBlue(q));
586 ConvertRGBToCMY(red,green,blue,&X,&Y,&Z);
591 ConvertRGBToHCL(red,green,blue,&X,&Y,&Z);
596 ConvertRGBToHCLp(red,green,blue,&X,&Y,&Z);
601 ConvertRGBToHSB(red,green,blue,&X,&Y,&Z);
606 ConvertRGBToHSI(red,green,blue,&X,&Y,&Z);
611 ConvertRGBToHSL(red,green,blue,&X,&Y,&Z);
616 ConvertRGBToHSV(red,green,blue,&X,&Y,&Z);
621 ConvertRGBToHWB(red,green,blue,&X,&Y,&Z);
626 ConvertRGBToLab(red,green,blue,&X,&Y,&Z);
630 case LCHabColorspace:
632 ConvertRGBToLCHab(red,green,blue,&X,&Y,&Z);
635 case LCHuvColorspace:
637 ConvertRGBToLCHuv(red,green,blue,&X,&Y,&Z);
642 ConvertRGBToLMS(red,green,blue,&X,&Y,&Z);
647 ConvertRGBToLuv(red,green,blue,&X,&Y,&Z);
652 ConvertRGBToxyY(red,green,blue,&X,&Y,&Z);
657 ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
660 case YCbCrColorspace:
662 ConvertRGBToYCbCr(red,green,blue,&X,&Y,&Z);
665 case YDbDrColorspace:
667 ConvertRGBToYDbDr(red,green,blue,&X,&Y,&Z);
672 ConvertRGBToYIQ(red,green,blue,&X,&Y,&Z);
675 case YPbPrColorspace:
677 ConvertRGBToYPbPr(red,green,blue,&X,&Y,&Z);
682 ConvertRGBToYUV(red,green,blue,&X,&Y,&Z);
687 X=QuantumScale*(double) red;
688 Y=QuantumScale*(double) green;
689 Z=QuantumScale*(double) blue;
693 SetPixelRed(q,ClampToQuantum((MagickRealType) QuantumRange*X));
694 SetPixelGreen(q,ClampToQuantum((MagickRealType) QuantumRange*Y));
695 SetPixelBlue(q,ClampToQuantum((MagickRealType) QuantumRange*Z));
698 sync=SyncCacheViewAuthenticPixels(image_view,exception);
699 if (sync == MagickFalse)
702 image_view=DestroyCacheView(image_view);
703 if (SetImageColorspace(image,colorspace) == MagickFalse)
709 #define DisplayGamma (1.0/1.7)
710 #define FilmGamma 0.6
711 #define ReferenceBlack 95.0
712 #define ReferenceWhite 685.0
731 density=DisplayGamma;
733 value=GetImageProperty(image,
"gamma");
734 if (value != (
const char *) NULL)
735 gamma=PerceptibleReciprocal(StringToDouble(value,(
char **) NULL));
736 film_gamma=FilmGamma;
737 value=GetImageProperty(image,
"film-gamma");
738 if (value != (
const char *) NULL)
739 film_gamma=StringToDouble(value,(
char **) NULL);
740 reference_black=ReferenceBlack;
741 value=GetImageProperty(image,
"reference-black");
742 if (value != (
const char *) NULL)
743 reference_black=StringToDouble(value,(
char **) NULL);
744 reference_white=ReferenceWhite;
745 value=GetImageProperty(image,
"reference-white");
746 if (value != (
const char *) NULL)
747 reference_white=StringToDouble(value,(
char **) NULL);
748 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
750 if (logmap == (Quantum *) NULL)
751 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
753 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
754 PerceptibleReciprocal(film_gamma));
755 #if defined(MAGICKCORE_OPENMP_SUPPORT)
756 #pragma omp parallel for schedule(static)
758 for (i=0; i <= (ssize_t) MaxMap; i++)
759 logmap[i]=ScaleMapToQuantum((MagickRealType) (MaxMap*(reference_white+
760 log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002*
761 PerceptibleReciprocal(film_gamma)))/1024.0));
762 image_view=AcquireAuthenticCacheView(image,exception);
763 #if defined(MAGICKCORE_OPENMP_SUPPORT)
764 #pragma omp parallel for schedule(static) shared(status) \
765 magick_number_threads(image,image,image->rows,1)
767 for (y=0; y < (ssize_t) image->rows; y++)
778 if (status == MagickFalse)
780 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
787 for (x=(ssize_t) image->columns; x != 0; x--)
794 red=ClampToQuantum(DecodePixelGamma((MagickRealType)
796 green=ClampToQuantum(DecodePixelGamma((MagickRealType)
798 blue=ClampToQuantum(DecodePixelGamma((MagickRealType)
800 SetPixelRed(q,logmap[ScaleQuantumToMap(red)]);
801 SetPixelGreen(q,logmap[ScaleQuantumToMap(green)]);
802 SetPixelBlue(q,logmap[ScaleQuantumToMap(blue)]);
805 sync=SyncCacheViewAuthenticPixels(image_view,exception);
806 if (sync == MagickFalse)
809 image_view=DestroyCacheView(image_view);
810 logmap=(Quantum *) RelinquishMagickMemory(logmap);
811 if (SetImageColorspace(image,colorspace) == MagickFalse)
816 case scRGBColorspace:
821 if (image->storage_class == PseudoClass)
823 if (SyncImage(image) == MagickFalse)
825 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
828 image_view=AcquireAuthenticCacheView(image,exception);
829 #if defined(MAGICKCORE_OPENMP_SUPPORT)
830 #pragma omp parallel for schedule(static) shared(status) \
831 magick_number_threads(image,image,image->rows,1)
833 for (y=0; y < (ssize_t) image->rows; y++)
844 if (status == MagickFalse)
846 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
853 for (x=0; x < (ssize_t) image->columns; x++)
860 red=ClampToQuantum(DecodePixelGamma((MagickRealType)
862 green=ClampToQuantum(DecodePixelGamma((MagickRealType)
864 blue=ClampToQuantum(DecodePixelGamma((MagickRealType)
867 SetPixelGreen(q,green);
868 SetPixelBlue(q,blue);
871 sync=SyncCacheViewAuthenticPixels(image_view,exception);
872 if (sync == MagickFalse)
875 image_view=DestroyCacheView(image_view);
876 if (SetImageColorspace(image,colorspace) == MagickFalse)
902 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
905 (void) memset(&primary_info,0,
sizeof(primary_info));
920 primary_info.y=(double) (MaxMap+1.0)/2.0;
921 primary_info.z=(double) (MaxMap+1.0)/2.0;
922 #if defined(MAGICKCORE_OPENMP_SUPPORT)
923 #pragma omp parallel for schedule(static)
925 for (i=0; i <= (ssize_t) MaxMap; i++)
927 x_map[i].x=(MagickRealType) (0.33333*(
double) i);
928 x_map[i].y=(MagickRealType) (0.50000*(
double) i);
929 x_map[i].z=(MagickRealType) (-0.25000*(
double) i);
930 y_map[i].x=(MagickRealType) (0.33334*(
double) i);
931 y_map[i].y=(MagickRealType) (0.00000*(
double) i);
932 y_map[i].z=(MagickRealType) (0.50000*(
double) i);
933 z_map[i].x=(MagickRealType) (0.33333*(
double) i);
934 z_map[i].y=(MagickRealType) (-0.50000*(
double) i);
935 z_map[i].z=(MagickRealType) (-0.25000*(
double) i);
939 case Rec601LumaColorspace:
946 #if defined(MAGICKCORE_OPENMP_SUPPORT)
947 #pragma omp parallel for schedule(static)
949 for (i=0; i <= (ssize_t) MaxMap; i++)
951 x_map[i].x=(MagickRealType) (0.298839*(
double) i);
952 x_map[i].y=(MagickRealType) (0.298839*(
double) i);
953 x_map[i].z=(MagickRealType) (0.298839*(
double) i);
954 y_map[i].x=(MagickRealType) (0.586811*(
double) i);
955 y_map[i].y=(MagickRealType) (0.586811*(
double) i);
956 y_map[i].z=(MagickRealType) (0.586811*(
double) i);
957 z_map[i].x=(MagickRealType) (0.114350*(
double) i);
958 z_map[i].y=(MagickRealType) (0.114350*(
double) i);
959 z_map[i].z=(MagickRealType) (0.114350*(
double) i);
963 case Rec601YCbCrColorspace:
975 primary_info.y=(double) (MaxMap+1.0)/2.0;
976 primary_info.z=(double) (MaxMap+1.0)/2.0;
977 #if defined(MAGICKCORE_OPENMP_SUPPORT)
978 #pragma omp parallel for schedule(static)
980 for (i=0; i <= (ssize_t) MaxMap; i++)
982 x_map[i].x=(MagickRealType) (0.298839*(
double) i);
983 x_map[i].y=(MagickRealType) (-0.1687367*(
double) i);
984 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
985 y_map[i].x=(MagickRealType) (0.586811*(
double) i);
986 y_map[i].y=(MagickRealType) (-0.331264*(
double) i);
987 y_map[i].z=(MagickRealType) (-0.418688*(
double) i);
988 z_map[i].x=(MagickRealType) (0.114350*(
double) i);
989 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
990 z_map[i].z=(MagickRealType) (-0.081312*(
double) i);
994 case Rec709LumaColorspace:
1001 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1002 #pragma omp parallel for schedule(static)
1004 for (i=0; i <= (ssize_t) MaxMap; i++)
1006 x_map[i].x=(MagickRealType) (0.212656*(
double) i);
1007 x_map[i].y=(MagickRealType) (0.212656*(
double) i);
1008 x_map[i].z=(MagickRealType) (0.212656*(
double) i);
1009 y_map[i].x=(MagickRealType) (0.715158*(
double) i);
1010 y_map[i].y=(MagickRealType) (0.715158*(
double) i);
1011 y_map[i].z=(MagickRealType) (0.715158*(
double) i);
1012 z_map[i].x=(MagickRealType) (0.072186*(
double) i);
1013 z_map[i].y=(MagickRealType) (0.072186*(
double) i);
1014 z_map[i].z=(MagickRealType) (0.072186*(
double) i);
1018 case Rec709YCbCrColorspace:
1030 primary_info.y=(double) (MaxMap+1.0)/2.0;
1031 primary_info.z=(double) (MaxMap+1.0)/2.0;
1032 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1033 #pragma omp parallel for schedule(static)
1035 for (i=0; i <= (ssize_t) MaxMap; i++)
1037 x_map[i].x=(MagickRealType) (0.212656*(
double) i);
1038 x_map[i].y=(MagickRealType) (-0.114572*(
double) i);
1039 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1040 y_map[i].x=(MagickRealType) (0.715158*(
double) i);
1041 y_map[i].y=(MagickRealType) (-0.385428*(
double) i);
1042 y_map[i].z=(MagickRealType) (-0.454153*(
double) i);
1043 z_map[i].x=(MagickRealType) (0.072186*(
double) i);
1044 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1045 z_map[i].z=(MagickRealType) (-0.045847*(
double) i);
1060 primary_info.y=(double) ScaleQuantumToMap(ScaleCharToQuantum(156));
1061 primary_info.z=(double) ScaleQuantumToMap(ScaleCharToQuantum(137));
1062 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
1064 x_map[i].x=0.005382*i;
1065 x_map[i].y=(-0.003296)*i;
1066 x_map[i].z=0.009410*i;
1067 y_map[i].x=0.010566*i;
1068 y_map[i].y=(-0.006471)*i;
1069 y_map[i].z=(-0.007880)*i;
1070 z_map[i].x=0.002052*i;
1071 z_map[i].y=0.009768*i;
1072 z_map[i].z=(-0.001530)*i;
1074 for ( ; i <= (ssize_t) MaxMap; i++)
1076 x_map[i].x=0.298839*(1.099*i-0.099);
1077 x_map[i].y=(-0.298839)*(1.099*i-0.099);
1078 x_map[i].z=0.70100*(1.099*i-0.099);
1079 y_map[i].x=0.586811*(1.099*i-0.099);
1080 y_map[i].y=(-0.586811)*(1.099*i-0.099);
1081 y_map[i].z=(-0.586811)*(1.099*i-0.099);
1082 z_map[i].x=0.114350*(1.099*i-0.099);
1083 z_map[i].y=0.88600*(1.099*i-0.099);
1084 z_map[i].z=(-0.114350)*(1.099*i-0.099);
1093 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1094 #pragma omp parallel for schedule(static)
1096 for (i=0; i <= (ssize_t) MaxMap; i++)
1098 x_map[i].x=(MagickRealType) (1.0*(
double) i);
1099 y_map[i].x=(MagickRealType) 0.0;
1100 z_map[i].x=(MagickRealType) 0.0;
1101 x_map[i].y=(MagickRealType) 0.0;
1102 y_map[i].y=(MagickRealType) (1.0*(
double) i);
1103 z_map[i].y=(MagickRealType) 0.0;
1104 x_map[i].z=(MagickRealType) 0.0;
1105 y_map[i].z=(MagickRealType) 0.0;
1106 z_map[i].z=(MagickRealType) (1.0*(
double) i);
1114 switch (image->storage_class)
1122 image_view=AcquireAuthenticCacheView(image,exception);
1123 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1124 #pragma omp parallel for schedule(static) shared(status) \
1125 magick_number_threads(image,image,image->rows,1)
1127 for (y=0; y < (ssize_t) image->rows; y++)
1146 if (status == MagickFalse)
1148 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1155 for (x=0; x < (ssize_t) image->columns; x++)
1157 red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1159 green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1161 blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1163 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1164 (MagickRealType) primary_info.x;
1165 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1166 (MagickRealType) primary_info.y;
1167 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1168 (MagickRealType) primary_info.z;
1169 SetPixelRed(q,ScaleMapToQuantum(pixel.red));
1170 SetPixelGreen(q,ScaleMapToQuantum(pixel.green));
1171 SetPixelBlue(q,ScaleMapToQuantum(pixel.blue));
1174 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1175 if (sync == MagickFalse)
1177 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1182 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1186 proceed=SetImageProgress(image,RGBTransformImageTag,progress,
1188 if (proceed == MagickFalse)
1192 image_view=DestroyCacheView(image_view);
1205 for (i=0; i < (ssize_t) image->colors; i++)
1210 red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1211 image->colormap[i].red));
1212 green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1213 image->colormap[i].green));
1214 blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1215 image->colormap[i].blue));
1216 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1217 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1218 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1219 image->colormap[i].red=ScaleMapToQuantum(pixel.red);
1220 image->colormap[i].green=ScaleMapToQuantum(pixel.green);
1221 image->colormap[i].blue=ScaleMapToQuantum(pixel.blue);
1223 (void) SyncImage(image);
1233 if (SetImageColorspace(image,colorspace) == MagickFalse)
1234 return(MagickFalse);
1263 MagickExport MagickBooleanType SetImageColorspace(
Image *image,
1264 const ColorspaceType colorspace)
1272 assert(image != (
Image *) NULL);
1273 assert(image->signature == MagickCoreSignature);
1274 if (IsEventLogging() != MagickFalse)
1275 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1276 if (image->colorspace == colorspace)
1278 image->colorspace=colorspace;
1279 image->rendering_intent=UndefinedIntent;
1280 image->gamma=1.000/2.200;
1281 (void) memset(&image->chromaticity,0,
sizeof(image->chromaticity));
1283 if (IsGrayColorspace(colorspace) != MagickFalse)
1285 if (colorspace == LinearGRAYColorspace)
1290 if ((IsRGBColorspace(colorspace) != MagickFalse) ||
1291 (colorspace == XYZColorspace) || (colorspace == xyYColorspace))
1295 image->rendering_intent=PerceptualIntent;
1296 image->chromaticity.red_primary.x=0.6400;
1297 image->chromaticity.red_primary.y=0.3300;
1298 image->chromaticity.red_primary.z=0.0300;
1299 image->chromaticity.green_primary.x=0.3000;
1300 image->chromaticity.green_primary.y=0.6000;
1301 image->chromaticity.green_primary.z=0.1000;
1302 image->chromaticity.blue_primary.x=0.1500;
1303 image->chromaticity.blue_primary.y=0.0600;
1304 image->chromaticity.blue_primary.z=0.7900;
1305 image->chromaticity.white_point.x=0.3127;
1306 image->chromaticity.white_point.y=0.3290;
1307 image->chromaticity.white_point.z=0.3583;
1309 status=SyncImagePixelCache(image,&image->exception);
1341 MagickExport MagickBooleanType SetImageGray(
Image *image,
1362 assert(image != (
Image *) NULL);
1363 assert(image->signature == MagickCoreSignature);
1364 if (IsEventLogging() != MagickFalse)
1365 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1366 if ((image->type == BilevelType) || (image->type == GrayscaleType) ||
1367 (image->type == GrayscaleMatteType))
1369 if ((IsGrayColorspace(image->colorspace) == MagickFalse) &&
1370 (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse))
1371 return(MagickFalse);
1372 value=GetImageProperty(image,
"colorspace:auto-grayscale");
1373 if (IsStringNotFalse(value) == MagickFalse)
1374 return(MagickFalse);
1376 image_view=AcquireVirtualCacheView(image,exception);
1377 for (y=0; y < (ssize_t) image->rows; y++)
1379 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1382 for (x=0; x < (ssize_t) image->columns; x++)
1384 if (IsGrayPixel(p) == MagickFalse)
1389 if ((type == BilevelType) && (IsMonochromePixel(p) == MagickFalse))
1393 if (type == UndefinedType)
1396 image_view=DestroyCacheView(image_view);
1397 if (type == UndefinedType)
1398 return(MagickFalse);
1399 image->colorspace=GRAYColorspace;
1400 if (SyncImagePixelCache((
Image *) image,exception) == MagickFalse)
1401 return(MagickFalse);
1403 if ((type == GrayscaleType) && (image->matte != MagickFalse))
1404 image->type=GrayscaleMatteType;
1435 MagickExport MagickBooleanType SetImageMonochrome(
Image *image,
1456 assert(image != (
Image *) NULL);
1457 assert(image->signature == MagickCoreSignature);
1458 if (IsEventLogging() != MagickFalse)
1459 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1460 if (IsMonochromeImage(image,&image->exception) != MagickFalse)
1462 if ((IsGrayColorspace(image->colorspace) == MagickFalse) &&
1463 (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse))
1464 return(MagickFalse);
1465 value=GetImageProperty(image,
"colorspace:auto-grayscale");
1466 if (IsStringNotFalse(value) == MagickFalse)
1467 return(MagickFalse);
1469 image_view=AcquireVirtualCacheView(image,exception);
1470 for (y=0; y < (ssize_t) image->rows; y++)
1472 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1475 for (x=0; x < (ssize_t) image->columns; x++)
1477 if (IsMonochromePixel(p) == MagickFalse)
1484 if (type == UndefinedType)
1487 image_view=DestroyCacheView(image_view);
1488 if (type == UndefinedType)
1489 return(MagickFalse);
1490 image->colorspace=GRAYColorspace;
1491 if (SyncImagePixelCache((
Image *) image,exception) == MagickFalse)
1492 return(MagickFalse);
1522 MagickExport MagickBooleanType TransformImageColorspace(
Image *image,
1523 const ColorspaceType colorspace)
1528 assert(image != (
Image *) NULL);
1529 assert(image->signature == MagickCoreSignature);
1530 if (IsEventLogging() != MagickFalse)
1531 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1532 if (image->colorspace == colorspace)
1534 (void) DeleteImageProfile(image,
"icc");
1535 (void) DeleteImageProfile(image,
"icm");
1536 if (colorspace == UndefinedColorspace)
1537 return(SetImageColorspace(image,colorspace));
1541 if (IssRGBColorspace(colorspace) != MagickFalse)
1542 return(TransformRGBImage(image,image->colorspace));
1544 if (IssRGBColorspace(image->colorspace) == MagickFalse)
1545 status=TransformRGBImage(image,image->colorspace);
1546 if (status == MagickFalse)
1551 if (RGBTransformImage(image,colorspace) == MagickFalse)
1585 static inline void ConvertCMYToRGB(
const double cyan,
const double magenta,
1586 const double yellow,Quantum *red,Quantum *green,Quantum *blue)
1588 *red=ClampToQuantum((MagickRealType) QuantumRange*(1.0-cyan));
1589 *green=ClampToQuantum((MagickRealType) QuantumRange*(1.0-magenta));
1590 *blue=ClampToQuantum((MagickRealType) QuantumRange*(1.0-yellow));
1593 static inline void ConvertLMSToXYZ(
const double L,
const double M,
const double S,
1594 double *X,
double *Y,
double *Z)
1596 *X=1.096123820835514*L-0.278869000218287*M+0.182745179382773*S;
1597 *Y=0.454369041975359*L+0.473533154307412*M+0.072097803717229*S;
1598 *Z=(-0.009627608738429)*L-0.005698031216113*M+1.015325639954543*S;
1601 static inline void ConvertLMSToRGB(
const double L,
const double M,
1602 const double S,Quantum *red,Quantum *green,Quantum *blue)
1609 ConvertLMSToXYZ(L,M,S,&X,&Y,&Z);
1610 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1613 static inline void ConvertLuvToRGB(
const double L,
const double u,
1614 const double v,Quantum *red,Quantum *green,Quantum *blue)
1621 ConvertLuvToXYZ(100.0*L,354.0*u-134.0,262.0*v-140.0,&X,&Y,&Z);
1622 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1625 static inline ssize_t RoundToYCC(
const MagickRealType value)
1629 if (value >= 1388.0)
1631 return((ssize_t) (value+0.5));
1634 static inline void ConvertLabToRGB(
const double L,
const double a,
1635 const double b,Quantum *red,Quantum *green,Quantum *blue)
1642 ConvertLabToXYZ(100.0*L,255.0*(a-0.5),255.0*(b-0.5),&X,&Y,&Z);
1643 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1646 static inline void ConvertxyYToRGB(
const double low_x,
const double low_y,
1647 const double cap_Y,Quantum *red,Quantum *green,Quantum *blue)
1655 gamma=PerceptibleReciprocal(low_y);
1656 X=gamma*cap_Y*low_x;
1658 Z=gamma*cap_Y*(1.0-low_x-low_y);
1659 ConvertXYZToRGB(X,Y,Z,red,green,blue);
1662 static void ConvertYPbPrToRGB(
const double Y,
const double Pb,
const double Pr,
1663 Quantum *red,Quantum *green,Quantum *blue)
1665 *red=ClampToQuantum((MagickRealType) QuantumRange*(0.99999999999914679361*Y-
1666 1.2188941887145875e-06*(Pb-0.5)+1.4019995886561440468*(Pr-0.5)));
1667 *green=ClampToQuantum((MagickRealType) QuantumRange*(0.99999975910502514331*Y-
1668 0.34413567816504303521*(Pb-0.5)-0.71413649331646789076*(Pr-0.5)));
1669 *blue=ClampToQuantum((MagickRealType) QuantumRange*(1.00000124040004623180*Y+
1670 1.77200006607230409200*(Pb-0.5)+2.1453384174593273e-06*(Pr-0.5)));
1673 static void ConvertYCbCrToRGB(
const double Y,
const double Cb,
1674 const double Cr,Quantum *red,Quantum *green,Quantum *blue)
1676 ConvertYPbPrToRGB(Y,Cb,Cr,red,green,blue);
1679 static void ConvertYDbDrToRGB(
const double Y,
const double Db,
const double Dr,
1680 Quantum *red,Quantum *green,Quantum *blue)
1682 *red=ClampToQuantum((MagickRealType) QuantumRange*(Y+9.2303716147657e-05*
1683 (Db-0.5)-0.52591263066186533*(Dr-0.5)));
1684 *green=ClampToQuantum((MagickRealType) QuantumRange*(Y-0.12913289889050927*
1685 (Db-0.5)+0.26789932820759876*(Dr-0.5)));
1686 *blue=ClampToQuantum((MagickRealType) QuantumRange*(Y+0.66467905997895482*
1687 (Db-0.5)-7.9202543533108e-05*(Dr-0.5)));
1690 static void ConvertYIQToRGB(
const double Y,
const double I,
const double Q,
1691 Quantum *red,Quantum *green,Quantum *blue)
1693 *red=ClampToQuantum((MagickRealType) QuantumRange*(Y+0.9562957197589482261*
1694 (I-0.5)+0.6210244164652610754*(Q-0.5)));
1695 *green=ClampToQuantum((MagickRealType) QuantumRange*(Y-0.2721220993185104464*
1696 (I-0.5)-0.6473805968256950427*(Q-0.5)));
1697 *blue=ClampToQuantum((MagickRealType) QuantumRange*(Y-1.1069890167364901945*
1698 (I-0.5)+1.7046149983646481374*(Q-0.5)));
1701 static void ConvertYUVToRGB(
const double Y,
const double U,
const double V,
1702 Quantum *red,Quantum *green,Quantum *blue)
1704 *red=ClampToQuantum((MagickRealType) QuantumRange*(Y-3.945707070708279e-05*
1705 (U-0.5)+1.1398279671717170825*(V-0.5)));
1706 *green=ClampToQuantum((MagickRealType) QuantumRange*(Y-0.3946101641414141437*
1707 (U-0.5)-0.5805003156565656797*(V-0.5)));
1708 *blue=ClampToQuantum((MagickRealType) QuantumRange*(Y+2.0319996843434342537*
1709 (U-0.5)-4.813762626262513e-04*(V-0.5)));
1712 MagickExport MagickBooleanType TransformRGBImage(
Image *image,
1713 const ColorspaceType colorspace)
1715 #define TransformRGBImageTag "Transform/Image"
1720 0.000000, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1721 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1722 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1723 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1724 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1725 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1726 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1727 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1728 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1729 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1730 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1731 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1732 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1733 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1734 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1735 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1736 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1737 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1738 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1739 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1740 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1741 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1742 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1743 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1744 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1745 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1746 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1747 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1748 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1749 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1750 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1751 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1752 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1753 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1754 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1755 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1756 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1757 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1758 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1759 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1760 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1761 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1762 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1763 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1764 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1765 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1766 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1767 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1768 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1769 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1770 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1771 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1772 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1773 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1774 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1775 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1776 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1777 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1778 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1779 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1780 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1781 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1782 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1783 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1784 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1785 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1786 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1787 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1788 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1789 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1790 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1791 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1792 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1793 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1794 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1795 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1796 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1797 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1798 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1799 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1800 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1801 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1802 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1803 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1804 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1805 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1806 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1807 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1808 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1809 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1810 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1811 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1812 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1813 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1814 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1815 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1816 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1817 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1818 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1819 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1820 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1821 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1822 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1823 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1824 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1825 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1826 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1827 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1828 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1829 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1830 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1831 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1832 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1833 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1834 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1835 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1836 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1837 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1838 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1839 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1840 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1841 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1842 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1843 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1844 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1845 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1846 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1847 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1848 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1849 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1850 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1851 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1852 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1853 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1854 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1855 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1856 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1857 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1858 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1859 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1860 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1861 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1862 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1863 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1864 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1865 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1866 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1867 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1868 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1869 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1870 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1871 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1872 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1873 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1874 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1875 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1876 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1877 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1878 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1879 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1880 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1881 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1882 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1883 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
1884 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
1885 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
1886 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
1887 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
1888 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
1889 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
1890 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
1891 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
1892 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
1893 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
1894 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
1895 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
1896 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
1897 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
1898 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
1899 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
1900 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
1901 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
1902 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
1903 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
1904 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
1905 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
1906 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
1907 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
1908 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
1909 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
1910 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
1911 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
1912 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
1913 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
1914 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
1915 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
1916 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
1917 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
1918 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
1919 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
1920 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
1921 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
1922 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
1923 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
1924 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
1925 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
1926 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
1927 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
1928 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
1929 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
1930 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
1931 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
1932 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
1933 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
1934 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
1935 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
1936 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
1937 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
1938 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
1939 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
1940 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
1941 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
1942 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
1943 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
1944 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
1945 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
1946 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
1947 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
1948 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
1949 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
1950 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
1951 0.998559f, 0.999280f, 1.000000
1977 assert(image != (
Image *) NULL);
1978 assert(image->signature == MagickCoreSignature);
1979 if (IsEventLogging() != MagickFalse)
1980 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1983 exception=(&image->exception);
1986 case CMYKColorspace:
1994 if (image->storage_class == PseudoClass)
1996 if (SyncImage(image) == MagickFalse)
1997 return(MagickFalse);
1998 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
1999 return(MagickFalse);
2001 GetMagickPixelPacket(image,&zero);
2002 image_view=AcquireAuthenticCacheView(image,exception);
2003 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2004 #pragma omp parallel for schedule(static) shared(status) \
2005 magick_number_threads(image,image,image->rows,1)
2007 for (y=0; y < (ssize_t) image->rows; y++)
2016 *magick_restrict indexes;
2024 if (status == MagickFalse)
2026 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2033 indexes=GetCacheViewAuthenticIndexQueue(image_view);
2035 for (x=0; x < (ssize_t) image->columns; x++)
2037 SetMagickPixelPacket(image,q,indexes+x,&pixel);
2038 ConvertCMYKToRGB(&pixel);
2039 SetPixelPacket(image,&pixel,q,indexes+x);
2042 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2043 if (sync == MagickFalse)
2046 image_view=DestroyCacheView(image_view);
2047 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2048 return(MagickFalse);
2051 case LinearGRAYColorspace:
2052 case Rec601LumaColorspace:
2057 if (image->storage_class == PseudoClass)
2059 if (SyncImage(image) == MagickFalse)
2060 return(MagickFalse);
2061 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2062 return(MagickFalse);
2064 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2065 return(MagickFalse);
2066 image_view=AcquireAuthenticCacheView(image,exception);
2067 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2068 #pragma omp parallel for schedule(static) shared(status) \
2069 magick_number_threads(image,image,image->rows,1)
2071 for (y=0; y < (ssize_t) image->rows; y++)
2082 if (status == MagickFalse)
2084 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2091 for (x=(ssize_t) image->columns; x != 0; x--)
2096 gray=0.212656*EncodePixelGamma(GetPixelRed(q))+0.715158*
2097 EncodePixelGamma(GetPixelGreen(q))+0.072186*
2098 EncodePixelGamma(GetPixelBlue(q));
2099 SetPixelRed(q,ClampToQuantum(gray));
2100 SetPixelGreen(q,ClampToQuantum(gray));
2101 SetPixelBlue(q,ClampToQuantum(gray));
2104 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2105 if (sync == MagickFalse)
2108 image_view=DestroyCacheView(image_view);
2109 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2110 return(MagickFalse);
2113 case GRAYColorspace:
2114 case Rec709LumaColorspace:
2119 if (image->storage_class == PseudoClass)
2121 if (SyncImage(image) == MagickFalse)
2122 return(MagickFalse);
2123 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2124 return(MagickFalse);
2126 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2127 return(MagickFalse);
2128 image_view=AcquireAuthenticCacheView(image,exception);
2129 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2130 #pragma omp parallel for schedule(static) shared(status) \
2131 magick_number_threads(image,image,image->rows,1)
2133 for (y=0; y < (ssize_t) image->rows; y++)
2144 if (status == MagickFalse)
2146 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2153 for (x=(ssize_t) image->columns; x != 0; x--)
2158 gray=(MagickRealType) (0.212656*(
double) GetPixelRed(q)+0.715158*
2159 (double) GetPixelGreen(q)+0.072186*(double) GetPixelBlue(q));
2160 SetPixelRed(q,ClampToQuantum(gray));
2161 SetPixelGreen(q,ClampToQuantum(gray));
2162 SetPixelBlue(q,ClampToQuantum(gray));
2165 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2166 if (sync == MagickFalse)
2169 image_view=DestroyCacheView(image_view);
2170 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2171 return(MagickFalse);
2176 case HCLpColorspace:
2184 case LCHabColorspace:
2185 case LCHuvColorspace:
2190 case YCbCrColorspace:
2191 case YDbDrColorspace:
2193 case YPbPrColorspace:
2199 if (image->storage_class == PseudoClass)
2201 if (SyncImage(image) == MagickFalse)
2202 return(MagickFalse);
2203 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2204 return(MagickFalse);
2206 image_view=AcquireAuthenticCacheView(image,exception);
2207 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2208 #pragma omp parallel for schedule(static) shared(status) \
2209 magick_number_threads(image,image,image->rows,1)
2211 for (y=0; y < (ssize_t) image->rows; y++)
2222 if (status == MagickFalse)
2224 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2231 for (x=0; x < (ssize_t) image->columns; x++)
2243 X=QuantumScale*(double) GetPixelRed(q);
2244 Y=QuantumScale*(double) GetPixelGreen(q);
2245 Z=QuantumScale*(double) GetPixelBlue(q);
2250 ConvertCMYToRGB(X,Y,Z,&red,&green,&blue);
2255 ConvertHCLToRGB(X,Y,Z,&red,&green,&blue);
2258 case HCLpColorspace:
2260 ConvertHCLpToRGB(X,Y,Z,&red,&green,&blue);
2265 ConvertHSBToRGB(X,Y,Z,&red,&green,&blue);
2270 ConvertHSIToRGB(X,Y,Z,&red,&green,&blue);
2275 ConvertHSLToRGB(X,Y,Z,&red,&green,&blue);
2280 ConvertHSVToRGB(X,Y,Z,&red,&green,&blue);
2285 ConvertHWBToRGB(X,Y,Z,&red,&green,&blue);
2290 ConvertLabToRGB(X,Y,Z,&red,&green,&blue);
2294 case LCHabColorspace:
2296 ConvertLCHabToRGB(X,Y,Z,&red,&green,&blue);
2299 case LCHuvColorspace:
2301 ConvertLCHuvToRGB(X,Y,Z,&red,&green,&blue);
2306 ConvertLMSToRGB(X,Y,Z,&red,&green,&blue);
2311 ConvertLuvToRGB(X,Y,Z,&red,&green,&blue);
2316 ConvertxyYToRGB(X,Y,Z,&red,&green,&blue);
2321 ConvertXYZToRGB(X,Y,Z,&red,&green,&blue);
2324 case YCbCrColorspace:
2326 ConvertYCbCrToRGB(X,Y,Z,&red,&green,&blue);
2329 case YDbDrColorspace:
2331 ConvertYDbDrToRGB(X,Y,Z,&red,&green,&blue);
2336 ConvertYIQToRGB(X,Y,Z,&red,&green,&blue);
2339 case YPbPrColorspace:
2341 ConvertYPbPrToRGB(X,Y,Z,&red,&green,&blue);
2346 ConvertYUVToRGB(X,Y,Z,&red,&green,&blue);
2351 red=ClampToQuantum((MagickRealType) QuantumRange*X);
2352 green=ClampToQuantum((MagickRealType) QuantumRange*Y);
2353 blue=ClampToQuantum((MagickRealType) QuantumRange*Z);
2357 SetPixelRed(q,ClampToQuantum((MagickRealType) red));
2358 SetPixelGreen(q,ClampToQuantum((MagickRealType) green));
2359 SetPixelBlue(q,ClampToQuantum((MagickRealType) blue));
2362 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2363 if (sync == MagickFalse)
2366 image_view=DestroyCacheView(image_view);
2367 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2368 return(MagickFalse);
2390 density=DisplayGamma;
2392 value=GetImageProperty(image,
"gamma");
2393 if (value != (
const char *) NULL)
2394 gamma=PerceptibleReciprocal(StringToDouble(value,(
char **) NULL));
2395 film_gamma=FilmGamma;
2396 value=GetImageProperty(image,
"film-gamma");
2397 if (value != (
const char *) NULL)
2398 film_gamma=StringToDouble(value,(
char **) NULL);
2399 reference_black=ReferenceBlack;
2400 value=GetImageProperty(image,
"reference-black");
2401 if (value != (
const char *) NULL)
2402 reference_black=StringToDouble(value,(
char **) NULL);
2403 reference_white=ReferenceWhite;
2404 value=GetImageProperty(image,
"reference-white");
2405 if (value != (
const char *) NULL)
2406 reference_white=StringToDouble(value,(
char **) NULL);
2407 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2409 if (logmap == (Quantum *) NULL)
2410 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2412 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
2413 PerceptibleReciprocal(film_gamma));
2414 for (i=0; i <= (ssize_t) (reference_black*MaxMap/1024.0); i++)
2415 logmap[i]=(Quantum) 0;
2416 for ( ; i < (ssize_t) (reference_white*MaxMap/1024.0); i++)
2417 logmap[i]=ClampToQuantum((MagickRealType) QuantumRange/(1.0-black)*
2418 (pow(10.0,(1024.0*i/MaxMap-reference_white)*(gamma/density)*0.002*
2419 PerceptibleReciprocal(film_gamma))-black));
2420 for ( ; i <= (ssize_t) MaxMap; i++)
2421 logmap[i]=QuantumRange;
2422 if (image->storage_class == PseudoClass)
2424 if (SyncImage(image) == MagickFalse)
2425 return(MagickFalse);
2426 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2427 return(MagickFalse);
2429 image_view=AcquireAuthenticCacheView(image,exception);
2430 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2431 #pragma omp parallel for schedule(static) shared(status) \
2432 magick_number_threads(image,image,image->rows,1)
2434 for (y=0; y < (ssize_t) image->rows; y++)
2445 if (status == MagickFalse)
2447 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2454 for (x=(ssize_t) image->columns; x != 0; x--)
2461 red=ClampToQuantum(EncodePixelGamma((MagickRealType)
2462 logmap[ScaleQuantumToMap(GetPixelRed(q))]));
2463 green=ClampToQuantum(EncodePixelGamma((MagickRealType)
2464 logmap[ScaleQuantumToMap(GetPixelGreen(q))]));
2465 blue=ClampToQuantum(EncodePixelGamma((MagickRealType)
2466 logmap[ScaleQuantumToMap(GetPixelBlue(q))]));
2468 SetPixelGreen(q,green);
2469 SetPixelBlue(q,blue);
2472 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2473 if (sync == MagickFalse)
2476 image_view=DestroyCacheView(image_view);
2477 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2478 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2479 return(MagickFalse);
2483 case scRGBColorspace:
2488 if (image->storage_class == PseudoClass)
2490 if (SyncImage(image) == MagickFalse)
2491 return(MagickFalse);
2492 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
2493 return(MagickFalse);
2495 image_view=AcquireAuthenticCacheView(image,exception);
2496 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2497 #pragma omp parallel for schedule(static) shared(status) \
2498 magick_number_threads(image,image,image->rows,1)
2500 for (y=0; y < (ssize_t) image->rows; y++)
2511 if (status == MagickFalse)
2513 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2520 for (x=(ssize_t) image->columns; x != 0; x--)
2527 red=ClampToQuantum(EncodePixelGamma((MagickRealType) GetPixelRed(q)));
2528 green=ClampToQuantum(EncodePixelGamma((MagickRealType)
2530 blue=ClampToQuantum(EncodePixelGamma((MagickRealType)
2533 SetPixelGreen(q,green);
2534 SetPixelBlue(q,blue);
2537 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2538 if (sync == MagickFalse)
2541 image_view=DestroyCacheView(image_view);
2542 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2543 return(MagickFalse);
2568 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2573 case OHTAColorspace:
2585 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2586 #pragma omp parallel for schedule(static)
2588 for (i=0; i <= (ssize_t) MaxMap; i++)
2590 x_map[i].x=(1.0*(double) i);
2591 y_map[i].x=(0.5*1.00000*(2.0*(double) i-MaxMap));
2592 z_map[i].x=(-0.5*0.66668*(2.0*(double) i-MaxMap));
2593 x_map[i].y=(1.0*(double) i);
2594 y_map[i].y=(0.5*0.00000*(2.0*(double) i-MaxMap));
2595 z_map[i].y=(0.5*1.33333*(2.0*(double) i-MaxMap));
2596 x_map[i].z=(1.0*(double) i);
2597 y_map[i].z=(-0.5*1.00000*(2.0*(double) i-MaxMap));
2598 z_map[i].z=(-0.5*0.66668*(2.0*(double) i-MaxMap));
2602 case Rec601YCbCrColorspace:
2614 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2615 #pragma omp parallel for schedule(static)
2617 for (i=0; i <= (ssize_t) MaxMap; i++)
2619 x_map[i].x=0.99999999999914679361*(double) i;
2620 y_map[i].x=0.5*(-1.2188941887145875e-06)*(2.00*(
double) i-MaxMap);
2621 z_map[i].x=0.5*1.4019995886561440468*(2.00*(double) i-MaxMap);
2622 x_map[i].y=0.99999975910502514331*(double) i;
2623 y_map[i].y=0.5*(-0.34413567816504303521)*(2.00*(
double) i-MaxMap);
2624 z_map[i].y=0.5*(-0.71413649331646789076)*(2.00*(
double) i-MaxMap);
2625 x_map[i].z=1.00000124040004623180*(double) i;
2626 y_map[i].z=0.5*1.77200006607230409200*(2.00*(double) i-MaxMap);
2627 z_map[i].z=0.5*2.1453384174593273e-06*(2.00*(double) i-MaxMap);
2631 case Rec709YCbCrColorspace:
2643 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2644 #pragma omp parallel for schedule(static)
2646 for (i=0; i <= (ssize_t) MaxMap; i++)
2648 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2649 y_map[i].x=(MagickRealType) (0.5*0.000000*(2.0*(
double) i-MaxMap));
2650 z_map[i].x=(MagickRealType) (0.5*1.574800*(2.0*(
double) i-MaxMap));
2651 x_map[i].y=(MagickRealType) (1.0*(
double) i);
2652 y_map[i].y=(MagickRealType) (0.5*(-0.187324)*(2.0*(double) i-MaxMap));
2653 z_map[i].y=(MagickRealType) (0.5*(-0.468124)*(2.0*(double) i-MaxMap));
2654 x_map[i].z=(MagickRealType) (1.0*(
double) i);
2655 y_map[i].z=(MagickRealType) (0.5*1.855600*(2.0*(
double) i-MaxMap));
2656 z_map[i].z=(MagickRealType) (0.5*0.000000*(2.0*(
double) i-MaxMap));
2671 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2672 #pragma omp parallel for schedule(static)
2674 for (i=0; i <= (ssize_t) MaxMap; i++)
2676 x_map[i].x=(MagickRealType) (1.3584000*(
double) i);
2677 y_map[i].x=(MagickRealType) (0.0000000);
2678 z_map[i].x=(MagickRealType) (1.8215000*((
double) i-(MagickRealType)
2679 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2680 x_map[i].y=(MagickRealType) (1.3584000*(
double) i);
2681 y_map[i].y=(MagickRealType) ((-0.4302726)*((double) i-(MagickRealType)
2682 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2683 z_map[i].y=(MagickRealType) ((-0.9271435)*((double) i-(MagickRealType)
2684 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2685 x_map[i].z=(MagickRealType) (1.3584000*(
double) i);
2686 y_map[i].z=(MagickRealType) (2.2179000*((
double) i-(MagickRealType)
2687 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2688 z_map[i].z=(MagickRealType) (0.0000000);
2697 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2698 #pragma omp parallel for schedule(static)
2700 for (i=0; i <= (ssize_t) MaxMap; i++)
2702 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2703 y_map[i].x=(MagickRealType) 0.0;
2704 z_map[i].x=(MagickRealType) 0.0;
2705 x_map[i].y=(MagickRealType) 0.0;
2706 y_map[i].y=(MagickRealType) (1.0*(
double) i);
2707 z_map[i].y=(MagickRealType) 0.0;
2708 x_map[i].z=(MagickRealType) 0.0;
2709 y_map[i].z=(MagickRealType) 0.0;
2710 z_map[i].z=(MagickRealType) (1.0*(
double) i);
2718 switch (image->storage_class)
2726 image_view=AcquireAuthenticCacheView(image,exception);
2727 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2728 #pragma omp parallel for schedule(static) shared(status) \
2729 magick_number_threads(image,image,image->rows,1)
2731 for (y=0; y < (ssize_t) image->rows; y++)
2745 if (status == MagickFalse)
2747 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2754 for (x=0; x < (ssize_t) image->columns; x++)
2761 red=ScaleQuantumToMap(GetPixelRed(q));
2762 green=ScaleQuantumToMap(GetPixelGreen(q));
2763 blue=ScaleQuantumToMap(GetPixelBlue(q));
2764 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2765 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2766 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2767 if (colorspace == YCCColorspace)
2769 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
2771 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
2773 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
2778 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2779 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2780 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2782 SetPixelRed(q,ClampToQuantum(pixel.red));
2783 SetPixelGreen(q,ClampToQuantum(pixel.green));
2784 SetPixelBlue(q,ClampToQuantum(pixel.blue));
2787 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2788 if (sync == MagickFalse)
2790 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2795 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2799 proceed=SetImageProgress(image,TransformRGBImageTag,progress,
2801 if (proceed == MagickFalse)
2805 image_view=DestroyCacheView(image_view);
2813 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2814 #pragma omp parallel for schedule(static) shared(status) \
2815 magick_number_threads(image,image,image->colors,1)
2817 for (i=0; i < (ssize_t) image->colors; i++)
2827 red=ScaleQuantumToMap(image->colormap[i].red);
2828 green=ScaleQuantumToMap(image->colormap[i].green);
2829 blue=ScaleQuantumToMap(image->colormap[i].blue);
2830 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2831 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2832 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2833 if (colorspace == YCCColorspace)
2835 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
2837 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
2839 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
2844 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2845 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2846 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2848 image->colormap[i].red=ClampToQuantum(pixel.red);
2849 image->colormap[i].green=ClampToQuantum(pixel.green);
2850 image->colormap[i].blue=ClampToQuantum(pixel.blue);
2852 (void) SyncImage(image);
2862 if (SetImageColorspace(image,sRGBColorspace) == MagickFalse)
2863 return(MagickFalse);