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 *);
127MagickPrivate
void ConvertGenericToRGB(
const ColorspaceType colorspace,
128 const double X,
const double Y,
const double Z,
const double white_luminance,
129 const IlluminantType illuminant,
double *R,
double *G,
double *B)
133 case Adobe98Colorspace:
135 ConvertAdobe98ToRGB(X,Y,Z,R,G,B);
138 case CAT02LMSColorspace:
145 ConvertXYZToCAT02LMS(X,Y,Z,&L,&M,&S);
146 ConvertCAT02LMSToRGB(L,M,S,R,G,B);
151 ConvertCMYToRGB(X,Y,Z,R,G,B);
154 case DisplayP3Colorspace:
156 ConvertDisplayP3ToRGB(X,Y,Z,R,G,B);
161 ConvertHCLToRGB(X,Y,Z,R,G,B);
166 ConvertHCLpToRGB(X,Y,Z,R,G,B);
171 ConvertHSBToRGB(X,Y,Z,R,G,B);
176 ConvertHSIToRGB(X,Y,Z,R,G,B);
181 ConvertHSLToRGB(X,Y,Z,R,G,B);
186 ConvertHSVToRGB(X,Y,Z,R,G,B);
191 ConvertHWBToRGB(X,Y,Z,R,G,B);
194 case JzazbzColorspace:
196 ConvertJzazbzToRGB(X,Y,Z,white_luminance,R,G,B);
201 ConvertLabToRGB(X,Y,Z,illuminant,R,G,B);
205 case LCHabColorspace:
207 ConvertLCHabToRGB(X,Y,Z,illuminant,R,G,B);
210 case LCHuvColorspace:
212 ConvertLCHuvToRGB(X,Y,Z,illuminant,R,G,B);
217 ConvertLMSToRGB(X,Y,Z,R,G,B);
222 ConvertLuvToRGB(X,Y,Z,illuminant,R,G,B);
225 case OklabColorspace:
227 ConvertOklabToRGB(X,Y,Z,R,G,B);
230 case OklchColorspace:
232 ConvertOklchToRGB(X,Y,Z,R,G,B);
235 case ProPhotoColorspace:
237 ConvertProPhotoToRGB(X,Y,Z,R,G,B);
242 ConvertxyYToRGB(X,Y,Z,R,G,B);
247 ConvertXYZToRGB(X,Y,Z,R,G,B);
250 case YCbCrColorspace:
252 ConvertYCbCrToRGB(X,Y,Z,R,G,B);
255 case YDbDrColorspace:
257 ConvertYDbDrToRGB(X,Y,Z,R,G,B);
262 ConvertYIQToRGB(X,Y,Z,R,G,B);
265 case YPbPrColorspace:
267 ConvertYPbPrToRGB(X,Y,Z,R,G,B);
272 ConvertYUVToRGB(X,Y,Z,R,G,B);
277 *R=(double) QuantumRange*X;
278 *G=(double) QuantumRange*Y;
279 *B=(double) QuantumRange*Z;
312MagickExport
void ConvertHSLToRGB(
const double hue,
const double saturation,
313 const double lightness,
double *red,
double *green,
double *blue)
324 assert(red != (
double *) NULL);
325 assert(green != (
double *) NULL);
326 assert(blue != (
double *) NULL);
328 if (lightness <= 0.5)
329 c=2.0*lightness*saturation;
331 c=(2.0-2.0*lightness)*saturation;
333 h-=360.0*floor(h/360.0);
335 x=c*(1.0-fabs(h-2.0*floor(h/2.0)-1.0));
336 switch ((
int) floor(h))
341 *red=(double) QuantumRange*(min+c);
342 *green=(double) QuantumRange*(min+x);
343 *blue=(double) QuantumRange*min;
348 *red=(double) QuantumRange*(min+x);
349 *green=(double) QuantumRange*(min+c);
350 *blue=(double) QuantumRange*min;
355 *red=(double) QuantumRange*min;
356 *green=(double) QuantumRange*(min+c);
357 *blue=(double) QuantumRange*(min+x);
362 *red=(double) QuantumRange*min;
363 *green=(double) QuantumRange*(min+x);
364 *blue=(double) QuantumRange*(min+c);
369 *red=(double) QuantumRange*(min+x);
370 *green=(double) QuantumRange*min;
371 *blue=(double) QuantumRange*(min+c);
376 *red=(double) QuantumRange*(min+c);
377 *green=(double) QuantumRange*min;
378 *blue=(double) QuantumRange*(min+x);
416MagickPrivate
void ConvertRGBToGeneric(
const ColorspaceType colorspace,
417 const double R,
const double G,
const double B,
const double white_luminance,
418 const IlluminantType illuminant,
double *X,
double *Y,
double *Z)
422 case Adobe98Colorspace:
424 ConvertRGBToAdobe98(R,G,B,X,Y,Z);
427 case CAT02LMSColorspace:
434 ConvertRGBToCAT02LMS(R,G,B,&L,&M,&S);
435 ConvertCAT02LMSToXYZ(L,M,S,X,Y,Z);
440 ConvertRGBToCMY(R,G,B,X,Y,Z);
443 case DisplayP3Colorspace:
445 ConvertRGBToDisplayP3(R,G,B,X,Y,Z);
450 ConvertRGBToHCL(R,G,B,X,Y,Z);
455 ConvertRGBToHCLp(R,G,B,X,Y,Z);
460 ConvertRGBToHSB(R,G,B,X,Y,Z);
465 ConvertRGBToHSI(R,G,B,X,Y,Z);
470 ConvertRGBToHSL(R,G,B,X,Y,Z);
475 ConvertRGBToHSV(R,G,B,X,Y,Z);
480 ConvertRGBToHWB(R,G,B,X,Y,Z);
483 case JzazbzColorspace:
485 ConvertRGBToJzazbz(R,G,B,white_luminance,X,Y,Z);
490 ConvertRGBToLab(R,G,B,illuminant,X,Y,Z);
494 case LCHabColorspace:
496 ConvertRGBToLCHab(R,G,B,illuminant,X,Y,Z);
499 case LCHuvColorspace:
501 ConvertRGBToLCHuv(R,G,B,illuminant,X,Y,Z);
506 ConvertRGBToLMS(R,G,B,X,Y,Z);
511 ConvertRGBToLuv(R,G,B,illuminant,X,Y,Z);
514 case OklabColorspace:
516 ConvertRGBToOklab(R,G,B,X,Y,Z);
519 case OklchColorspace:
521 ConvertRGBToOklch(R,G,B,X,Y,Z);
524 case ProPhotoColorspace:
526 ConvertRGBToProPhoto(R,G,B,X,Y,Z);
531 ConvertRGBToxyY(R,G,B,X,Y,Z);
536 ConvertRGBToXYZ(R,G,B,X,Y,Z);
539 case YCbCrColorspace:
541 ConvertRGBToYCbCr(R,G,B,X,Y,Z);
544 case YDbDrColorspace:
546 ConvertRGBToYDbDr(R,G,B,X,Y,Z);
551 ConvertRGBToYIQ(R,G,B,X,Y,Z);
554 case YPbPrColorspace:
556 ConvertRGBToYPbPr(R,G,B,X,Y,Z);
561 ConvertRGBToYUV(R,G,B,X,Y,Z);
602MagickExport
void ConvertRGBToHSL(
const double red,
const double green,
603 const double blue,
double *hue,
double *saturation,
double *lightness)
613 assert(hue != (
double *) NULL);
614 assert(saturation != (
double *) NULL);
615 assert(lightness != (
double *) NULL);
616 max=MagickMax(QuantumScale*red,MagickMax(QuantumScale*green,
618 min=MagickMin(QuantumScale*red,MagickMin(QuantumScale*green,
621 *lightness=(max+min)/2.0;
628 if (fabs(max-QuantumScale*red) < MagickEpsilon)
630 *hue=(QuantumScale*green-QuantumScale*blue)/c;
631 if ((QuantumScale*green) < (QuantumScale*blue))
635 if (fabs(max-QuantumScale*green) < MagickEpsilon)
636 *hue=2.0+(QuantumScale*blue-QuantumScale*red)/c;
638 *hue=4.0+(QuantumScale*red-QuantumScale*green)/c;
640 if (*lightness <= 0.5)
641 *saturation=c*MagickSafeReciprocal(2.0*(*lightness));
643 *saturation=c*MagickSafeReciprocal(2.0-2.0*(*lightness));
677MagickExport ColorspaceType GetImageColorspaceType(
const Image *image,
678 ExceptionInfo *exception)
686 assert(image != (Image *) NULL);
687 assert(image->signature == MagickCoreSignature);
688 if (IsEventLogging() != MagickFalse)
689 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
690 colorspace=image->colorspace;
691 type=IdentifyImageType(image,exception);
692 if (IsGrayImageType(type))
693 colorspace=GRAYColorspace;
727static MagickBooleanType sRGBTransformImage(Image *image,
728 const ColorspaceType colorspace,ExceptionInfo *exception)
730#define sRGBTransformImageTag "RGBTransform/Image"
739 illuminant = D65Illuminant;
759 assert(image != (Image *) NULL);
760 assert(image->signature == MagickCoreSignature);
761 assert(colorspace != sRGBColorspace);
762 assert(colorspace != TransparentColorspace);
763 assert(colorspace != UndefinedColorspace);
764 if (IsEventLogging() != MagickFalse)
765 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
766 artifact=GetImageArtifact(image,
"color:illuminant");
767 if (artifact != (
const char *) NULL)
772 illuminant_type=ParseCommandOption(MagickIlluminantOptions,MagickFalse,
774 if (illuminant_type < 0)
775 illuminant=UndefinedIlluminant;
777 illuminant=(IlluminantType) illuminant_type;
791 if (image->storage_class == PseudoClass)
793 if (SyncImage(image,exception) == MagickFalse)
795 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
798 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
800 GetPixelInfo(image,&zero);
801 image_view=AcquireAuthenticCacheView(image,exception);
802#if defined(MAGICKCORE_OPENMP_SUPPORT)
803 #pragma omp parallel for schedule(static) shared(status) \
804 magick_number_threads(image,image,image->rows,2)
806 for (y=0; y < (ssize_t) image->rows; y++)
820 if (status == MagickFalse)
822 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
824 if (q == (Quantum *) NULL)
830 for (x=0; x < (ssize_t) image->columns; x++)
832 GetPixelInfoPixel(image,q,&pixel);
833 ConvertRGBToCMYK(&pixel);
834 SetPixelViaPixelInfo(image,&pixel,q);
835 q+=(ptrdiff_t) GetPixelChannels(image);
837 sync=SyncCacheViewAuthenticPixels(image_view,exception);
838 if (sync == MagickFalse)
841 image_view=DestroyCacheView(image_view);
842 image->type=image->alpha_trait == UndefinedPixelTrait ?
843 ColorSeparationType : ColorSeparationAlphaType;
844 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
848 case LinearGRAYColorspace:
853 if (image->storage_class == PseudoClass)
855 if (SyncImage(image,exception) == MagickFalse)
857 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
860 image_view=AcquireAuthenticCacheView(image,exception);
861#if defined(MAGICKCORE_OPENMP_SUPPORT)
862 #pragma omp parallel for schedule(static) shared(status) \
863 magick_number_threads(image,image,image->rows,2)
865 for (y=0; y < (ssize_t) image->rows; y++)
876 if (status == MagickFalse)
878 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
880 if (q == (Quantum *) NULL)
885 for (x=0; x < (ssize_t) image->columns; x++)
890 gray=0.212656*DecodePixelGamma(GetPixelRed(image,q))+0.715158*
891 DecodePixelGamma(GetPixelGreen(image,q))+0.072186*
892 DecodePixelGamma(GetPixelBlue(image,q));
893 SetPixelGray(image,ClampToQuantum(gray),q);
894 q+=(ptrdiff_t) GetPixelChannels(image);
896 sync=SyncCacheViewAuthenticPixels(image_view,exception);
897 if (sync == MagickFalse)
900 image_view=DestroyCacheView(image_view);
901 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
903 image->type=GrayscaleType;
911 if (image->storage_class == PseudoClass)
913 if (SyncImage(image,exception) == MagickFalse)
915 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
918 image_view=AcquireAuthenticCacheView(image,exception);
919#if defined(MAGICKCORE_OPENMP_SUPPORT)
920 #pragma omp parallel for schedule(static) shared(status) \
921 magick_number_threads(image,image,image->rows,2)
923 for (y=0; y < (ssize_t) image->rows; y++)
934 if (status == MagickFalse)
936 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
938 if (q == (Quantum *) NULL)
943 for (x=0; x < (ssize_t) image->columns; x++)
948 gray=0.212656*(double) GetPixelRed(image,q)+0.715158*(double)
949 GetPixelGreen(image,q)+0.072186*(double) GetPixelBlue(image,q);
950 SetPixelGray(image,ClampToQuantum(gray),q);
951 q+=(ptrdiff_t) GetPixelChannels(image);
953 sync=SyncCacheViewAuthenticPixels(image_view,exception);
954 if (sync == MagickFalse)
957 image_view=DestroyCacheView(image_view);
958 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
960 image->type=GrayscaleType;
964 case Adobe98Colorspace:
965 case CAT02LMSColorspace:
966 case DisplayP3Colorspace:
974 case JzazbzColorspace:
977 case LCHabColorspace:
978 case LCHuvColorspace:
981 case OklabColorspace:
982 case OklchColorspace:
983 case ProPhotoColorspace:
986 case YCbCrColorspace:
987 case YDbDrColorspace:
989 case YPbPrColorspace:
996 white_luminance = 10000.0;
1001 value=GetImageProperty(image,
"white-luminance",exception);
1002 if (value != (
const char *) NULL)
1003 white_luminance=StringToDouble(value,(
char **) NULL);
1004 if (image->storage_class == PseudoClass)
1006 if (SyncImage(image,exception) == MagickFalse)
1007 return(MagickFalse);
1008 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1009 return(MagickFalse);
1011 image_view=AcquireAuthenticCacheView(image,exception);
1012#if defined(MAGICKCORE_OPENMP_SUPPORT)
1013 #pragma omp parallel for schedule(static) shared(status) \
1014 magick_number_threads(image,image,image->rows,2)
1016 for (y=0; y < (ssize_t) image->rows; y++)
1027 if (status == MagickFalse)
1029 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1031 if (q == (Quantum *) NULL)
1036 for (x=0; x < (ssize_t) image->columns; x++)
1043 ConvertRGBToGeneric(colorspace,(
double) GetPixelRed(image,q),
1044 (
double) GetPixelGreen(image,q),(
double) GetPixelBlue(image,q),
1045 white_luminance,illuminant,&X,&Y,&Z);
1046 SetPixelRed(image,ClampToQuantum((
double) QuantumRange*X),q);
1047 SetPixelGreen(image,ClampToQuantum((
double) QuantumRange*Y),q);
1048 SetPixelBlue(image,ClampToQuantum((
double) QuantumRange*Z),q);
1049 q+=(ptrdiff_t) GetPixelChannels(image);
1051 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1052 if (sync == MagickFalse)
1055 image_view=DestroyCacheView(image_view);
1056 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1057 return(MagickFalse);
1062#define DisplayGamma (1.0/1.7)
1063#define FilmGamma 0.6
1064#define ReferenceBlack 95.0
1065#define ReferenceWhite 685.0
1084 density=DisplayGamma;
1086 value=GetImageProperty(image,
"gamma",exception);
1087 if (value != (
const char *) NULL)
1088 gamma=MagickSafeReciprocal(StringToDouble(value,(
char **) NULL));
1089 film_gamma=FilmGamma;
1090 value=GetImageProperty(image,
"film-gamma",exception);
1091 if (value != (
const char *) NULL)
1092 film_gamma=StringToDouble(value,(
char **) NULL);
1093 reference_black=ReferenceBlack;
1094 value=GetImageProperty(image,
"reference-black",exception);
1095 if (value != (
const char *) NULL)
1096 reference_black=StringToDouble(value,(
char **) NULL);
1097 reference_white=ReferenceWhite;
1098 value=GetImageProperty(image,
"reference-white",exception);
1099 if (value != (
const char *) NULL)
1100 reference_white=StringToDouble(value,(
char **) NULL);
1101 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1103 if (logmap == (Quantum *) NULL)
1104 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
1106 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
1107 MagickSafeReciprocal(film_gamma));
1108#if defined(MAGICKCORE_OPENMP_SUPPORT)
1109 #pragma omp parallel for schedule(static)
1111 for (i=0; i <= (ssize_t) MaxMap; i++)
1112 logmap[i]=ScaleMapToQuantum(((
double) MaxMap*(reference_white+
1113 log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002*
1114 MagickSafeReciprocal(film_gamma)))/MaximumLogarithmicColorspace));
1115 image_view=AcquireAuthenticCacheView(image,exception);
1116#if defined(MAGICKCORE_OPENMP_SUPPORT)
1117 #pragma omp parallel for schedule(static) shared(status) \
1118 magick_number_threads(image,image,image->rows,2)
1120 for (y=0; y < (ssize_t) image->rows; y++)
1131 if (status == MagickFalse)
1133 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1135 if (q == (Quantum *) NULL)
1140 for (x=(ssize_t) image->columns; x != 0; x--)
1147 red=(double) DecodePixelGamma((MagickRealType)
1148 GetPixelRed(image,q));
1149 green=(double) DecodePixelGamma((MagickRealType)
1150 GetPixelGreen(image,q));
1151 blue=(double) DecodePixelGamma((MagickRealType)
1152 GetPixelBlue(image,q));
1153 SetPixelRed(image,logmap[ScaleQuantumToMap(ClampToQuantum(red))],q);
1154 SetPixelGreen(image,logmap[ScaleQuantumToMap(ClampToQuantum(green))],
1156 SetPixelBlue(image,logmap[ScaleQuantumToMap(ClampToQuantum(blue))],q);
1157 q+=(ptrdiff_t) GetPixelChannels(image);
1159 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1160 if (sync == MagickFalse)
1163 image_view=DestroyCacheView(image_view);
1164 logmap=(Quantum *) RelinquishMagickMemory(logmap);
1165 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1166 return(MagickFalse);
1170 case scRGBColorspace:
1175 if (image->storage_class == PseudoClass)
1177 if (SyncImage(image,exception) == MagickFalse)
1178 return(MagickFalse);
1179 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1180 return(MagickFalse);
1182 image_view=AcquireAuthenticCacheView(image,exception);
1183#if defined(MAGICKCORE_OPENMP_SUPPORT)
1184 #pragma omp parallel for schedule(static) shared(status) \
1185 magick_number_threads(image,image,image->rows,2)
1187 for (y=0; y < (ssize_t) image->rows; y++)
1198 if (status == MagickFalse)
1200 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1202 if (q == (Quantum *) NULL)
1207 for (x=0; x < (ssize_t) image->columns; x++)
1214 red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q));
1215 green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q));
1216 blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q));
1217 SetPixelRed(image,ClampToQuantum(red),q);
1218 SetPixelGreen(image,ClampToQuantum(green),q);
1219 SetPixelBlue(image,ClampToQuantum(blue),q);
1220 q+=(ptrdiff_t) GetPixelChannels(image);
1222 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1223 if (sync == MagickFalse)
1226 image_view=DestroyCacheView(image_view);
1227 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1228 return(MagickFalse);
1237 x_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1239 y_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1241 z_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
1243 if ((x_map == (TransformPacket *) NULL) ||
1244 (y_map == (TransformPacket *) NULL) ||
1245 (z_map == (TransformPacket *) NULL))
1247 if (x_map != (TransformPacket *) NULL)
1248 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1249 if (y_map != (TransformPacket *) NULL)
1250 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1251 if (z_map != (TransformPacket *) NULL)
1252 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1253 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
1256 (void) memset(&primary_info,0,
sizeof(primary_info));
1259 case OHTAColorspace:
1271 primary_info.y=(MagickRealType) ((MaxMap+1)/2);
1272 primary_info.z=(MagickRealType) ((MaxMap+1)/2);
1273#if defined(MAGICKCORE_OPENMP_SUPPORT)
1274 #pragma omp parallel for schedule(static)
1276 for (i=0; i <= (ssize_t) MaxMap; i++)
1278 x_map[i].x=(MagickRealType) (0.33333*(
double) i);
1279 x_map[i].y=(MagickRealType) (0.50000*(
double) i);
1280 x_map[i].z=(MagickRealType) (-0.25000*(
double) i);
1281 y_map[i].x=(MagickRealType) (0.33334*(
double) i);
1282 y_map[i].y=(MagickRealType) (0.00000*(
double) i);
1283 y_map[i].z=(MagickRealType) (0.50000*(
double) i);
1284 z_map[i].x=(MagickRealType) (0.33333*(
double) i);
1285 z_map[i].y=(MagickRealType) (-0.50000*(
double) i);
1286 z_map[i].z=(MagickRealType) (-0.25000*(
double) i);
1290 case Rec601YCbCrColorspace:
1302 primary_info.y=(MagickRealType) ((MaxMap+1)/2);
1303 primary_info.z=(MagickRealType) ((MaxMap+1)/2);
1304#if defined(MAGICKCORE_OPENMP_SUPPORT)
1305 #pragma omp parallel for schedule(static)
1307 for (i=0; i <= (ssize_t) MaxMap; i++)
1309 x_map[i].x=(MagickRealType) (0.298839*(
double) i);
1310 x_map[i].y=(MagickRealType) (-0.1687367*(
double) i);
1311 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1312 y_map[i].x=(MagickRealType) (0.586811*(
double) i);
1313 y_map[i].y=(MagickRealType) (-0.331264*(
double) i);
1314 y_map[i].z=(MagickRealType) (-0.418688*(
double) i);
1315 z_map[i].x=(MagickRealType) (0.114350*(
double) i);
1316 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1317 z_map[i].z=(MagickRealType) (-0.081312*(
double) i);
1321 case Rec709YCbCrColorspace:
1333 primary_info.y=(double) ((MaxMap+1)/2);
1334 primary_info.z=(double) ((MaxMap+1)/2);
1335#if defined(MAGICKCORE_OPENMP_SUPPORT)
1336 #pragma omp parallel for schedule(static)
1338 for (i=0; i <= (ssize_t) MaxMap; i++)
1340 x_map[i].x=(MagickRealType) (0.212656*(
double) i);
1341 x_map[i].y=(MagickRealType) (-0.114572*(
double) i);
1342 x_map[i].z=(MagickRealType) (0.500000*(
double) i);
1343 y_map[i].x=(MagickRealType) (0.715158*(
double) i);
1344 y_map[i].y=(MagickRealType) (-0.385428*(
double) i);
1345 y_map[i].z=(MagickRealType) (-0.454153*(
double) i);
1346 z_map[i].x=(MagickRealType) (0.072186*(
double) i);
1347 z_map[i].y=(MagickRealType) (0.500000*(
double) i);
1348 z_map[i].z=(MagickRealType) (-0.045847*(
double) i);
1363 primary_info.y=(MagickRealType) ScaleQuantumToMap(
1364 ScaleCharToQuantum(156));
1365 primary_info.z=(MagickRealType) ScaleQuantumToMap(
1366 ScaleCharToQuantum(137));
1367 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
1369 x_map[i].x=0.005382*i;
1370 x_map[i].y=(-0.003296)*i;
1371 x_map[i].z=0.009410*i;
1372 y_map[i].x=0.010566*i;
1373 y_map[i].y=(-0.006471)*i;
1374 y_map[i].z=(-0.007880)*i;
1375 z_map[i].x=0.002052*i;
1376 z_map[i].y=0.009768*i;
1377 z_map[i].z=(-0.001530)*i;
1379 for ( ; i <= (ssize_t) MaxMap; i++)
1381 x_map[i].x=0.298839*(1.099*i-0.099);
1382 x_map[i].y=(-0.298839)*(1.099*i-0.099);
1383 x_map[i].z=0.70100*(1.099*i-0.099);
1384 y_map[i].x=0.586811*(1.099*i-0.099);
1385 y_map[i].y=(-0.586811)*(1.099*i-0.099);
1386 y_map[i].z=(-0.586811)*(1.099*i-0.099);
1387 z_map[i].x=0.114350*(1.099*i-0.099);
1388 z_map[i].y=0.88600*(1.099*i-0.099);
1389 z_map[i].z=(-0.114350)*(1.099*i-0.099);
1398#if defined(MAGICKCORE_OPENMP_SUPPORT)
1399 #pragma omp parallel for schedule(static)
1401 for (i=0; i <= (ssize_t) MaxMap; i++)
1403 x_map[i].x=(MagickRealType) (1.0*(
double) i);
1404 x_map[i].y=(MagickRealType) 0.0;
1405 x_map[i].z=(MagickRealType) 0.0;
1406 y_map[i].x=(MagickRealType) 0.0;
1407 y_map[i].y=(MagickRealType) (1.0*(
double) i);
1408 y_map[i].z=(MagickRealType) 0.0;
1409 z_map[i].x=(MagickRealType) 0.0;
1410 z_map[i].y=(MagickRealType) 0.0;
1411 z_map[i].z=(MagickRealType) (1.0*(
double) i);
1419 switch (image->storage_class)
1427 image_view=AcquireAuthenticCacheView(image,exception);
1428#if defined(MAGICKCORE_OPENMP_SUPPORT)
1429 #pragma omp parallel for schedule(static) shared(status) \
1430 magick_number_threads(image,image,image->rows,2)
1432 for (y=0; y < (ssize_t) image->rows; y++)
1451 if (status == MagickFalse)
1453 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1455 if (q == (Quantum *) NULL)
1460 for (x=0; x < (ssize_t) image->columns; x++)
1462 red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1463 GetPixelRed(image,q)));
1464 green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1465 GetPixelGreen(image,q)));
1466 blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
1467 GetPixelBlue(image,q)));
1468 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1470 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1472 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1474 SetPixelRed(image,ScaleMapToQuantum(pixel.red),q);
1475 SetPixelGreen(image,ScaleMapToQuantum(pixel.green),q);
1476 SetPixelBlue(image,ScaleMapToQuantum(pixel.blue),q);
1477 q+=(ptrdiff_t) GetPixelChannels(image);
1479 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1480 if (sync == MagickFalse)
1482 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1487#if defined(MAGICKCORE_OPENMP_SUPPORT)
1491 proceed=SetImageProgress(image,sRGBTransformImageTag,progress,
1493 if (proceed == MagickFalse)
1497 image_view=DestroyCacheView(image_view);
1510 for (i=0; i < (ssize_t) image->colors; i++)
1515 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
1516 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
1517 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
1518 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1519 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1520 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1521 image->colormap[i].red=(double) ScaleMapToQuantum(pixel.red);
1522 image->colormap[i].green=(double) ScaleMapToQuantum(pixel.green);
1523 image->colormap[i].blue=(double) ScaleMapToQuantum(pixel.blue);
1525 (void) SyncImage(image,exception);
1532 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1533 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1534 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1535 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1536 return(MagickFalse);
1567MagickExport MagickBooleanType SetImageColorspace(Image *image,
1568 const ColorspaceType colorspace,ExceptionInfo *exception)
1576 assert(image != (Image *) NULL);
1577 assert(image->signature == MagickCoreSignature);
1578 assert(exception != (ExceptionInfo *) NULL);
1579 assert(exception->signature == MagickCoreSignature);
1580 if (IsEventLogging() != MagickFalse)
1581 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1582 if (image->colorspace == colorspace)
1584 image->colorspace=colorspace;
1585 image->rendering_intent=UndefinedIntent;
1586 image->gamma=1.000/2.200;
1587 (void) memset(&image->chromaticity,0,
sizeof(image->chromaticity));
1589 if (IsGrayColorspace(colorspace) != MagickFalse)
1591 if (colorspace == LinearGRAYColorspace)
1596 if ((IsRGBColorspace(colorspace) != MagickFalse) ||
1597 (colorspace == XYZColorspace) || (colorspace == xyYColorspace))
1601 image->rendering_intent=PerceptualIntent;
1602 image->chromaticity.red_primary.x=0.6400;
1603 image->chromaticity.red_primary.y=0.3300;
1604 image->chromaticity.red_primary.z=0.0300;
1605 image->chromaticity.green_primary.x=0.3000;
1606 image->chromaticity.green_primary.y=0.6000;
1607 image->chromaticity.green_primary.z=0.1000;
1608 image->chromaticity.blue_primary.x=0.1500;
1609 image->chromaticity.blue_primary.y=0.0600;
1610 image->chromaticity.blue_primary.z=0.7900;
1611 image->chromaticity.white_point.x=0.3127;
1612 image->chromaticity.white_point.y=0.3290;
1613 image->chromaticity.white_point.z=0.3583;
1615 status=SyncImagePixelCache(image,exception);
1647MagickExport MagickBooleanType SetImageGray(Image *image,
1648 ExceptionInfo *exception)
1656 assert(image != (Image *) NULL);
1657 assert(image->signature == MagickCoreSignature);
1658 if (IsEventLogging() != MagickFalse)
1659 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1660 if (IsImageGray(image) != MagickFalse)
1662 if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1663 return(MagickFalse);
1664 value=GetImageProperty(image,
"colorspace:auto-grayscale",exception);
1665 if (IsStringFalse(value) != MagickFalse)
1666 return(MagickFalse);
1667 type=IdentifyImageGray(image,exception);
1668 if (type == UndefinedType)
1669 return(MagickFalse);
1670 image->colorspace=GRAYColorspace;
1671 if (SyncImagePixelCache(image,exception) == MagickFalse)
1672 return(MagickFalse);
1704MagickExport MagickBooleanType SetImageMonochrome(Image *image,
1705 ExceptionInfo *exception)
1710 assert(image != (Image *) NULL);
1711 assert(image->signature == MagickCoreSignature);
1712 if (IsEventLogging() != MagickFalse)
1713 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1714 if (IsImageMonochrome(image) != MagickFalse)
1716 if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1717 return(MagickFalse);
1718 is_bilevel=IdentifyImageMonochrome(image,exception);
1719 if (is_bilevel == MagickFalse)
1720 return(MagickFalse);
1721 image->colorspace=GRAYColorspace;
1722 if (SyncImagePixelCache((Image *) image,exception) == MagickFalse)
1723 return(MagickFalse);
1724 image->type=BilevelType;
1756MagickExport MagickBooleanType TransformImageColorspace(Image *image,
1757 const ColorspaceType colorspace,ExceptionInfo *exception)
1762 assert(image != (Image *) NULL);
1763 assert(image->signature == MagickCoreSignature);
1764 if (IsEventLogging() != MagickFalse)
1765 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1766 if (image->colorspace == colorspace)
1767 return(SetImageColorspace(image,colorspace,exception));
1768 (void) DeleteImageProfile(image,
"icc");
1769 (void) DeleteImageProfile(image,
"icm");
1770 if (colorspace == UndefinedColorspace)
1771 return(SetImageColorspace(image,colorspace,exception));
1775 if (IssRGBColorspace(colorspace) != MagickFalse)
1776 return(TransformsRGBImage(image,exception));
1778 if (IssRGBColorspace(image->colorspace) == MagickFalse)
1779 status=TransformsRGBImage(image,exception);
1780 if (status == MagickFalse)
1785 if (sRGBTransformImage(image,colorspace,exception) == MagickFalse)
1819static inline ssize_t RoundToYCC(
const double value)
1823 if (value >= 1388.0)
1825 return((ssize_t) (value+0.5));
1828static MagickBooleanType TransformsRGBImage(Image *image,
1829 ExceptionInfo *exception)
1831#define TransformsRGBImageTag "Transform/Image"
1836 0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1837 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1838 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1839 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1840 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1841 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1842 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1843 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1844 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1845 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1846 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1847 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1848 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1849 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1850 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1851 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1852 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1853 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1854 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1855 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1856 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1857 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1858 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1859 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1860 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1861 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1862 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1863 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1864 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1865 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1866 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1867 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1868 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1869 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1870 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1871 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1872 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1873 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1874 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1875 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1876 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1877 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1878 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1879 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1880 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1881 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1882 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1883 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1884 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1885 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1886 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1887 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1888 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1889 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1890 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1891 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1892 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1893 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1894 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1895 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1896 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1897 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1898 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1899 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1900 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1901 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1902 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1903 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1904 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1905 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1906 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1907 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1908 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1909 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1910 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1911 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1912 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1913 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1914 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1915 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1916 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1917 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1918 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1919 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1920 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1921 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1922 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1923 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1924 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1925 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1926 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1927 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1928 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1929 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1930 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1931 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1932 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1933 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1934 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1935 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1936 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1937 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1938 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1939 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1940 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1941 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1942 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1943 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1944 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1945 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1946 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1947 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1948 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1949 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1950 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1951 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1952 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1953 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1954 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1955 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1956 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1957 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1958 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1959 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1960 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1961 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1962 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1963 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1964 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1965 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1966 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1967 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1968 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1969 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1970 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1971 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1972 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1973 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1974 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1975 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1976 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1977 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1978 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1979 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1980 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1981 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1982 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1983 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1984 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1985 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1986 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1987 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1988 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1989 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1990 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1991 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1992 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1993 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1994 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1995 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1996 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1997 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1998 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1999 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
2000 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
2001 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
2002 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
2003 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
2004 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
2005 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
2006 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
2007 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
2008 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
2009 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
2010 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
2011 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
2012 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
2013 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
2014 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
2015 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
2016 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
2017 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
2018 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
2019 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
2020 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
2021 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
2022 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
2023 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
2024 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
2025 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
2026 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
2027 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
2028 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
2029 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
2030 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
2031 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
2032 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
2033 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
2034 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
2035 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
2036 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
2037 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
2038 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
2039 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
2040 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
2041 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
2042 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
2043 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
2044 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
2045 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
2046 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
2047 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
2048 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
2049 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
2050 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
2051 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
2052 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
2053 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
2054 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
2055 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
2056 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
2057 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
2058 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
2059 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
2060 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
2061 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
2062 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
2063 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
2064 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
2065 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
2066 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
2067 0.998559f, 0.999280f, 1.000000f
2077 illuminant = D65Illuminant;
2094 assert(image != (Image *) NULL);
2095 assert(image->signature == MagickCoreSignature);
2096 if (IsEventLogging() != MagickFalse)
2097 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2098 artifact=GetImageArtifact(image,
"color:illuminant");
2099 if (artifact != (
const char *) NULL)
2104 illuminant_type=ParseCommandOption(MagickIlluminantOptions,MagickFalse,
2106 if (illuminant_type < 0)
2107 illuminant=UndefinedIlluminant;
2109 illuminant=(IlluminantType) illuminant_type;
2113 switch (image->colorspace)
2115 case CMYKColorspace:
2123 if (image->storage_class == PseudoClass)
2125 if (SyncImage(image,exception) == MagickFalse)
2126 return(MagickFalse);
2127 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2128 return(MagickFalse);
2130 GetPixelInfo(image,&zero);
2131 image_view=AcquireAuthenticCacheView(image,exception);
2132#if defined(MAGICKCORE_OPENMP_SUPPORT)
2133 #pragma omp parallel for schedule(static) shared(status) \
2134 magick_number_threads(image,image,image->rows,2)
2136 for (y=0; y < (ssize_t) image->rows; y++)
2150 if (status == MagickFalse)
2152 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2154 if (q == (Quantum *) NULL)
2160 for (x=0; x < (ssize_t) image->columns; x++)
2162 GetPixelInfoPixel(image,q,&pixel);
2163 ConvertCMYKToRGB(&pixel);
2164 SetPixelViaPixelInfo(image,&pixel,q);
2165 q+=(ptrdiff_t) GetPixelChannels(image);
2167 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2168 if (sync == MagickFalse)
2171 image_view=DestroyCacheView(image_view);
2172 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2173 return(MagickFalse);
2176 case LinearGRAYColorspace:
2181 if (image->storage_class == PseudoClass)
2183 if (SyncImage(image,exception) == MagickFalse)
2184 return(MagickFalse);
2185 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2186 return(MagickFalse);
2188 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2189 return(MagickFalse);
2190 image_view=AcquireAuthenticCacheView(image,exception);
2191#if defined(MAGICKCORE_OPENMP_SUPPORT)
2192 #pragma omp parallel for schedule(static) shared(status) \
2193 magick_number_threads(image,image,image->rows,2)
2195 for (y=0; y < (ssize_t) image->rows; y++)
2206 if (status == MagickFalse)
2208 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2210 if (q == (Quantum *) NULL)
2215 for (x=0; x < (ssize_t) image->columns; x++)
2220 gray=0.212656*EncodePixelGamma(GetPixelRed(image,q))+0.715158*
2221 EncodePixelGamma(GetPixelGreen(image,q))+0.072186*
2222 EncodePixelGamma(GetPixelBlue(image,q));
2223 SetPixelRed(image,ClampToQuantum(gray),q);
2224 SetPixelGreen(image,ClampToQuantum(gray),q);
2225 SetPixelBlue(image,ClampToQuantum(gray),q);
2226 q+=(ptrdiff_t) GetPixelChannels(image);
2228 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2229 if (sync == MagickFalse)
2232 image_view=DestroyCacheView(image_view);
2233 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2234 return(MagickFalse);
2237 case GRAYColorspace:
2242 if (image->storage_class == PseudoClass)
2244 if (SyncImage(image,exception) == MagickFalse)
2245 return(MagickFalse);
2246 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2247 return(MagickFalse);
2249 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2250 return(MagickFalse);
2251 image_view=AcquireAuthenticCacheView(image,exception);
2252#if defined(MAGICKCORE_OPENMP_SUPPORT)
2253 #pragma omp parallel for schedule(static) shared(status) \
2254 magick_number_threads(image,image,image->rows,2)
2256 for (y=0; y < (ssize_t) image->rows; y++)
2267 if (status == MagickFalse)
2269 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2271 if (q == (Quantum *) NULL)
2276 for (x=0; x < (ssize_t) image->columns; x++)
2281 gray=0.212656*(double) GetPixelRed(image,q)+0.715158*(double)
2282 GetPixelGreen(image,q)+0.072186*(double) GetPixelBlue(image,q);
2283 SetPixelRed(image,ClampToQuantum(gray),q);
2284 SetPixelGreen(image,ClampToQuantum(gray),q);
2285 SetPixelBlue(image,ClampToQuantum(gray),q);
2286 q+=(ptrdiff_t) GetPixelChannels(image);
2288 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2289 if (sync == MagickFalse)
2292 image_view=DestroyCacheView(image_view);
2293 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2294 return(MagickFalse);
2297 case Adobe98Colorspace:
2299 case CAT02LMSColorspace:
2300 case DisplayP3Colorspace:
2302 case HCLpColorspace:
2308 case JzazbzColorspace:
2311 case LCHabColorspace:
2312 case LCHuvColorspace:
2315 case OklabColorspace:
2316 case OklchColorspace:
2317 case ProPhotoColorspace:
2320 case YCbCrColorspace:
2321 case YDbDrColorspace:
2323 case YPbPrColorspace:
2335 white_luminance=10000.0;
2336 value=GetImageProperty(image,
"white-luminance",exception);
2337 if (value != (
const char *) NULL)
2338 white_luminance=StringToDouble(value,(
char **) NULL);
2339 if (image->storage_class == PseudoClass)
2341 if (SyncImage(image,exception) == MagickFalse)
2342 return(MagickFalse);
2343 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2344 return(MagickFalse);
2346 image_view=AcquireAuthenticCacheView(image,exception);
2347#if defined(MAGICKCORE_OPENMP_SUPPORT)
2348 #pragma omp parallel for schedule(static) shared(status) \
2349 magick_number_threads(image,image,image->rows,2)
2351 for (y=0; y < (ssize_t) image->rows; y++)
2362 if (status == MagickFalse)
2364 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2366 if (q == (Quantum *) NULL)
2371 for (x=0; x < (ssize_t) image->columns; x++)
2378 ConvertGenericToRGB(image->colorspace,QuantumScale*
2379 GetPixelRed(image,q),QuantumScale*GetPixelGreen(image,q),
2380 QuantumScale*GetPixelBlue(image,q),white_luminance,illuminant,
2382 SetPixelRed(image,ClampToQuantum(red),q);
2383 SetPixelGreen(image,ClampToQuantum(green),q);
2384 SetPixelBlue(image,ClampToQuantum(blue),q);
2385 q+=(ptrdiff_t) GetPixelChannels(image);
2387 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2388 if (sync == MagickFalse)
2391 image_view=DestroyCacheView(image_view);
2392 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2393 return(MagickFalse);
2415 density=DisplayGamma;
2417 value=GetImageProperty(image,
"gamma",exception);
2418 if (value != (
const char *) NULL)
2419 gamma=MagickSafeReciprocal(StringToDouble(value,(
char **) NULL));
2420 film_gamma=FilmGamma;
2421 value=GetImageProperty(image,
"film-gamma",exception);
2422 if (value != (
const char *) NULL)
2423 film_gamma=StringToDouble(value,(
char **) NULL);
2424 reference_black=ReferenceBlack;
2425 value=GetImageProperty(image,
"reference-black",exception);
2426 if (value != (
const char *) NULL)
2427 reference_black=StringToDouble(value,(
char **) NULL);
2428 if (reference_black > MaximumLogarithmicColorspace)
2429 reference_black=MaximumLogarithmicColorspace;
2430 reference_white=ReferenceWhite;
2431 value=GetImageProperty(image,
"reference-white",exception);
2432 if (value != (
const char *) NULL)
2433 reference_white=StringToDouble(value,(
char **) NULL);
2434 if (reference_white > MaximumLogarithmicColorspace)
2435 reference_white=MaximumLogarithmicColorspace;
2436 if (reference_black > reference_white)
2437 reference_black=reference_white;
2438 logmap=(Quantum *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2440 if (logmap == (Quantum *) NULL)
2441 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2443 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002*
2444 MagickSafeReciprocal(film_gamma));
2445 for (i=0; i <= (ssize_t) (reference_black*MaxMap/MaximumLogarithmicColorspace); i++)
2446 logmap[i]=(Quantum) 0;
2447 for ( ; i < (ssize_t) (reference_white*MaxMap/MaximumLogarithmicColorspace); i++)
2448 logmap[i]=ClampToQuantum((
double) QuantumRange/(1.0-black)*
2449 (pow(10.0,(MaximumLogarithmicColorspace*i/MaxMap-reference_white)*
2450 (gamma/density)*0.002*MagickSafeReciprocal(film_gamma))-black));
2451 for ( ; i <= (ssize_t) MaxMap; i++)
2452 logmap[i]=QuantumRange;
2453 if (image->storage_class == PseudoClass)
2455 if ((SyncImage(image,exception) == MagickFalse) ||
2456 (SetImageStorageClass(image,DirectClass,exception) == MagickFalse))
2458 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2459 return(MagickFalse);
2462 image_view=AcquireAuthenticCacheView(image,exception);
2463#if defined(MAGICKCORE_OPENMP_SUPPORT)
2464 #pragma omp parallel for schedule(static) shared(status) \
2465 magick_number_threads(image,image,image->rows,2)
2467 for (y=0; y < (ssize_t) image->rows; y++)
2478 if (status == MagickFalse)
2480 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2482 if (q == (Quantum *) NULL)
2487 for (x=(ssize_t) image->columns; x != 0; x--)
2494 red=(double) logmap[ScaleQuantumToMap(GetPixelRed(image,q))];
2495 green=(double) logmap[ScaleQuantumToMap(GetPixelGreen(image,q))];
2496 blue=(double) logmap[ScaleQuantumToMap(GetPixelBlue(image,q))];
2497 SetPixelRed(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2499 SetPixelGreen(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2501 SetPixelBlue(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2503 q+=(ptrdiff_t) GetPixelChannels(image);
2505 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2506 if (sync == MagickFalse)
2509 image_view=DestroyCacheView(image_view);
2510 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2511 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2512 return(MagickFalse);
2516 case scRGBColorspace:
2521 if (image->storage_class == PseudoClass)
2523 if (SyncImage(image,exception) == MagickFalse)
2524 return(MagickFalse);
2525 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2526 return(MagickFalse);
2528 image_view=AcquireAuthenticCacheView(image,exception);
2529#if defined(MAGICKCORE_OPENMP_SUPPORT)
2530 #pragma omp parallel for schedule(static) shared(status) \
2531 magick_number_threads(image,image,image->rows,2)
2533 for (y=0; y < (ssize_t) image->rows; y++)
2544 if (status == MagickFalse)
2546 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2548 if (q == (Quantum *) NULL)
2553 for (x=(ssize_t) image->columns; x != 0; x--)
2560 red=EncodePixelGamma((MagickRealType) GetPixelRed(image,q));
2561 green=EncodePixelGamma((MagickRealType) GetPixelGreen(image,q));
2562 blue=EncodePixelGamma((MagickRealType) GetPixelBlue(image,q));
2563 SetPixelRed(image,ClampToQuantum(red),q);
2564 SetPixelGreen(image,ClampToQuantum(green),q);
2565 SetPixelBlue(image,ClampToQuantum(blue),q);
2566 q+=(ptrdiff_t) GetPixelChannels(image);
2568 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2569 if (sync == MagickFalse)
2572 image_view=DestroyCacheView(image_view);
2573 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2574 return(MagickFalse);
2583 x_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2585 y_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2587 z_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2589 if ((x_map == (TransformPacket *) NULL) ||
2590 (y_map == (TransformPacket *) NULL) ||
2591 (z_map == (TransformPacket *) NULL))
2593 if (z_map != (TransformPacket *) NULL)
2594 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2595 if (y_map != (TransformPacket *) NULL)
2596 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2597 if (x_map != (TransformPacket *) NULL)
2598 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2599 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2602 switch (image->colorspace)
2604 case OHTAColorspace:
2619#if defined(MAGICKCORE_OPENMP_SUPPORT)
2620 #pragma omp parallel for schedule(static)
2622 for (i=0; i <= (ssize_t) MaxMap; i++)
2624 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2625 y_map[i].x=(MagickRealType) (0.5*1.00000*(2.0*(
double) i-MaxMap));
2626 z_map[i].x=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2627 x_map[i].y=(MagickRealType) (1.0*(
double) i);
2628 y_map[i].y=(MagickRealType) (0.5*0.00000*(2.0*(
double) i-MaxMap));
2629 z_map[i].y=(MagickRealType) (0.5*1.33333*(2.0*(
double) i-MaxMap));
2630 x_map[i].z=(MagickRealType) (1.0*(
double) i);
2631 y_map[i].z=(MagickRealType) (-0.5*1.00000*(2.0*(
double) i-MaxMap));
2632 z_map[i].z=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2636 case Rec601YCbCrColorspace:
2648#if defined(MAGICKCORE_OPENMP_SUPPORT)
2649 #pragma omp parallel for schedule(static)
2651 for (i=0; i <= (ssize_t) MaxMap; i++)
2653 x_map[i].x=0.99999999999914679361*(double) i;
2654 y_map[i].x=0.5*(-1.2188941887145875e-06)*(2.00*(
double) i-MaxMap);
2655 z_map[i].x=0.5*1.4019995886561440468*(2.00*(double) i-MaxMap);
2656 x_map[i].y=0.99999975910502514331*(double) i;
2657 y_map[i].y=0.5*(-0.34413567816504303521)*(2.00*(
double) i-MaxMap);
2658 z_map[i].y=0.5*(-0.71413649331646789076)*(2.00*(
double) i-MaxMap);
2659 x_map[i].z=1.00000124040004623180*(double) i;
2660 y_map[i].z=0.5*1.77200006607230409200*(2.00*(double) i-MaxMap);
2661 z_map[i].z=0.5*2.1453384174593273e-06*(2.00*(double) i-MaxMap);
2665 case Rec709YCbCrColorspace:
2677#if defined(MAGICKCORE_OPENMP_SUPPORT)
2678 #pragma omp parallel for schedule(static)
2680 for (i=0; i <= (ssize_t) MaxMap; i++)
2682 x_map[i].x=(MagickRealType) (1.0*i);
2683 y_map[i].x=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2684 z_map[i].x=(MagickRealType) (0.5*1.574800*(2.0*i-MaxMap));
2685 x_map[i].y=(MagickRealType) (1.0*i);
2686 y_map[i].y=(MagickRealType) (0.5*(-0.187324)*(2.0*i-MaxMap));
2687 z_map[i].y=(MagickRealType) (0.5*(-0.468124)*(2.0*i-MaxMap));
2688 x_map[i].z=(MagickRealType) (1.0*i);
2689 y_map[i].z=(MagickRealType) (0.5*1.855600*(2.0*i-MaxMap));
2690 z_map[i].z=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2705#if defined(MAGICKCORE_OPENMP_SUPPORT)
2706 #pragma omp parallel for schedule(static)
2708 for (i=0; i <= (ssize_t) MaxMap; i++)
2710 x_map[i].x=(MagickRealType) (1.3584000*(
double) i);
2711 y_map[i].x=(MagickRealType) 0.0000000;
2712 z_map[i].x=(MagickRealType) (1.8215000*(1.0*(
double) i-(
double)
2713 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2714 x_map[i].y=(MagickRealType) (1.3584000*(
double) i);
2715 y_map[i].y=(MagickRealType) (-0.4302726*(1.0*(
double) i-(
double)
2716 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2717 z_map[i].y=(MagickRealType) (-0.9271435*(1.0*(
double) i-(
double)
2718 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2719 x_map[i].z=(MagickRealType) (1.3584000*(
double) i);
2720 y_map[i].z=(MagickRealType) (2.2179000*(1.0*(
double) i-(
double)
2721 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2722 z_map[i].z=(MagickRealType) 0.0000000;
2731#if defined(MAGICKCORE_OPENMP_SUPPORT)
2732 #pragma omp parallel for schedule(static)
2734 for (i=0; i <= (ssize_t) MaxMap; i++)
2736 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2737 y_map[i].x=(MagickRealType) 0.0;
2738 z_map[i].x=(MagickRealType) 0.0;
2739 x_map[i].y=(MagickRealType) 0.0;
2740 y_map[i].y=(MagickRealType) (1.0*(
double) i);
2741 z_map[i].y=(MagickRealType) 0.0;
2742 x_map[i].z=(MagickRealType) 0.0;
2743 y_map[i].z=(MagickRealType) 0.0;
2744 z_map[i].z=(MagickRealType) (1.0*(
double) i);
2752 switch (image->storage_class)
2760 image_view=AcquireAuthenticCacheView(image,exception);
2761#if defined(MAGICKCORE_OPENMP_SUPPORT)
2762 #pragma omp parallel for schedule(static) shared(status) \
2763 magick_number_threads(image,image,image->rows,2)
2765 for (y=0; y < (ssize_t) image->rows; y++)
2779 if (status == MagickFalse)
2781 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2783 if (q == (Quantum *) NULL)
2788 for (x=0; x < (ssize_t) image->columns; x++)
2795 red=ScaleQuantumToMap(GetPixelRed(image,q));
2796 green=ScaleQuantumToMap(GetPixelGreen(image,q));
2797 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
2798 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2799 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2800 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2801 if (image->colorspace == YCCColorspace)
2803 pixel.red=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2804 MaximumLogarithmicColorspace*pixel.red/(
double) MaxMap)];
2805 pixel.green=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2806 MaximumLogarithmicColorspace*pixel.green/(
double) MaxMap)];
2807 pixel.blue=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2808 MaximumLogarithmicColorspace*pixel.blue/(
double) MaxMap)];
2812 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2813 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2814 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2816 SetPixelRed(image,ClampToQuantum(pixel.red),q);
2817 SetPixelGreen(image,ClampToQuantum(pixel.green),q);
2818 SetPixelBlue(image,ClampToQuantum(pixel.blue),q);
2819 q+=(ptrdiff_t) GetPixelChannels(image);
2821 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2822 if (sync == MagickFalse)
2824 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2829#if defined(MAGICKCORE_OPENMP_SUPPORT)
2833 proceed=SetImageProgress(image,TransformsRGBImageTag,progress,
2835 if (proceed == MagickFalse)
2839 image_view=DestroyCacheView(image_view);
2847#if defined(MAGICKCORE_OPENMP_SUPPORT)
2848 #pragma omp parallel for schedule(static) shared(status) \
2849 magick_number_threads(image,image,image->rows,1)
2851 for (i=0; i < (ssize_t) image->colors; i++)
2861 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
2862 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
2863 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
2864 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2865 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2866 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2867 if (image->colorspace == YCCColorspace)
2869 pixel.red=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2870 MaximumLogarithmicColorspace*pixel.red/(
double) MaxMap)];
2871 pixel.green=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2872 MaximumLogarithmicColorspace*pixel.green/(
double) MaxMap)];
2873 pixel.blue=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2874 MaximumLogarithmicColorspace*pixel.blue/(
double) MaxMap)];
2878 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2879 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2880 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2882 image->colormap[i].red=(double) ClampToQuantum(pixel.red);
2883 image->colormap[i].green=(double) ClampToQuantum(pixel.green);
2884 image->colormap[i].blue=(double) ClampToQuantum(pixel.blue);
2886 (void) SyncImage(image,exception);
2893 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2894 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2895 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2896 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2897 return(MagickFalse);