42#include "MagickCore/studio.h"
43#include "MagickCore/artifact.h"
44#include "MagickCore/attribute.h"
45#include "MagickCore/property.h"
46#include "MagickCore/cache.h"
47#include "MagickCore/cache-private.h"
48#include "MagickCore/cache-view.h"
49#include "MagickCore/color.h"
50#include "MagickCore/color-private.h"
51#include "MagickCore/colorspace.h"
52#include "MagickCore/colorspace-private.h"
53#include "MagickCore/exception.h"
54#include "MagickCore/exception-private.h"
55#include "MagickCore/enhance.h"
56#include "MagickCore/image.h"
57#include "MagickCore/image-private.h"
58#include "MagickCore/gem.h"
59#include "MagickCore/gem-private.h"
60#include "MagickCore/memory_.h"
61#include "MagickCore/monitor.h"
62#include "MagickCore/monitor-private.h"
63#include "MagickCore/option.h"
64#include "MagickCore/pixel-accessor.h"
65#include "MagickCore/quantize.h"
66#include "MagickCore/quantum.h"
67#include "MagickCore/quantum-private.h"
68#include "MagickCore/resource_.h"
69#include "MagickCore/string_.h"
70#include "MagickCore/string-private.h"
71#include "MagickCore/utility.h"
76#define MaximumLogarithmicColorspace 1024.0
92static MagickBooleanType
93 TransformsRGBImage(Image *,ExceptionInfo *);
123MagickPrivate
void ConformPixelInfoColorspace(
const Image *image,
124 PixelInfo *pixel,ExceptionInfo *exception)
133 white_luminance = 10000.0;
136 illuminant = D65Illuminant;
138 assert(image != (
const Image *) NULL);
139 assert(image->signature == MagickCoreSignature);
140 assert(pixel != (PixelInfo *) NULL);
141 if ((pixel->colorspace == image->colorspace) ||
142 (pixel->colorspace == CMYKColorspace) ||
143 (IssRGBCompatibleColorspace(pixel->colorspace) != MagickFalse))
145 value=GetImageArtifact(image,
"color:illuminant");
146 if (value != (
const char *) NULL)
151 illuminant_type=ParseCommandOption(MagickIlluminantOptions,MagickFalse,
153 if (illuminant_type < 0)
154 illuminant=UndefinedIlluminant;
156 illuminant=(IlluminantType) illuminant_type;
158 value=GetImageProperty(image,
"white-luminance",exception);
159 if (value != (
const char *) NULL)
160 white_luminance=StringToDouble(value,(
char **) NULL);
161 ConvertGenericToRGB(pixel->colorspace,QuantumScale*pixel->red,
162 QuantumScale*pixel->green,QuantumScale*pixel->blue,white_luminance,
163 illuminant,&red,&green,&blue);
164 pixel->colorspace=sRGBColorspace;
165 if ((image->colorspace != CMYKColorspace) &&
166 (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse))
173 ConvertRGBToGeneric(image->colorspace,red,green,blue,white_luminance,
174 illuminant,&X,&Y,&Z);
175 red=(double) QuantumRange*X;
176 green=(double) QuantumRange*Y;
177 blue=(double) QuantumRange*Z;
178 pixel->colorspace=image->colorspace;
180 pixel->red=(MagickRealType) ClampToQuantum(red);
181 pixel->green=(MagickRealType) ClampToQuantum(green);
182 pixel->blue=(MagickRealType) ClampToQuantum(blue);
217MagickPrivate
void ConvertGenericToRGB(
const ColorspaceType colorspace,
218 const double X,
const double Y,
const double Z,
const double white_luminance,
219 const IlluminantType illuminant,
double *R,
double *G,
double *B)
223 case Adobe98Colorspace:
225 ConvertAdobe98ToRGB(X,Y,Z,R,G,B);
228 case CAT02LMSColorspace:
235 ConvertXYZToCAT02LMS(X,Y,Z,&L,&M,&S);
236 ConvertCAT02LMSToRGB(L,M,S,R,G,B);
241 ConvertCMYToRGB(X,Y,Z,R,G,B);
244 case DisplayP3Colorspace:
246 ConvertDisplayP3ToRGB(X,Y,Z,R,G,B);
251 ConvertHCLToRGB(X,Y,Z,R,G,B);
256 ConvertHCLpToRGB(X,Y,Z,R,G,B);
261 ConvertHSBToRGB(X,Y,Z,R,G,B);
266 ConvertHSIToRGB(X,Y,Z,R,G,B);
271 ConvertHSLToRGB(X,Y,Z,R,G,B);
276 ConvertHSVToRGB(X,Y,Z,R,G,B);
281 ConvertHWBToRGB(X,Y,Z,R,G,B);
284 case JzazbzColorspace:
286 ConvertJzazbzToRGB(X,Y,Z,white_luminance,R,G,B);
291 ConvertLabToRGB(X,Y,Z,illuminant,R,G,B);
295 case LCHabColorspace:
297 ConvertLCHabToRGB(X,Y,Z,illuminant,R,G,B);
300 case LCHuvColorspace:
302 ConvertLCHuvToRGB(X,Y,Z,illuminant,R,G,B);
307 ConvertLMSToRGB(X,Y,Z,R,G,B);
312 ConvertLuvToRGB(X,Y,Z,illuminant,R,G,B);
315 case OklabColorspace:
317 ConvertOklabToRGB(X,Y,Z,R,G,B);
320 case OklchColorspace:
322 ConvertOklchToRGB(X,Y,Z,R,G,B);
325 case ProPhotoColorspace:
327 ConvertProPhotoToRGB(X,Y,Z,R,G,B);
332 ConvertxyYToRGB(X,Y,Z,R,G,B);
337 ConvertXYZToRGB(X,Y,Z,R,G,B);
340 case YCbCrColorspace:
342 ConvertYCbCrToRGB(X,Y,Z,R,G,B);
345 case YDbDrColorspace:
347 ConvertYDbDrToRGB(X,Y,Z,R,G,B);
352 ConvertYIQToRGB(X,Y,Z,R,G,B);
355 case YPbPrColorspace:
357 ConvertYPbPrToRGB(X,Y,Z,R,G,B);
362 ConvertYUVToRGB(X,Y,Z,R,G,B);
367 *R=(double) QuantumRange*X;
368 *G=(double) QuantumRange*Y;
369 *B=(double) QuantumRange*Z;
402MagickExport
void ConvertHSLToRGB(
const double hue,
const double saturation,
403 const double lightness,
double *red,
double *green,
double *blue)
414 assert(red != (
double *) NULL);
415 assert(green != (
double *) NULL);
416 assert(blue != (
double *) NULL);
418 if (lightness <= 0.5)
419 c=2.0*lightness*saturation;
421 c=(2.0-2.0*lightness)*saturation;
423 h-=360.0*floor(h/360.0);
425 x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0));
426 switch ((
int) floor(h))
431 *red=(double) QuantumRange*(min+c);
432 *green=(double) QuantumRange*(min+x);
433 *blue=(double) QuantumRange*min;
438 *red=(double) QuantumRange*(min+x);
439 *green=(double) QuantumRange*(min+c);
440 *blue=(double) QuantumRange*min;
445 *red=(double) QuantumRange*min;
446 *green=(double) QuantumRange*(min+c);
447 *blue=(double) QuantumRange*(min+x);
452 *red=(double) QuantumRange*min;
453 *green=(double) QuantumRange*(min+x);
454 *blue=(double) QuantumRange*(min+c);
459 *red=(double) QuantumRange*(min+x);
460 *green=(double) QuantumRange*min;
461 *blue=(double) QuantumRange*(min+c);
466 *red=(double) QuantumRange*(min+c);
467 *green=(double) QuantumRange*min;
468 *blue=(double) QuantumRange*(min+x);
506MagickPrivate
void ConvertRGBToGeneric(
const ColorspaceType colorspace,
507 const double R,
const double G,
const double B,
const double white_luminance,
508 const IlluminantType illuminant,
double *X,
double *Y,
double *Z)
512 case Adobe98Colorspace:
514 ConvertRGBToAdobe98(R,G,B,X,Y,Z);
517 case CAT02LMSColorspace:
524 ConvertRGBToCAT02LMS(R,G,B,&L,&M,&S);
525 ConvertCAT02LMSToXYZ(L,M,S,X,Y,Z);
530 ConvertRGBToCMY(R,G,B,X,Y,Z);
533 case DisplayP3Colorspace:
535 ConvertRGBToDisplayP3(R,G,B,X,Y,Z);
540 ConvertRGBToHCL(R,G,B,X,Y,Z);
545 ConvertRGBToHCLp(R,G,B,X,Y,Z);
550 ConvertRGBToHSB(R,G,B,X,Y,Z);
555 ConvertRGBToHSI(R,G,B,X,Y,Z);
560 ConvertRGBToHSL(R,G,B,X,Y,Z);
565 ConvertRGBToHSV(R,G,B,X,Y,Z);
570 ConvertRGBToHWB(R,G,B,X,Y,Z);
573 case JzazbzColorspace:
575 ConvertRGBToJzazbz(R,G,B,white_luminance,X,Y,Z);
580 ConvertRGBToLab(R,G,B,illuminant,X,Y,Z);
584 case LCHabColorspace:
586 ConvertRGBToLCHab(R,G,B,illuminant,X,Y,Z);
589 case LCHuvColorspace:
591 ConvertRGBToLCHuv(R,G,B,illuminant,X,Y,Z);
596 ConvertRGBToLMS(R,G,B,X,Y,Z);
601 ConvertRGBToLuv(R,G,B,illuminant,X,Y,Z);
604 case OklabColorspace:
606 ConvertRGBToOklab(R,G,B,X,Y,Z);
609 case OklchColorspace:
611 ConvertRGBToOklch(R,G,B,X,Y,Z);
614 case ProPhotoColorspace:
616 ConvertRGBToProPhoto(R,G,B,X,Y,Z);
621 ConvertRGBToxyY(R,G,B,X,Y,Z);
626 ConvertRGBToXYZ(R,G,B,X,Y,Z);
629 case YCbCrColorspace:
631 ConvertRGBToYCbCr(R,G,B,X,Y,Z);
634 case YDbDrColorspace:
636 ConvertRGBToYDbDr(R,G,B,X,Y,Z);
641 ConvertRGBToYIQ(R,G,B,X,Y,Z);
644 case YPbPrColorspace:
646 ConvertRGBToYPbPr(R,G,B,X,Y,Z);
651 ConvertRGBToYUV(R,G,B,X,Y,Z);
692MagickExport
void ConvertRGBToHSL(
const double red,
const double green,
693 const double blue,
double *hue,
double *saturation,
double *lightness)
703 assert(hue != (
double *) NULL);
704 assert(saturation != (
double *) NULL);
705 assert(lightness != (
double *) NULL);
706 max=MagickMax(QuantumScale*red,MagickMax(QuantumScale*green,
708 min=MagickMin(QuantumScale*red,MagickMin(QuantumScale*green,
711 *lightness=(max+min)/2.0;
718 if (fabs(max-QuantumScale*red) < MagickEpsilon)
720 *hue=(QuantumScale*green-QuantumScale*blue)/c;
721 if ((QuantumScale*green) < (QuantumScale*blue))
725 if (fabs(max-QuantumScale*green) < MagickEpsilon)
726 *hue=2.0+(QuantumScale*blue-QuantumScale*red)/c;
728 *hue=4.0+(QuantumScale*red-QuantumScale*green)/c;
730 if (*lightness <= 0.5)
731 *saturation=c*MagickSafeReciprocal(2.0*(*lightness));
733 *saturation=c*MagickSafeReciprocal(2.0-2.0*(*lightness));
767MagickExport ColorspaceType GetImageColorspaceType(
const Image *image,
768 ExceptionInfo *exception)
776 assert(image != (Image *) NULL);
777 assert(image->signature == MagickCoreSignature);
778 if (IsEventLogging() != MagickFalse)
779 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
780 colorspace=image->colorspace;
781 type=IdentifyImageType(image,exception);
782 if (IsGrayImageType(type))
783 colorspace=GRAYColorspace;
817static MagickBooleanType sRGBTransformImage(Image *image,
818 const ColorspaceType colorspace,ExceptionInfo *exception)
820#define sRGBTransformImageTag "RGBTransform/Image"
829 illuminant = D65Illuminant;
849 assert(image != (Image *) NULL);
850 assert(image->signature == MagickCoreSignature);
851 assert(colorspace != sRGBColorspace);
852 assert(colorspace != TransparentColorspace);
853 assert(colorspace != UndefinedColorspace);
854 if (IsEventLogging() != MagickFalse)
855 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
856 artifact=GetImageArtifact(image,
"color:illuminant");
857 if (artifact != (
const char *) NULL)
862 illuminant_type=ParseCommandOption(MagickIlluminantOptions,MagickFalse,
864 if (illuminant_type < 0)
865 illuminant=UndefinedIlluminant;
867 illuminant=(IlluminantType) illuminant_type;
881 if (image->storage_class == PseudoClass)
883 if (SyncImage(image,exception) == MagickFalse)
885 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
888 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
890 GetPixelInfo(image,&zero);
891 image_view=AcquireAuthenticCacheView(image,exception);
892#if defined(MAGICKCORE_OPENMP_SUPPORT)
893 #pragma omp parallel for schedule(static) shared(status) \
894 magick_number_threads(image,image,image->rows,2)
896 for (y=0; y < (ssize_t) image->rows; y++)
910 if (status == MagickFalse)
912 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
914 if (q == (Quantum *) NULL)
920 for (x=0; x < (ssize_t) image->columns; x++)
922 GetPixelInfoPixel(image,q,&pixel);
923 ConvertRGBToCMYK(&pixel);
924 SetPixelViaPixelInfo(image,&pixel,q);
925 q+=(ptrdiff_t) GetPixelChannels(image);
927 sync=SyncCacheViewAuthenticPixels(image_view,exception);
928 if (sync == MagickFalse)
931 image_view=DestroyCacheView(image_view);
932 image->type=image->alpha_trait == UndefinedPixelTrait ?
933 ColorSeparationType : ColorSeparationAlphaType;
934 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
938 case LinearGRAYColorspace:
943 if (image->storage_class == PseudoClass)
945 if (SyncImage(image,exception) == MagickFalse)
947 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
950 image_view=AcquireAuthenticCacheView(image,exception);
951#if defined(MAGICKCORE_OPENMP_SUPPORT)
952 #pragma omp parallel for schedule(static) shared(status) \
953 magick_number_threads(image,image,image->rows,2)
955 for (y=0; y < (ssize_t) image->rows; y++)
966 if (status == MagickFalse)
968 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
970 if (q == (Quantum *) NULL)
975 for (x=0; x < (ssize_t) image->columns; x++)
980 gray=0.212656*DecodePixelGamma(GetPixelRed(image,q))+0.715158*
981 DecodePixelGamma(GetPixelGreen(image,q))+0.072186*
982 DecodePixelGamma(GetPixelBlue(image,q));
983 SetPixelGray(image,ClampToQuantum(gray),q);
984 q+=(ptrdiff_t) GetPixelChannels(image);
986 sync=SyncCacheViewAuthenticPixels(image_view,exception);
987 if (sync == MagickFalse)
990 image_view=DestroyCacheView(image_view);
991 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
993 image->type=GrayscaleType;
1001 if (image->storage_class == PseudoClass)
1003 if (SyncImage(image,exception) == MagickFalse)
1004 return(MagickFalse);
1005 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1006 return(MagickFalse);
1008 image_view=AcquireAuthenticCacheView(image,exception);
1009#if defined(MAGICKCORE_OPENMP_SUPPORT)
1010 #pragma omp parallel for schedule(static) shared(status) \
1011 magick_number_threads(image,image,image->rows,2)
1013 for (y=0; y < (ssize_t) image->rows; y++)
1024 if (status == MagickFalse)
1026 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1028 if (q == (Quantum *) NULL)
1033 for (x=0; x < (ssize_t) image->columns; x++)
1038 gray=0.212656*(double) GetPixelRed(image,q)+0.715158*(double)
1039 GetPixelGreen(image,q)+0.072186*(double) GetPixelBlue(image,q);
1040 SetPixelGray(image,ClampToQuantum(gray),q);
1041 q+=(ptrdiff_t) GetPixelChannels(image);
1043 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1044 if (sync == MagickFalse)
1047 image_view=DestroyCacheView(image_view);
1048 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1049 return(MagickFalse);
1050 image->type=GrayscaleType;
1054 case Adobe98Colorspace:
1055 case CAT02LMSColorspace:
1056 case DisplayP3Colorspace:
1058 case HCLpColorspace:
1064 case JzazbzColorspace:
1067 case LCHabColorspace:
1068 case LCHuvColorspace:
1071 case OklabColorspace:
1072 case OklchColorspace:
1073 case ProPhotoColorspace:
1076 case YCbCrColorspace:
1077 case YDbDrColorspace:
1079 case YPbPrColorspace:
1086 white_luminance = 10000.0;
1091 value=GetImageProperty(image,
"white-luminance",exception);
1092 if (value != (
const char *) NULL)
1093 white_luminance=StringToDouble(value,(
char **) NULL);
1094 if (image->storage_class == PseudoClass)
1096 if (SyncImage(image,exception) == MagickFalse)
1097 return(MagickFalse);
1098 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1099 return(MagickFalse);
1101 image_view=AcquireAuthenticCacheView(image,exception);
1102#if defined(MAGICKCORE_OPENMP_SUPPORT)
1103 #pragma omp parallel for schedule(static) shared(status) \
1104 magick_number_threads(image,image,image->rows,2)
1106 for (y=0; y < (ssize_t) image->rows; y++)
1117 if (status == MagickFalse)
1119 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1121 if (q == (Quantum *) NULL)
1126 for (x=0; x < (ssize_t) image->columns; x++)
1133 ConvertRGBToGeneric(colorspace,(
double) GetPixelRed(image,q),
1134 (
double) GetPixelGreen(image,q),(
double) GetPixelBlue(image,q),
1135 white_luminance,illuminant,&X,&Y,&Z);
1136 SetPixelRed(image,ClampToQuantum((
double) QuantumRange*X),q);
1137 SetPixelGreen(image,ClampToQuantum((
double) QuantumRange*Y),q);
1138 SetPixelBlue(image,ClampToQuantum((
double) QuantumRange*Z),q);
1139 q+=(ptrdiff_t) GetPixelChannels(image);
1141 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1142 if (sync == MagickFalse)
1145 image_view=DestroyCacheView(image_view);
1146 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1147 return(MagickFalse);
1152#define DisplayGamma (1.0/1.7)
1153#define FilmGamma 0.6
1154#define ReferenceBlack 95.0
1155#define ReferenceWhite 685.0
1174 density=DisplayGamma;
1176 value=GetImageProperty(image,
"gamma",exception);
1177 if (value != (
const char *) NULL)
1178 gamma=MagickSafeReciprocal(StringToDouble(value,(
char **) NULL));
1179 film_gamma=FilmGamma;
1180 value=GetImageProperty(image,
"film-gamma",exception);
1181 if (value != (
const char *) NULL)
1182 film_gamma=StringToDouble(value,(
char **) NULL);
1183 reference_black=ReferenceBlack;
1184 value=GetImageProperty(image,
"reference-black",exception);
1185 if (value != (
const char *) NULL)
1186 reference_black=StringToDouble(value,(
char **) NULL);
1187 reference_white=ReferenceWhite;
1188 value=GetImageProperty(image,
"reference-white",exception);
1189 if (value != (
const char *) NULL)
1190 reference_white=StringToDouble(value,(
char **) NULL);
1191 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1193 if (logmap == (Quantum *) NULL)
1194 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
1196 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
1197 MagickSafeReciprocal(film_gamma));
1198#if defined(MAGICKCORE_OPENMP_SUPPORT)
1199 #pragma omp parallel for schedule(static)
1201 for (i=0; i <= (ssize_t) MaxMap; i++)
1202 logmap[i]=ScaleMapToQuantum(((
double) MaxMap*(reference_white+
1203 log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002*
1204 MagickSafeReciprocal(film_gamma)))/MaximumLogarithmicColorspace));
1205 image_view=AcquireAuthenticCacheView(image,exception);
1206#if defined(MAGICKCORE_OPENMP_SUPPORT)
1207 #pragma omp parallel for schedule(static) shared(status) \
1208 magick_number_threads(image,image,image->rows,2)
1210 for (y=0; y < (ssize_t) image->rows; y++)
1221 if (status == MagickFalse)
1223 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1225 if (q == (Quantum *) NULL)
1230 for (x=(ssize_t) image->columns; x != 0; x--)
1237 red=(double) DecodePixelGamma((MagickRealType)
1238 GetPixelRed(image,q));
1239 green=(double) DecodePixelGamma((MagickRealType)
1240 GetPixelGreen(image,q));
1241 blue=(double) DecodePixelGamma((MagickRealType)
1242 GetPixelBlue(image,q));
1243 SetPixelRed(image,logmap[ScaleQuantumToMap(ClampToQuantum(red))],q);
1244 SetPixelGreen(image,logmap[ScaleQuantumToMap(ClampToQuantum(green))],
1246 SetPixelBlue(image,logmap[ScaleQuantumToMap(ClampToQuantum(blue))],q);
1247 q+=(ptrdiff_t) GetPixelChannels(image);
1249 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1250 if (sync == MagickFalse)
1253 image_view=DestroyCacheView(image_view);
1254 logmap=(Quantum *) RelinquishMagickMemory(logmap);
1255 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1256 return(MagickFalse);
1260 case scRGBColorspace:
1265 if (image->storage_class == PseudoClass)
1267 if (SyncImage(image,exception) == MagickFalse)
1268 return(MagickFalse);
1269 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1270 return(MagickFalse);
1272 image_view=AcquireAuthenticCacheView(image,exception);
1273#if defined(MAGICKCORE_OPENMP_SUPPORT)
1274 #pragma omp parallel for schedule(static) shared(status) \
1275 magick_number_threads(image,image,image->rows,2)
1277 for (y=0; y < (ssize_t) image->rows; y++)
1288 if (status == MagickFalse)
1290 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1292 if (q == (Quantum *) NULL)
1297 for (x=0; x < (ssize_t) image->columns; x++)
1304 red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q));
1305 green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q));
1306 blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q));
1307 SetPixelRed(image,ClampToQuantum(red),q);
1308 SetPixelGreen(image,ClampToQuantum(green),q);
1309 SetPixelBlue(image,ClampToQuantum(blue),q);
1310 q+=(ptrdiff_t) GetPixelChannels(image);
1312 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1313 if (sync == MagickFalse)
1316 image_view=DestroyCacheView(image_view);
1317 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1318 return(MagickFalse);
1327 x_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1329 y_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1331 z_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1333 if ((x_map == (TransformPacket *) NULL) ||
1334 (y_map == (TransformPacket *) NULL) ||
1335 (z_map == (TransformPacket *) NULL))
1337 if (x_map != (TransformPacket *) NULL)
1338 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1339 if (y_map != (TransformPacket *) NULL)
1340 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1341 if (z_map != (TransformPacket *) NULL)
1342 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1343 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
1346 (void) memset(&primary_info,0,
sizeof(primary_info));
1349 case OHTAColorspace:
1361 primary_info.y=(MagickRealType) ((MaxMap+1)/2);
1362 primary_info.z=(MagickRealType) ((MaxMap+1)/2);
1363#if defined(MAGICKCORE_OPENMP_SUPPORT)
1364 #pragma omp parallel for schedule(static)
1366 for (i=0; i <= (ssize_t) MaxMap; i++)
1368 x_map[i].x=(MagickRealType) (0.33333*(
double) i);
1369 x_map[i].y=(MagickRealType) (0.50000*(
double) i);
1370 x_map[i].z=(MagickRealType) (-0.25000*(
double) i);
1371 y_map[i].x=(MagickRealType) (0.33334*(
double) i);
1372 y_map[i].y=(MagickRealType) (0.00000*(
double) i);
1373 y_map[i].z=(MagickRealType) (0.50000*(
double) i);
1374 z_map[i].x=(MagickRealType) (0.33333*(
double) i);
1375 z_map[i].y=(MagickRealType) (-0.50000*(
double) i);
1376 z_map[i].z=(MagickRealType) (-0.25000*(
double) i);
1380 case Rec601YCbCrColorspace:
1392 primary_info.y=(MagickRealType) ((MaxMap+1)/2);
1393 primary_info.z=(MagickRealType) ((MaxMap+1)/2);
1394#if defined(MAGICKCORE_OPENMP_SUPPORT)
1395 #pragma omp parallel for schedule(static)
1397 for (i=0; i <= (ssize_t) MaxMap; i++)
1399 x_map[i].x=(MagickRealType) (0.298839*(
double) i);
1400 x_map[i].y=(MagickRealType) (-0.1687367*(
double) i);
1401 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1402 y_map[i].x=(MagickRealType) (0.586811*(
double) i);
1403 y_map[i].y=(MagickRealType) (-0.331264*(
double) i);
1404 y_map[i].z=(MagickRealType) (-0.418688*(
double) i);
1405 z_map[i].x=(MagickRealType) (0.114350*(
double) i);
1406 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1407 z_map[i].z=(MagickRealType) (-0.081312*(
double) i);
1411 case Rec709YCbCrColorspace:
1423 primary_info.y=(double) ((MaxMap+1)/2);
1424 primary_info.z=(double) ((MaxMap+1)/2);
1425#if defined(MAGICKCORE_OPENMP_SUPPORT)
1426 #pragma omp parallel for schedule(static)
1428 for (i=0; i <= (ssize_t) MaxMap; i++)
1430 x_map[i].x=(MagickRealType) (0.212656*(
double) i);
1431 x_map[i].y=(MagickRealType) (-0.114572*(
double) i);
1432 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1433 y_map[i].x=(MagickRealType) (0.715158*(
double) i);
1434 y_map[i].y=(MagickRealType) (-0.385428*(
double) i);
1435 y_map[i].z=(MagickRealType) (-0.454153*(
double) i);
1436 z_map[i].x=(MagickRealType) (0.072186*(
double) i);
1437 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1438 z_map[i].z=(MagickRealType) (-0.045847*(
double) i);
1453 primary_info.y=(MagickRealType) ScaleQuantumToMap(
1454 ScaleCharToQuantum(156));
1455 primary_info.z=(MagickRealType) ScaleQuantumToMap(
1456 ScaleCharToQuantum(137));
1457 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
1459 x_map[i].x=0.005382*i;
1460 x_map[i].y=(-0.003296)*i;
1461 x_map[i].z=0.009410*i;
1462 y_map[i].x=0.010566*i;
1463 y_map[i].y=(-0.006471)*i;
1464 y_map[i].z=(-0.007880)*i;
1465 z_map[i].x=0.002052*i;
1466 z_map[i].y=0.009768*i;
1467 z_map[i].z=(-0.001530)*i;
1469 for ( ; i <= (ssize_t) MaxMap; i++)
1471 x_map[i].x=0.298839*(1.099*i-0.099);
1472 x_map[i].y=(-0.298839)*(1.099*i-0.099);
1473 x_map[i].z=0.70100*(1.099*i-0.099);
1474 y_map[i].x=0.586811*(1.099*i-0.099);
1475 y_map[i].y=(-0.586811)*(1.099*i-0.099);
1476 y_map[i].z=(-0.586811)*(1.099*i-0.099);
1477 z_map[i].x=0.114350*(1.099*i-0.099);
1478 z_map[i].y=0.88600*(1.099*i-0.099);
1479 z_map[i].z=(-0.114350)*(1.099*i-0.099);
1488#if defined(MAGICKCORE_OPENMP_SUPPORT)
1489 #pragma omp parallel for schedule(static)
1491 for (i=0; i <= (ssize_t) MaxMap; i++)
1493 x_map[i].x=(MagickRealType) (1.0*(
double) i);
1494 x_map[i].y=(MagickRealType) 0.0;
1495 x_map[i].z=(MagickRealType) 0.0;
1496 y_map[i].x=(MagickRealType) 0.0;
1497 y_map[i].y=(MagickRealType) (1.0*(
double) i);
1498 y_map[i].z=(MagickRealType) 0.0;
1499 z_map[i].x=(MagickRealType) 0.0;
1500 z_map[i].y=(MagickRealType) 0.0;
1501 z_map[i].z=(MagickRealType) (1.0*(
double) i);
1509 switch (image->storage_class)
1517 image_view=AcquireAuthenticCacheView(image,exception);
1518#if defined(MAGICKCORE_OPENMP_SUPPORT)
1519 #pragma omp parallel for schedule(static) shared(status) \
1520 magick_number_threads(image,image,image->rows,2)
1522 for (y=0; y < (ssize_t) image->rows; y++)
1541 if (status == MagickFalse)
1543 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1545 if (q == (Quantum *) NULL)
1550 for (x=0; x < (ssize_t) image->columns; x++)
1552 red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1553 GetPixelRed(image,q)));
1554 green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1555 GetPixelGreen(image,q)));
1556 blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1557 GetPixelBlue(image,q)));
1558 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1560 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1562 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1564 SetPixelRed(image,ScaleMapToQuantum(pixel.red),q);
1565 SetPixelGreen(image,ScaleMapToQuantum(pixel.green),q);
1566 SetPixelBlue(image,ScaleMapToQuantum(pixel.blue),q);
1567 q+=(ptrdiff_t) GetPixelChannels(image);
1569 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1570 if (sync == MagickFalse)
1572 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1577#if defined(MAGICKCORE_OPENMP_SUPPORT)
1581 proceed=SetImageProgress(image,sRGBTransformImageTag,progress,
1583 if (proceed == MagickFalse)
1587 image_view=DestroyCacheView(image_view);
1600 for (i=0; i < (ssize_t) image->colors; i++)
1605 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
1606 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
1607 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
1608 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1609 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1610 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1611 image->colormap[i].red=(double) ScaleMapToQuantum(pixel.red);
1612 image->colormap[i].green=(double) ScaleMapToQuantum(pixel.green);
1613 image->colormap[i].blue=(double) ScaleMapToQuantum(pixel.blue);
1615 (void) SyncImage(image,exception);
1622 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1623 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1624 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1625 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1626 return(MagickFalse);
1657MagickExport MagickBooleanType SetImageColorspace(Image *image,
1658 const ColorspaceType colorspace,ExceptionInfo *exception)
1666 assert(image != (Image *) NULL);
1667 assert(image->signature == MagickCoreSignature);
1668 assert(exception != (ExceptionInfo *) NULL);
1669 assert(exception->signature == MagickCoreSignature);
1670 if (IsEventLogging() != MagickFalse)
1671 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1672 if (image->colorspace == colorspace)
1674 image->colorspace=colorspace;
1675 image->rendering_intent=UndefinedIntent;
1676 image->gamma=1.000/2.200;
1677 (void) memset(&image->chromaticity,0,
sizeof(image->chromaticity));
1679 if (IsGrayColorspace(colorspace) != MagickFalse)
1681 if (colorspace == LinearGRAYColorspace)
1686 if ((IsRGBColorspace(colorspace) != MagickFalse) ||
1687 (colorspace == XYZColorspace) || (colorspace == xyYColorspace))
1691 image->rendering_intent=PerceptualIntent;
1692 image->chromaticity.red_primary.x=0.6400;
1693 image->chromaticity.red_primary.y=0.3300;
1694 image->chromaticity.red_primary.z=0.0300;
1695 image->chromaticity.green_primary.x=0.3000;
1696 image->chromaticity.green_primary.y=0.6000;
1697 image->chromaticity.green_primary.z=0.1000;
1698 image->chromaticity.blue_primary.x=0.1500;
1699 image->chromaticity.blue_primary.y=0.0600;
1700 image->chromaticity.blue_primary.z=0.7900;
1701 image->chromaticity.white_point.x=0.3127;
1702 image->chromaticity.white_point.y=0.3290;
1703 image->chromaticity.white_point.z=0.3583;
1705 status=SyncImagePixelCache(image,exception);
1737MagickExport MagickBooleanType SetImageGray(Image *image,
1738 ExceptionInfo *exception)
1746 assert(image != (Image *) NULL);
1747 assert(image->signature == MagickCoreSignature);
1748 if (IsEventLogging() != MagickFalse)
1749 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1750 if (IsImageGray(image) != MagickFalse)
1752 if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1753 return(MagickFalse);
1754 value=GetImageProperty(image,
"colorspace:auto-grayscale",exception);
1755 if (IsStringFalse(value) != MagickFalse)
1756 return(MagickFalse);
1757 type=IdentifyImageGray(image,exception);
1758 if (type == UndefinedType)
1759 return(MagickFalse);
1760 image->colorspace=GRAYColorspace;
1761 if (SyncImagePixelCache(image,exception) == MagickFalse)
1762 return(MagickFalse);
1794MagickExport MagickBooleanType SetImageMonochrome(Image *image,
1795 ExceptionInfo *exception)
1800 assert(image != (Image *) NULL);
1801 assert(image->signature == MagickCoreSignature);
1802 if (IsEventLogging() != MagickFalse)
1803 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1804 if (IsImageMonochrome(image) != MagickFalse)
1806 if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1807 return(MagickFalse);
1808 is_bilevel=IdentifyImageMonochrome(image,exception);
1809 if (is_bilevel == MagickFalse)
1810 return(MagickFalse);
1811 image->colorspace=GRAYColorspace;
1812 if (SyncImagePixelCache((Image *) image,exception) == MagickFalse)
1813 return(MagickFalse);
1814 image->type=BilevelType;
1846MagickExport MagickBooleanType TransformImageColorspace(Image *image,
1847 const ColorspaceType colorspace,ExceptionInfo *exception)
1852 assert(image != (Image *) NULL);
1853 assert(image->signature == MagickCoreSignature);
1854 if (IsEventLogging() != MagickFalse)
1855 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1856 if (image->colorspace == colorspace)
1857 return(SetImageColorspace(image,colorspace,exception));
1858 (void) DeleteImageProfile(image,
"icc");
1859 (void) DeleteImageProfile(image,
"icm");
1860 if (colorspace == UndefinedColorspace)
1861 return(SetImageColorspace(image,colorspace,exception));
1865 if (IssRGBColorspace(colorspace) != MagickFalse)
1866 return(TransformsRGBImage(image,exception));
1868 if (IssRGBColorspace(image->colorspace) == MagickFalse)
1869 status=TransformsRGBImage(image,exception);
1870 if (status == MagickFalse)
1875 if (sRGBTransformImage(image,colorspace,exception) == MagickFalse)
1909static inline ssize_t RoundToYCC(
const double value)
1913 if (value >= 1388.0)
1915 return((ssize_t) (value+0.5));
1918static MagickBooleanType TransformsRGBImage(Image *image,
1919 ExceptionInfo *exception)
1921#define TransformsRGBImageTag "Transform/Image"
1926 0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1927 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1928 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1929 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1930 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1931 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1932 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1933 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1934 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1935 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1936 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1937 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1938 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1939 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1940 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1941 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1942 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1943 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1944 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1945 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1946 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1947 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1948 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1949 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1950 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1951 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1952 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1953 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1954 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1955 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1956 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1957 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1958 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1959 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1960 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1961 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1962 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1963 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1964 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1965 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1966 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1967 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1968 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1969 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1970 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1971 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1972 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1973 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1974 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1975 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1976 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1977 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1978 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1979 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1980 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1981 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1982 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1983 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1984 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1985 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1986 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1987 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1988 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1989 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1990 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1991 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1992 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1993 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1994 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1995 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1996 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1997 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1998 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1999 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
2000 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
2001 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
2002 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
2003 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
2004 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
2005 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
2006 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
2007 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
2008 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
2009 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
2010 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
2011 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
2012 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
2013 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
2014 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
2015 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
2016 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
2017 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
2018 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
2019 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
2020 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
2021 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
2022 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
2023 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
2024 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
2025 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
2026 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
2027 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
2028 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
2029 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
2030 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
2031 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
2032 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
2033 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
2034 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
2035 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
2036 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
2037 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
2038 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
2039 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
2040 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
2041 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
2042 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
2043 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
2044 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
2045 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
2046 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
2047 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
2048 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
2049 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
2050 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
2051 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
2052 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
2053 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
2054 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
2055 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
2056 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
2057 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
2058 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
2059 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
2060 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
2061 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
2062 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
2063 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
2064 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
2065 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
2066 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
2067 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
2068 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
2069 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
2070 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
2071 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
2072 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
2073 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
2074 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
2075 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
2076 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
2077 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
2078 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
2079 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
2080 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
2081 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
2082 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
2083 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
2084 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
2085 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
2086 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
2087 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
2088 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
2089 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
2090 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
2091 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
2092 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
2093 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
2094 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
2095 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
2096 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
2097 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
2098 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
2099 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
2100 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
2101 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
2102 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
2103 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
2104 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
2105 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
2106 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
2107 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
2108 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
2109 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
2110 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
2111 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
2112 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
2113 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
2114 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
2115 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
2116 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
2117 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
2118 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
2119 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
2120 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
2121 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
2122 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
2123 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
2124 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
2125 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
2126 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
2127 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
2128 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
2129 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
2130 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
2131 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
2132 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
2133 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
2134 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
2135 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
2136 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
2137 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
2138 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
2139 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
2140 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
2141 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
2142 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
2143 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
2144 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
2145 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
2146 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
2147 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
2148 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
2149 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
2150 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
2151 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
2152 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
2153 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
2154 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
2155 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
2156 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
2157 0.998559f, 0.999280f, 1.000000f
2167 illuminant = D65Illuminant;
2184 assert(image != (Image *) NULL);
2185 assert(image->signature == MagickCoreSignature);
2186 if (IsEventLogging() != MagickFalse)
2187 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2188 artifact=GetImageArtifact(image,
"color:illuminant");
2189 if (artifact != (
const char *) NULL)
2194 illuminant_type=ParseCommandOption(MagickIlluminantOptions,MagickFalse,
2196 if (illuminant_type < 0)
2197 illuminant=UndefinedIlluminant;
2199 illuminant=(IlluminantType) illuminant_type;
2203 switch (image->colorspace)
2205 case CMYKColorspace:
2213 if (image->storage_class == PseudoClass)
2215 if (SyncImage(image,exception) == MagickFalse)
2216 return(MagickFalse);
2217 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2218 return(MagickFalse);
2220 GetPixelInfo(image,&zero);
2221 image_view=AcquireAuthenticCacheView(image,exception);
2222#if defined(MAGICKCORE_OPENMP_SUPPORT)
2223 #pragma omp parallel for schedule(static) shared(status) \
2224 magick_number_threads(image,image,image->rows,2)
2226 for (y=0; y < (ssize_t) image->rows; y++)
2240 if (status == MagickFalse)
2242 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2244 if (q == (Quantum *) NULL)
2250 for (x=0; x < (ssize_t) image->columns; x++)
2252 GetPixelInfoPixel(image,q,&pixel);
2253 ConvertCMYKToRGB(&pixel);
2254 SetPixelViaPixelInfo(image,&pixel,q);
2255 q+=(ptrdiff_t) GetPixelChannels(image);
2257 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2258 if (sync == MagickFalse)
2261 image_view=DestroyCacheView(image_view);
2262 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2263 return(MagickFalse);
2266 case LinearGRAYColorspace:
2271 if (image->storage_class == PseudoClass)
2273 if (SyncImage(image,exception) == MagickFalse)
2274 return(MagickFalse);
2275 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2276 return(MagickFalse);
2278 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2279 return(MagickFalse);
2280 image_view=AcquireAuthenticCacheView(image,exception);
2281#if defined(MAGICKCORE_OPENMP_SUPPORT)
2282 #pragma omp parallel for schedule(static) shared(status) \
2283 magick_number_threads(image,image,image->rows,2)
2285 for (y=0; y < (ssize_t) image->rows; y++)
2296 if (status == MagickFalse)
2298 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2300 if (q == (Quantum *) NULL)
2305 for (x=0; x < (ssize_t) image->columns; x++)
2310 gray=0.212656*EncodePixelGamma(GetPixelRed(image,q))+0.715158*
2311 EncodePixelGamma(GetPixelGreen(image,q))+0.072186*
2312 EncodePixelGamma(GetPixelBlue(image,q));
2313 SetPixelRed(image,ClampToQuantum(gray),q);
2314 SetPixelGreen(image,ClampToQuantum(gray),q);
2315 SetPixelBlue(image,ClampToQuantum(gray),q);
2316 q+=(ptrdiff_t) GetPixelChannels(image);
2318 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2319 if (sync == MagickFalse)
2322 image_view=DestroyCacheView(image_view);
2323 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2324 return(MagickFalse);
2327 case GRAYColorspace:
2332 if (image->storage_class == PseudoClass)
2334 if (SyncImage(image,exception) == MagickFalse)
2335 return(MagickFalse);
2336 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2337 return(MagickFalse);
2339 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2340 return(MagickFalse);
2341 image_view=AcquireAuthenticCacheView(image,exception);
2342#if defined(MAGICKCORE_OPENMP_SUPPORT)
2343 #pragma omp parallel for schedule(static) shared(status) \
2344 magick_number_threads(image,image,image->rows,2)
2346 for (y=0; y < (ssize_t) image->rows; y++)
2357 if (status == MagickFalse)
2359 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2361 if (q == (Quantum *) NULL)
2366 for (x=0; x < (ssize_t) image->columns; x++)
2371 gray=0.212656*(double) GetPixelRed(image,q)+0.715158*(double)
2372 GetPixelGreen(image,q)+0.072186*(double) GetPixelBlue(image,q);
2373 SetPixelRed(image,ClampToQuantum(gray),q);
2374 SetPixelGreen(image,ClampToQuantum(gray),q);
2375 SetPixelBlue(image,ClampToQuantum(gray),q);
2376 q+=(ptrdiff_t) GetPixelChannels(image);
2378 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2379 if (sync == MagickFalse)
2382 image_view=DestroyCacheView(image_view);
2383 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2384 return(MagickFalse);
2387 case Adobe98Colorspace:
2389 case CAT02LMSColorspace:
2390 case DisplayP3Colorspace:
2392 case HCLpColorspace:
2398 case JzazbzColorspace:
2401 case LCHabColorspace:
2402 case LCHuvColorspace:
2405 case OklabColorspace:
2406 case OklchColorspace:
2407 case ProPhotoColorspace:
2410 case YCbCrColorspace:
2411 case YDbDrColorspace:
2413 case YPbPrColorspace:
2425 white_luminance=10000.0;
2426 value=GetImageProperty(image,
"white-luminance",exception);
2427 if (value != (
const char *) NULL)
2428 white_luminance=StringToDouble(value,(
char **) NULL);
2429 if (image->storage_class == PseudoClass)
2431 if (SyncImage(image,exception) == MagickFalse)
2432 return(MagickFalse);
2433 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2434 return(MagickFalse);
2436 image_view=AcquireAuthenticCacheView(image,exception);
2437#if defined(MAGICKCORE_OPENMP_SUPPORT)
2438 #pragma omp parallel for schedule(static) shared(status) \
2439 magick_number_threads(image,image,image->rows,2)
2441 for (y=0; y < (ssize_t) image->rows; y++)
2452 if (status == MagickFalse)
2454 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2456 if (q == (Quantum *) NULL)
2461 for (x=0; x < (ssize_t) image->columns; x++)
2468 ConvertGenericToRGB(image->colorspace,QuantumScale*
2469 GetPixelRed(image,q),QuantumScale*GetPixelGreen(image,q),
2470 QuantumScale*GetPixelBlue(image,q),white_luminance,illuminant,
2472 SetPixelRed(image,ClampToQuantum(red),q);
2473 SetPixelGreen(image,ClampToQuantum(green),q);
2474 SetPixelBlue(image,ClampToQuantum(blue),q);
2475 q+=(ptrdiff_t) GetPixelChannels(image);
2477 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2478 if (sync == MagickFalse)
2481 image_view=DestroyCacheView(image_view);
2482 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2483 return(MagickFalse);
2505 density=DisplayGamma;
2507 value=GetImageProperty(image,
"gamma",exception);
2508 if (value != (
const char *) NULL)
2509 gamma=MagickSafeReciprocal(StringToDouble(value,(
char **) NULL));
2510 film_gamma=FilmGamma;
2511 value=GetImageProperty(image,
"film-gamma",exception);
2512 if (value != (
const char *) NULL)
2513 film_gamma=StringToDouble(value,(
char **) NULL);
2514 reference_black=ReferenceBlack;
2515 value=GetImageProperty(image,
"reference-black",exception);
2516 if (value != (
const char *) NULL)
2517 reference_black=StringToDouble(value,(
char **) NULL);
2518 if (reference_black > MaximumLogarithmicColorspace)
2519 reference_black=MaximumLogarithmicColorspace;
2520 reference_white=ReferenceWhite;
2521 value=GetImageProperty(image,
"reference-white",exception);
2522 if (value != (
const char *) NULL)
2523 reference_white=StringToDouble(value,(
char **) NULL);
2524 if (reference_white > MaximumLogarithmicColorspace)
2525 reference_white=MaximumLogarithmicColorspace;
2526 if (reference_black > reference_white)
2527 reference_black=reference_white;
2528 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2530 if (logmap == (Quantum *) NULL)
2531 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2533 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
2534 MagickSafeReciprocal(film_gamma));
2535 for (i=0; i <= (ssize_t) (reference_black*MaxMap/MaximumLogarithmicColorspace); i++)
2536 logmap[i]=(Quantum) 0;
2537 for ( ; i < (ssize_t) (reference_white*MaxMap/MaximumLogarithmicColorspace); i++)
2538 logmap[i]=ClampToQuantum((
double) QuantumRange/(1.0-black)*
2539 (pow(10.0,(MaximumLogarithmicColorspace*i/MaxMap-reference_white)*
2540 (gamma/density)*0.002*MagickSafeReciprocal(film_gamma))-black));
2541 for ( ; i <= (ssize_t) MaxMap; i++)
2542 logmap[i]=QuantumRange;
2543 if (image->storage_class == PseudoClass)
2545 if ((SyncImage(image,exception) == MagickFalse) ||
2546 (SetImageStorageClass(image,DirectClass,exception) == MagickFalse))
2548 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2549 return(MagickFalse);
2552 image_view=AcquireAuthenticCacheView(image,exception);
2553#if defined(MAGICKCORE_OPENMP_SUPPORT)
2554 #pragma omp parallel for schedule(static) shared(status) \
2555 magick_number_threads(image,image,image->rows,2)
2557 for (y=0; y < (ssize_t) image->rows; y++)
2568 if (status == MagickFalse)
2570 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2572 if (q == (Quantum *) NULL)
2577 for (x=(ssize_t) image->columns; x != 0; x--)
2584 red=(double) logmap[ScaleQuantumToMap(GetPixelRed(image,q))];
2585 green=(double) logmap[ScaleQuantumToMap(GetPixelGreen(image,q))];
2586 blue=(double) logmap[ScaleQuantumToMap(GetPixelBlue(image,q))];
2587 SetPixelRed(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2589 SetPixelGreen(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2591 SetPixelBlue(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2593 q+=(ptrdiff_t) GetPixelChannels(image);
2595 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2596 if (sync == MagickFalse)
2599 image_view=DestroyCacheView(image_view);
2600 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2601 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2602 return(MagickFalse);
2606 case scRGBColorspace:
2611 if (image->storage_class == PseudoClass)
2613 if (SyncImage(image,exception) == MagickFalse)
2614 return(MagickFalse);
2615 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2616 return(MagickFalse);
2618 image_view=AcquireAuthenticCacheView(image,exception);
2619#if defined(MAGICKCORE_OPENMP_SUPPORT)
2620 #pragma omp parallel for schedule(static) shared(status) \
2621 magick_number_threads(image,image,image->rows,2)
2623 for (y=0; y < (ssize_t) image->rows; y++)
2634 if (status == MagickFalse)
2636 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2638 if (q == (Quantum *) NULL)
2643 for (x=(ssize_t) image->columns; x != 0; x--)
2650 red=EncodePixelGamma((MagickRealType) GetPixelRed(image,q));
2651 green=EncodePixelGamma((MagickRealType) GetPixelGreen(image,q));
2652 blue=EncodePixelGamma((MagickRealType) GetPixelBlue(image,q));
2653 SetPixelRed(image,ClampToQuantum(red),q);
2654 SetPixelGreen(image,ClampToQuantum(green),q);
2655 SetPixelBlue(image,ClampToQuantum(blue),q);
2656 q+=(ptrdiff_t) GetPixelChannels(image);
2658 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2659 if (sync == MagickFalse)
2662 image_view=DestroyCacheView(image_view);
2663 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2664 return(MagickFalse);
2673 x_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2675 y_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2677 z_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2679 if ((x_map == (TransformPacket *) NULL) ||
2680 (y_map == (TransformPacket *) NULL) ||
2681 (z_map == (TransformPacket *) NULL))
2683 if (z_map != (TransformPacket *) NULL)
2684 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2685 if (y_map != (TransformPacket *) NULL)
2686 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2687 if (x_map != (TransformPacket *) NULL)
2688 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2689 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2692 switch (image->colorspace)
2694 case OHTAColorspace:
2709#if defined(MAGICKCORE_OPENMP_SUPPORT)
2710 #pragma omp parallel for schedule(static)
2712 for (i=0; i <= (ssize_t) MaxMap; i++)
2714 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2715 y_map[i].x=(MagickRealType) (0.5*1.00000*(2.0*(
double) i-MaxMap));
2716 z_map[i].x=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2717 x_map[i].y=(MagickRealType) (1.0*(
double) i);
2718 y_map[i].y=(MagickRealType) (0.5*0.00000*(2.0*(
double) i-MaxMap));
2719 z_map[i].y=(MagickRealType) (0.5*1.33333*(2.0*(
double) i-MaxMap));
2720 x_map[i].z=(MagickRealType) (1.0*(
double) i);
2721 y_map[i].z=(MagickRealType) (-0.5*1.00000*(2.0*(
double) i-MaxMap));
2722 z_map[i].z=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2726 case Rec601YCbCrColorspace:
2738#if defined(MAGICKCORE_OPENMP_SUPPORT)
2739 #pragma omp parallel for schedule(static)
2741 for (i=0; i <= (ssize_t) MaxMap; i++)
2743 x_map[i].x=0.99999999999914679361*(double) i;
2744 y_map[i].x=0.5*(-1.2188941887145875e-06)*(2.00*(
double) i-MaxMap);
2745 z_map[i].x=0.5*1.4019995886561440468*(2.00*(double) i-MaxMap);
2746 x_map[i].y=0.99999975910502514331*(double) i;
2747 y_map[i].y=0.5*(-0.34413567816504303521)*(2.00*(
double) i-MaxMap);
2748 z_map[i].y=0.5*(-0.71413649331646789076)*(2.00*(
double) i-MaxMap);
2749 x_map[i].z=1.00000124040004623180*(double) i;
2750 y_map[i].z=0.5*1.77200006607230409200*(2.00*(double) i-MaxMap);
2751 z_map[i].z=0.5*2.1453384174593273e-06*(2.00*(double) i-MaxMap);
2755 case Rec709YCbCrColorspace:
2767#if defined(MAGICKCORE_OPENMP_SUPPORT)
2768 #pragma omp parallel for schedule(static)
2770 for (i=0; i <= (ssize_t) MaxMap; i++)
2772 x_map[i].x=(MagickRealType) (1.0*i);
2773 y_map[i].x=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2774 z_map[i].x=(MagickRealType) (0.5*1.574800*(2.0*i-MaxMap));
2775 x_map[i].y=(MagickRealType) (1.0*i);
2776 y_map[i].y=(MagickRealType) (0.5*(-0.187324)*(2.0*i-MaxMap));
2777 z_map[i].y=(MagickRealType) (0.5*(-0.468124)*(2.0*i-MaxMap));
2778 x_map[i].z=(MagickRealType) (1.0*i);
2779 y_map[i].z=(MagickRealType) (0.5*1.855600*(2.0*i-MaxMap));
2780 z_map[i].z=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2795#if defined(MAGICKCORE_OPENMP_SUPPORT)
2796 #pragma omp parallel for schedule(static)
2798 for (i=0; i <= (ssize_t) MaxMap; i++)
2800 x_map[i].x=(MagickRealType) (1.3584000*(
double) i);
2801 y_map[i].x=(MagickRealType) 0.0000000;
2802 z_map[i].x=(MagickRealType) (1.8215000*(1.0*(
double) i-(
double)
2803 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2804 x_map[i].y=(MagickRealType) (1.3584000*(
double) i);
2805 y_map[i].y=(MagickRealType) (-0.4302726*(1.0*(
double) i-(
double)
2806 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2807 z_map[i].y=(MagickRealType) (-0.9271435*(1.0*(
double) i-(
double)
2808 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2809 x_map[i].z=(MagickRealType) (1.3584000*(
double) i);
2810 y_map[i].z=(MagickRealType) (2.2179000*(1.0*(
double) i-(
double)
2811 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2812 z_map[i].z=(MagickRealType) 0.0000000;
2821#if defined(MAGICKCORE_OPENMP_SUPPORT)
2822 #pragma omp parallel for schedule(static)
2824 for (i=0; i <= (ssize_t) MaxMap; i++)
2826 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2827 y_map[i].x=(MagickRealType) 0.0;
2828 z_map[i].x=(MagickRealType) 0.0;
2829 x_map[i].y=(MagickRealType) 0.0;
2830 y_map[i].y=(MagickRealType) (1.0*(
double) i);
2831 z_map[i].y=(MagickRealType) 0.0;
2832 x_map[i].z=(MagickRealType) 0.0;
2833 y_map[i].z=(MagickRealType) 0.0;
2834 z_map[i].z=(MagickRealType) (1.0*(
double) i);
2842 switch (image->storage_class)
2850 image_view=AcquireAuthenticCacheView(image,exception);
2851#if defined(MAGICKCORE_OPENMP_SUPPORT)
2852 #pragma omp parallel for schedule(static) shared(status) \
2853 magick_number_threads(image,image,image->rows,2)
2855 for (y=0; y < (ssize_t) image->rows; y++)
2869 if (status == MagickFalse)
2871 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2873 if (q == (Quantum *) NULL)
2878 for (x=0; x < (ssize_t) image->columns; x++)
2885 red=ScaleQuantumToMap(GetPixelRed(image,q));
2886 green=ScaleQuantumToMap(GetPixelGreen(image,q));
2887 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
2888 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2889 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2890 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2891 if (image->colorspace == YCCColorspace)
2893 pixel.red=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2894 MaximumLogarithmicColorspace*pixel.red/(
double) MaxMap)];
2895 pixel.green=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2896 MaximumLogarithmicColorspace*pixel.green/(
double) MaxMap)];
2897 pixel.blue=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2898 MaximumLogarithmicColorspace*pixel.blue/(
double) MaxMap)];
2902 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2903 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2904 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2906 SetPixelRed(image,ClampToQuantum(pixel.red),q);
2907 SetPixelGreen(image,ClampToQuantum(pixel.green),q);
2908 SetPixelBlue(image,ClampToQuantum(pixel.blue),q);
2909 q+=(ptrdiff_t) GetPixelChannels(image);
2911 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2912 if (sync == MagickFalse)
2914 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2919#if defined(MAGICKCORE_OPENMP_SUPPORT)
2923 proceed=SetImageProgress(image,TransformsRGBImageTag,progress,
2925 if (proceed == MagickFalse)
2929 image_view=DestroyCacheView(image_view);
2937#if defined(MAGICKCORE_OPENMP_SUPPORT)
2938 #pragma omp parallel for schedule(static) shared(status) \
2939 magick_number_threads(image,image,image->rows,1)
2941 for (i=0; i < (ssize_t) image->colors; i++)
2951 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
2952 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
2953 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
2954 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2955 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2956 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2957 if (image->colorspace == YCCColorspace)
2959 pixel.red=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2960 MaximumLogarithmicColorspace*pixel.red/(
double) MaxMap)];
2961 pixel.green=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2962 MaximumLogarithmicColorspace*pixel.green/(
double) MaxMap)];
2963 pixel.blue=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2964 MaximumLogarithmicColorspace*pixel.blue/(
double) MaxMap)];
2968 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2969 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2970 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2972 image->colormap[i].red=(double) ClampToQuantum(pixel.red);
2973 image->colormap[i].green=(double) ClampToQuantum(pixel.green);
2974 image->colormap[i].blue=(double) ClampToQuantum(pixel.blue);
2976 (void) SyncImage(image,exception);
2983 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2984 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2985 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2986 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2987 return(MagickFalse);