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 return(MagickFalse);
2457 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2458 return(MagickFalse);
2460 image_view=AcquireAuthenticCacheView(image,exception);
2461#if defined(MAGICKCORE_OPENMP_SUPPORT)
2462 #pragma omp parallel for schedule(static) shared(status) \
2463 magick_number_threads(image,image,image->rows,2)
2465 for (y=0; y < (ssize_t) image->rows; y++)
2476 if (status == MagickFalse)
2478 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2480 if (q == (Quantum *) NULL)
2485 for (x=(ssize_t) image->columns; x != 0; x--)
2492 red=(double) logmap[ScaleQuantumToMap(GetPixelRed(image,q))];
2493 green=(double) logmap[ScaleQuantumToMap(GetPixelGreen(image,q))];
2494 blue=(double) logmap[ScaleQuantumToMap(GetPixelBlue(image,q))];
2495 SetPixelRed(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2497 SetPixelGreen(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2499 SetPixelBlue(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2501 q+=(ptrdiff_t) GetPixelChannels(image);
2503 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2504 if (sync == MagickFalse)
2507 image_view=DestroyCacheView(image_view);
2508 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2509 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2510 return(MagickFalse);
2514 case scRGBColorspace:
2519 if (image->storage_class == PseudoClass)
2521 if (SyncImage(image,exception) == MagickFalse)
2522 return(MagickFalse);
2523 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2524 return(MagickFalse);
2526 image_view=AcquireAuthenticCacheView(image,exception);
2527#if defined(MAGICKCORE_OPENMP_SUPPORT)
2528 #pragma omp parallel for schedule(static) shared(status) \
2529 magick_number_threads(image,image,image->rows,2)
2531 for (y=0; y < (ssize_t) image->rows; y++)
2542 if (status == MagickFalse)
2544 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2546 if (q == (Quantum *) NULL)
2551 for (x=(ssize_t) image->columns; x != 0; x--)
2558 red=EncodePixelGamma((MagickRealType) GetPixelRed(image,q));
2559 green=EncodePixelGamma((MagickRealType) GetPixelGreen(image,q));
2560 blue=EncodePixelGamma((MagickRealType) GetPixelBlue(image,q));
2561 SetPixelRed(image,ClampToQuantum(red),q);
2562 SetPixelGreen(image,ClampToQuantum(green),q);
2563 SetPixelBlue(image,ClampToQuantum(blue),q);
2564 q+=(ptrdiff_t) GetPixelChannels(image);
2566 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2567 if (sync == MagickFalse)
2570 image_view=DestroyCacheView(image_view);
2571 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2572 return(MagickFalse);
2581 x_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2583 y_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2585 z_map=(TransformPacket *) AcquireQuantumMemory((
size_t) MaxMap+1UL,
2587 if ((x_map == (TransformPacket *) NULL) ||
2588 (y_map == (TransformPacket *) NULL) ||
2589 (z_map == (TransformPacket *) NULL))
2591 if (z_map != (TransformPacket *) NULL)
2592 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2593 if (y_map != (TransformPacket *) NULL)
2594 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2595 if (x_map != (TransformPacket *) NULL)
2596 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2597 ThrowBinaryException(ResourceLimitError,
"MemoryAllocationFailed",
2600 switch (image->colorspace)
2602 case OHTAColorspace:
2617#if defined(MAGICKCORE_OPENMP_SUPPORT)
2618 #pragma omp parallel for schedule(static)
2620 for (i=0; i <= (ssize_t) MaxMap; i++)
2622 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2623 y_map[i].x=(MagickRealType) (0.5*1.00000*(2.0*(
double) i-MaxMap));
2624 z_map[i].x=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2625 x_map[i].y=(MagickRealType) (1.0*(
double) i);
2626 y_map[i].y=(MagickRealType) (0.5*0.00000*(2.0*(
double) i-MaxMap));
2627 z_map[i].y=(MagickRealType) (0.5*1.33333*(2.0*(
double) i-MaxMap));
2628 x_map[i].z=(MagickRealType) (1.0*(
double) i);
2629 y_map[i].z=(MagickRealType) (-0.5*1.00000*(2.0*(
double) i-MaxMap));
2630 z_map[i].z=(MagickRealType) (-0.5*0.66668*(2.0*(
double) i-MaxMap));
2634 case Rec601YCbCrColorspace:
2646#if defined(MAGICKCORE_OPENMP_SUPPORT)
2647 #pragma omp parallel for schedule(static)
2649 for (i=0; i <= (ssize_t) MaxMap; i++)
2651 x_map[i].x=0.99999999999914679361*(double) i;
2652 y_map[i].x=0.5*(-1.2188941887145875e-06)*(2.00*(
double) i-MaxMap);
2653 z_map[i].x=0.5*1.4019995886561440468*(2.00*(double) i-MaxMap);
2654 x_map[i].y=0.99999975910502514331*(double) i;
2655 y_map[i].y=0.5*(-0.34413567816504303521)*(2.00*(
double) i-MaxMap);
2656 z_map[i].y=0.5*(-0.71413649331646789076)*(2.00*(
double) i-MaxMap);
2657 x_map[i].z=1.00000124040004623180*(double) i;
2658 y_map[i].z=0.5*1.77200006607230409200*(2.00*(double) i-MaxMap);
2659 z_map[i].z=0.5*2.1453384174593273e-06*(2.00*(double) i-MaxMap);
2663 case Rec709YCbCrColorspace:
2675#if defined(MAGICKCORE_OPENMP_SUPPORT)
2676 #pragma omp parallel for schedule(static)
2678 for (i=0; i <= (ssize_t) MaxMap; i++)
2680 x_map[i].x=(MagickRealType) (1.0*i);
2681 y_map[i].x=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2682 z_map[i].x=(MagickRealType) (0.5*1.574800*(2.0*i-MaxMap));
2683 x_map[i].y=(MagickRealType) (1.0*i);
2684 y_map[i].y=(MagickRealType) (0.5*(-0.187324)*(2.0*i-MaxMap));
2685 z_map[i].y=(MagickRealType) (0.5*(-0.468124)*(2.0*i-MaxMap));
2686 x_map[i].z=(MagickRealType) (1.0*i);
2687 y_map[i].z=(MagickRealType) (0.5*1.855600*(2.0*i-MaxMap));
2688 z_map[i].z=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2703#if defined(MAGICKCORE_OPENMP_SUPPORT)
2704 #pragma omp parallel for schedule(static)
2706 for (i=0; i <= (ssize_t) MaxMap; i++)
2708 x_map[i].x=(MagickRealType) (1.3584000*(
double) i);
2709 y_map[i].x=(MagickRealType) 0.0000000;
2710 z_map[i].x=(MagickRealType) (1.8215000*(1.0*(
double) i-(
double)
2711 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2712 x_map[i].y=(MagickRealType) (1.3584000*(
double) i);
2713 y_map[i].y=(MagickRealType) (-0.4302726*(1.0*(
double) i-(
double)
2714 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2715 z_map[i].y=(MagickRealType) (-0.9271435*(1.0*(
double) i-(
double)
2716 ScaleQuantumToMap(ScaleCharToQuantum(137))));
2717 x_map[i].z=(MagickRealType) (1.3584000*(
double) i);
2718 y_map[i].z=(MagickRealType) (2.2179000*(1.0*(
double) i-(
double)
2719 ScaleQuantumToMap(ScaleCharToQuantum(156))));
2720 z_map[i].z=(MagickRealType) 0.0000000;
2729#if defined(MAGICKCORE_OPENMP_SUPPORT)
2730 #pragma omp parallel for schedule(static)
2732 for (i=0; i <= (ssize_t) MaxMap; i++)
2734 x_map[i].x=(MagickRealType) (1.0*(
double) i);
2735 y_map[i].x=(MagickRealType) 0.0;
2736 z_map[i].x=(MagickRealType) 0.0;
2737 x_map[i].y=(MagickRealType) 0.0;
2738 y_map[i].y=(MagickRealType) (1.0*(
double) i);
2739 z_map[i].y=(MagickRealType) 0.0;
2740 x_map[i].z=(MagickRealType) 0.0;
2741 y_map[i].z=(MagickRealType) 0.0;
2742 z_map[i].z=(MagickRealType) (1.0*(
double) i);
2750 switch (image->storage_class)
2758 image_view=AcquireAuthenticCacheView(image,exception);
2759#if defined(MAGICKCORE_OPENMP_SUPPORT)
2760 #pragma omp parallel for schedule(static) shared(status) \
2761 magick_number_threads(image,image,image->rows,2)
2763 for (y=0; y < (ssize_t) image->rows; y++)
2777 if (status == MagickFalse)
2779 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2781 if (q == (Quantum *) NULL)
2786 for (x=0; x < (ssize_t) image->columns; x++)
2793 red=ScaleQuantumToMap(GetPixelRed(image,q));
2794 green=ScaleQuantumToMap(GetPixelGreen(image,q));
2795 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
2796 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2797 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2798 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2799 if (image->colorspace == YCCColorspace)
2801 pixel.red=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2802 MaximumLogarithmicColorspace*pixel.red/(
double) MaxMap)];
2803 pixel.green=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2804 MaximumLogarithmicColorspace*pixel.green/(
double) MaxMap)];
2805 pixel.blue=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2806 MaximumLogarithmicColorspace*pixel.blue/(
double) MaxMap)];
2810 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2811 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2812 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2814 SetPixelRed(image,ClampToQuantum(pixel.red),q);
2815 SetPixelGreen(image,ClampToQuantum(pixel.green),q);
2816 SetPixelBlue(image,ClampToQuantum(pixel.blue),q);
2817 q+=(ptrdiff_t) GetPixelChannels(image);
2819 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2820 if (sync == MagickFalse)
2822 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2827#if defined(MAGICKCORE_OPENMP_SUPPORT)
2831 proceed=SetImageProgress(image,TransformsRGBImageTag,progress,
2833 if (proceed == MagickFalse)
2837 image_view=DestroyCacheView(image_view);
2845#if defined(MAGICKCORE_OPENMP_SUPPORT)
2846 #pragma omp parallel for schedule(static) shared(status) \
2847 magick_number_threads(image,image,image->rows,1)
2849 for (i=0; i < (ssize_t) image->colors; i++)
2859 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
2860 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
2861 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
2862 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2863 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2864 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2865 if (image->colorspace == YCCColorspace)
2867 pixel.red=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2868 MaximumLogarithmicColorspace*pixel.red/(
double) MaxMap)];
2869 pixel.green=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2870 MaximumLogarithmicColorspace*pixel.green/(
double) MaxMap)];
2871 pixel.blue=(double) QuantumRange*(
double) YCCMap[RoundToYCC(
2872 MaximumLogarithmicColorspace*pixel.blue/(
double) MaxMap)];
2876 pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2877 pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2878 pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
2880 image->colormap[i].red=(double) ClampToQuantum(pixel.red);
2881 image->colormap[i].green=(double) ClampToQuantum(pixel.green);
2882 image->colormap[i].blue=(double) ClampToQuantum(pixel.blue);
2884 (void) SyncImage(image,exception);
2891 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2892 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2893 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2894 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2895 return(MagickFalse);