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);