2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % CCCC OOO L OOO RRRR SSSSS PPPP AAA CCCC EEEEE %
7 % C O O L O O R R SS P P A A C E %
8 % C O O L O O RRRR SSS PPPP AAAAA C EEE %
9 % C O O L O O R R SS P A A C E %
10 % CCCC OOO LLLLL OOO R R SSSSS P A A CCCC EEEEE %
13 % MagickCore Image Colorspace Methods %
20 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % http://www.imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
42 #include "MagickCore/studio.h"
43 #include "MagickCore/property.h"
44 #include "MagickCore/cache.h"
45 #include "MagickCore/cache-private.h"
46 #include "MagickCore/cache-view.h"
47 #include "MagickCore/color.h"
48 #include "MagickCore/color-private.h"
49 #include "MagickCore/colorspace.h"
50 #include "MagickCore/colorspace-private.h"
51 #include "MagickCore/exception.h"
52 #include "MagickCore/exception-private.h"
53 #include "MagickCore/image.h"
54 #include "MagickCore/image-private.h"
55 #include "MagickCore/gem.h"
56 #include "MagickCore/memory_.h"
57 #include "MagickCore/monitor.h"
58 #include "MagickCore/monitor-private.h"
59 #include "MagickCore/pixel-accessor.h"
60 #include "MagickCore/quantize.h"
61 #include "MagickCore/quantum.h"
62 #include "MagickCore/quantum-private.h"
63 #include "MagickCore/string_.h"
64 #include "MagickCore/string-private.h"
65 #include "MagickCore/utility.h"
70 typedef struct _TransformPacket
79 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
83 + R G B T r a n s f o r m I m a g e %
87 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89 % RGBTransformImage() converts the reference image from RGB to an alternate
90 % colorspace. The transformation matrices are not the standard ones: the
91 % weights are rescaled to normalized the range of the transformed values to
92 % be [0..QuantumRange].
94 % The format of the RGBTransformImage method is:
96 % MagickBooleanType RGBTransformImage(Image *image,
97 % const ColorspaceType colorspace)
99 % A description of each parameter follows:
101 % o image: the image.
103 % o colorspace: the colorspace to transform the image to.
107 static inline void ConvertRGBToXYZ(const Quantum red,const Quantum green,
108 const Quantum blue,double *X,double *Y,double *Z)
115 assert(X != (double *) NULL);
116 assert(Y != (double *) NULL);
117 assert(Z != (double *) NULL);
120 r=pow((r+0.055)/1.055,2.4);
123 g=QuantumScale*green;
125 g=pow((g+0.055)/1.055,2.4);
130 b=pow((b+0.055)/1.055,2.4);
133 *X=0.4124240*r+0.3575790*g+0.1804640*b;
134 *Y=0.2126560*r+0.7151580*g+0.0721856*b;
135 *Z=0.0193324*r+0.1191930*g+0.9504440*b;
138 static double LabF1(double alpha)
141 if (alpha <= ((24.0/116.0)*(24.0/116.0)*(24.0/116.0)))
142 return((841.0/108.0)*alpha+(16.0/116.0));
143 return(pow(alpha,1.0/3.0));
146 static inline void ConvertXYZToLab(const double X,const double Y,const double Z,
147 double *L,double *a,double *b)
149 #define D50X (0.9642)
151 #define D50Z (0.8249)
158 assert(L != (double *) NULL);
159 assert(a != (double *) NULL);
160 assert(b != (double *) NULL);
164 if ((X == 0.0) && (Y == 0.0) && (Z == 0.0))
169 *L=(116.0*fy-16.0)/100.0;
170 *a=(500.0*(fx-fy))/255.0;
173 *b=(200.0*(fy-fz))/255.0;
178 MagickExport MagickBooleanType RGBTransformImage(Image *image,
179 const ColorspaceType colorspace)
181 #define RGBTransformImageTag "RGBTransform/Image"
210 assert(image != (Image *) NULL);
211 assert(image->signature == MagickSignature);
212 if (image->debug != MagickFalse)
213 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
214 assert(colorspace != RGBColorspace);
215 assert(colorspace != TransparentColorspace);
216 assert(colorspace != UndefinedColorspace);
217 switch (image->colorspace)
220 case Rec601LumaColorspace:
221 case Rec709LumaColorspace:
223 case TransparentColorspace:
227 (void) TransformImageColorspace(image,image->colorspace);
231 if (SetImageColorspace(image,colorspace) == MagickFalse)
235 exception=(&image->exception);
241 Convert RGB to CMY colorspace.
243 if (image->storage_class == PseudoClass)
245 if (SyncImage(image) == MagickFalse)
247 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
250 image_view=AcquireCacheView(image);
251 #if defined(MAGICKCORE_OPENMP_SUPPORT)
252 #pragma omp parallel for schedule(dynamic,4) shared(status)
254 for (y=0; y < (ssize_t) image->rows; y++)
262 if (status == MagickFalse)
264 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
266 if (q == (const Quantum *) NULL)
271 for (x=0; x < (ssize_t) image->columns; x++)
273 SetPixelRed(image,ClampToQuantum((MagickRealType) (QuantumRange-
274 GetPixelRed(image,q))),q);
275 SetPixelGreen(image,ClampToQuantum((MagickRealType) (QuantumRange-
276 GetPixelGreen(image,q))),q);
277 SetPixelBlue(image,ClampToQuantum((MagickRealType) (QuantumRange-
278 GetPixelBlue(image,q))),q);
279 q+=GetPixelChannels(image);
281 sync=SyncCacheViewAuthenticPixels(image_view,exception);
282 if (sync == MagickFalse)
285 image_view=DestroyCacheView(image_view);
286 image->type=image->matte == MagickFalse ? ColorSeparationType :
287 ColorSeparationMatteType;
296 Convert RGB to CMYK colorspace.
298 if (image->storage_class == PseudoClass)
300 if (SyncImage(image) == MagickFalse)
302 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
305 GetPixelInfo(image,&zero);
306 image_view=AcquireCacheView(image);
307 #if defined(MAGICKCORE_OPENMP_SUPPORT)
308 #pragma omp parallel for schedule(dynamic,4) shared(status)
310 for (y=0; y < (ssize_t) image->rows; y++)
321 if (status == MagickFalse)
323 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
325 if (q == (const Quantum *) NULL)
331 for (x=0; x < (ssize_t) image->columns; x++)
333 SetPixelInfo(image,q,&pixel);
334 ConvertRGBToCMYK(&pixel);
335 SetPixelPixelInfo(image,&pixel,q);
336 q+=GetPixelChannels(image);
338 sync=SyncCacheViewAuthenticPixels(image_view,exception);
339 if (sync == MagickFalse)
342 image_view=DestroyCacheView(image_view);
343 image->type=image->matte == MagickFalse ? ColorSeparationType :
344 ColorSeparationMatteType;
350 Transform image from RGB to HSB.
352 if (image->storage_class == PseudoClass)
354 if (SyncImage(image) == MagickFalse)
356 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
359 image_view=AcquireCacheView(image);
360 #if defined(MAGICKCORE_OPENMP_SUPPORT)
361 #pragma omp parallel for schedule(dynamic,4) shared(status)
363 for (y=0; y < (ssize_t) image->rows; y++)
376 if (status == MagickFalse)
378 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
380 if (q == (const Quantum *) NULL)
388 for (x=0; x < (ssize_t) image->columns; x++)
390 ConvertRGBToHSB(GetPixelRed(image,q),GetPixelGreen(image,q),
391 GetPixelBlue(image,q),&hue,&saturation,&brightness);
392 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
394 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
396 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
398 q+=GetPixelChannels(image);
400 sync=SyncCacheViewAuthenticPixels(image_view,exception);
401 if (sync == MagickFalse)
404 image_view=DestroyCacheView(image_view);
410 Transform image from RGB to HSL.
412 if (image->storage_class == PseudoClass)
414 if (SyncImage(image) == MagickFalse)
416 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
419 image_view=AcquireCacheView(image);
420 #if defined(MAGICKCORE_OPENMP_SUPPORT)
421 #pragma omp parallel for schedule(dynamic,4) shared(status)
423 for (y=0; y < (ssize_t) image->rows; y++)
436 if (status == MagickFalse)
438 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
440 if (q == (const Quantum *) NULL)
448 for (x=0; x < (ssize_t) image->columns; x++)
450 ConvertRGBToHSL(GetPixelRed(image,q),GetPixelGreen(image,q),
451 GetPixelBlue(image,q),&hue,&saturation,&lightness);
452 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
454 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
456 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
458 q+=GetPixelChannels(image);
460 sync=SyncCacheViewAuthenticPixels(image_view,exception);
461 if (sync == MagickFalse)
464 image_view=DestroyCacheView(image_view);
470 Transform image from RGB to HWB.
472 if (image->storage_class == PseudoClass)
474 if (SyncImage(image) == MagickFalse)
476 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
479 image_view=AcquireCacheView(image);
480 #if defined(MAGICKCORE_OPENMP_SUPPORT)
481 #pragma omp parallel for schedule(dynamic,4) shared(status)
483 for (y=0; y < (ssize_t) image->rows; y++)
496 if (status == MagickFalse)
498 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
500 if (q == (const Quantum *) NULL)
508 for (x=0; x < (ssize_t) image->columns; x++)
510 ConvertRGBToHWB(GetPixelRed(image,q),GetPixelGreen(image,q),
511 GetPixelBlue(image,q),&hue,&whiteness,&blackness);
512 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
514 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
516 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
518 q+=GetPixelChannels(image);
520 sync=SyncCacheViewAuthenticPixels(image_view,exception);
521 if (sync == MagickFalse)
524 image_view=DestroyCacheView(image_view);
530 Transform image from RGB to Lab.
532 if (image->storage_class == PseudoClass)
534 if (SyncImage(image) == MagickFalse)
536 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
539 image_view=AcquireCacheView(image);
540 #if defined(MAGICKCORE_OPENMP_SUPPORT)
541 #pragma omp parallel for schedule(dynamic,4) shared(status)
543 for (y=0; y < (ssize_t) image->rows; y++)
559 if (status == MagickFalse)
561 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
563 if (q == (const Quantum *) NULL)
574 for (x=0; x < (ssize_t) image->columns; x++)
576 ConvertRGBToXYZ(GetPixelRed(image,q),GetPixelGreen(image,q),
577 GetPixelBlue(image,q),&X,&Y,&Z);
578 ConvertXYZToLab(X,Y,Z,&L,&a,&b);
579 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
581 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
583 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
585 q+=GetPixelChannels(image);
587 sync=SyncCacheViewAuthenticPixels(image_view,exception);
588 if (sync == MagickFalse)
591 image_view=DestroyCacheView(image_view);
596 #define DisplayGamma (1.0/1.7)
597 #define FilmGamma 0.6
598 #define ReferenceBlack 95.0
599 #define ReferenceWhite 685.0
616 Transform RGB to Log colorspace.
618 density=DisplayGamma;
620 value=GetImageProperty(image,"gamma");
621 if (value != (const char *) NULL)
622 gamma=1.0/InterpretLocaleValue(value,(char **) NULL) != 0.0 ?
623 InterpretLocaleValue(value,(char **) NULL) : 1.0;
624 film_gamma=FilmGamma;
625 value=GetImageProperty(image,"film-gamma");
626 if (value != (const char *) NULL)
627 film_gamma=InterpretLocaleValue(value,(char **) NULL);
628 reference_black=ReferenceBlack;
629 value=GetImageProperty(image,"reference-black");
630 if (value != (const char *) NULL)
631 reference_black=InterpretLocaleValue(value,(char **) NULL);
632 reference_white=ReferenceWhite;
633 value=GetImageProperty(image,"reference-white");
634 if (value != (const char *) NULL)
635 reference_white=InterpretLocaleValue(value,(char **) NULL);
636 logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
638 if (logmap == (Quantum *) NULL)
639 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
641 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*
643 #if defined(MAGICKCORE_OPENMP_SUPPORT)
644 #pragma omp parallel for schedule(dynamic,4)
646 for (i=0; i <= (ssize_t) MaxMap; i++)
647 logmap[i]=ScaleMapToQuantum((MagickRealType) (MaxMap*(reference_white+
648 log10(black+((MagickRealType) i/MaxMap)*(1.0-black))/((gamma/density)*
649 0.002/film_gamma))/1024.0));
650 image_view=AcquireCacheView(image);
651 #if defined(MAGICKCORE_OPENMP_SUPPORT)
652 #pragma omp parallel for schedule(dynamic,4) shared(status)
654 for (y=0; y < (ssize_t) image->rows; y++)
662 if (status == MagickFalse)
664 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
666 if (q == (const Quantum *) NULL)
671 for (x=(ssize_t) image->columns; x != 0; x--)
673 SetPixelRed(image,logmap[ScaleQuantumToMap(
674 GetPixelRed(image,q))],q);
675 SetPixelGreen(image,logmap[ScaleQuantumToMap(
676 GetPixelGreen(image,q))],q);
677 SetPixelBlue(image,logmap[ScaleQuantumToMap(
678 GetPixelBlue(image,q))],q);
679 q+=GetPixelChannels(image);
681 sync=SyncCacheViewAuthenticPixels(image_view,exception);
682 if (sync == MagickFalse)
685 image_view=DestroyCacheView(image_view);
686 logmap=(Quantum *) RelinquishMagickMemory(logmap);
695 x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
697 y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
699 z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
701 if ((x_map == (TransformPacket *) NULL) ||
702 (y_map == (TransformPacket *) NULL) ||
703 (z_map == (TransformPacket *) NULL))
704 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
706 (void) ResetMagickMemory(&primary_info,0,sizeof(primary_info));
712 Initialize OHTA tables:
714 I1 = 0.33333*R+0.33334*G+0.33333*B
715 I2 = 0.50000*R+0.00000*G-0.50000*B
716 I3 =-0.25000*R+0.50000*G-0.25000*B
718 I and Q, normally -0.5 through 0.5, are normalized to the range 0
719 through QuantumRange.
721 primary_info.y=(double) (MaxMap+1.0)/2.0;
722 primary_info.z=(double) (MaxMap+1.0)/2.0;
723 #if defined(MAGICKCORE_OPENMP_SUPPORT)
724 #pragma omp parallel for schedule(dynamic,4)
726 for (i=0; i <= (ssize_t) MaxMap; i++)
728 x_map[i].x=0.33333f*(MagickRealType) i;
729 y_map[i].x=0.33334f*(MagickRealType) i;
730 z_map[i].x=0.33333f*(MagickRealType) i;
731 x_map[i].y=0.50000f*(MagickRealType) i;
732 y_map[i].y=0.00000f*(MagickRealType) i;
733 z_map[i].y=(-0.50000f)*(MagickRealType) i;
734 x_map[i].z=(-0.25000f)*(MagickRealType) i;
735 y_map[i].z=0.50000f*(MagickRealType) i;
736 z_map[i].z=(-0.25000f)*(MagickRealType) i;
740 case Rec601LumaColorspace:
744 Initialize Rec601 luma tables:
746 G = 0.29900*R+0.58700*G+0.11400*B
748 #if defined(MAGICKCORE_OPENMP_SUPPORT)
749 #pragma omp parallel for schedule(dynamic,4)
751 for (i=0; i <= (ssize_t) MaxMap; i++)
753 x_map[i].x=0.29900f*(MagickRealType) i;
754 y_map[i].x=0.58700f*(MagickRealType) i;
755 z_map[i].x=0.11400f*(MagickRealType) i;
756 x_map[i].y=0.29900f*(MagickRealType) i;
757 y_map[i].y=0.58700f*(MagickRealType) i;
758 z_map[i].y=0.11400f*(MagickRealType) i;
759 x_map[i].z=0.29900f*(MagickRealType) i;
760 y_map[i].z=0.58700f*(MagickRealType) i;
761 z_map[i].z=0.11400f*(MagickRealType) i;
763 image->type=GrayscaleType;
766 case Rec601YCbCrColorspace:
767 case YCbCrColorspace:
770 Initialize YCbCr tables (ITU-R BT.601):
772 Y = 0.299000*R+0.587000*G+0.114000*B
773 Cb= -0.168736*R-0.331264*G+0.500000*B
774 Cr= 0.500000*R-0.418688*G-0.081312*B
776 Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
777 through QuantumRange.
779 primary_info.y=(double) (MaxMap+1.0)/2.0;
780 primary_info.z=(double) (MaxMap+1.0)/2.0;
781 #if defined(MAGICKCORE_OPENMP_SUPPORT)
782 #pragma omp parallel for schedule(dynamic,4)
784 for (i=0; i <= (ssize_t) MaxMap; i++)
786 x_map[i].x=0.299000f*(MagickRealType) i;
787 y_map[i].x=0.587000f*(MagickRealType) i;
788 z_map[i].x=0.114000f*(MagickRealType) i;
789 x_map[i].y=(-0.168730f)*(MagickRealType) i;
790 y_map[i].y=(-0.331264f)*(MagickRealType) i;
791 z_map[i].y=0.500000f*(MagickRealType) i;
792 x_map[i].z=0.500000f*(MagickRealType) i;
793 y_map[i].z=(-0.418688f)*(MagickRealType) i;
794 z_map[i].z=(-0.081312f)*(MagickRealType) i;
798 case Rec709LumaColorspace:
801 Initialize Rec709 luma tables:
803 G = 0.21260*R+0.71520*G+0.07220*B
805 #if defined(MAGICKCORE_OPENMP_SUPPORT)
806 #pragma omp parallel for schedule(dynamic,4)
808 for (i=0; i <= (ssize_t) MaxMap; i++)
810 x_map[i].x=0.21260f*(MagickRealType) i;
811 y_map[i].x=0.71520f*(MagickRealType) i;
812 z_map[i].x=0.07220f*(MagickRealType) i;
813 x_map[i].y=0.21260f*(MagickRealType) i;
814 y_map[i].y=0.71520f*(MagickRealType) i;
815 z_map[i].y=0.07220f*(MagickRealType) i;
816 x_map[i].z=0.21260f*(MagickRealType) i;
817 y_map[i].z=0.71520f*(MagickRealType) i;
818 z_map[i].z=0.07220f*(MagickRealType) i;
822 case Rec709YCbCrColorspace:
825 Initialize YCbCr tables (ITU-R BT.709):
827 Y = 0.212600*R+0.715200*G+0.072200*B
828 Cb= -0.114572*R-0.385428*G+0.500000*B
829 Cr= 0.500000*R-0.454153*G-0.045847*B
831 Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
832 through QuantumRange.
834 primary_info.y=(double) (MaxMap+1.0)/2.0;
835 primary_info.z=(double) (MaxMap+1.0)/2.0;
836 #if defined(MAGICKCORE_OPENMP_SUPPORT)
837 #pragma omp parallel for schedule(dynamic,4)
839 for (i=0; i <= (ssize_t) MaxMap; i++)
841 x_map[i].x=0.212600f*(MagickRealType) i;
842 y_map[i].x=0.715200f*(MagickRealType) i;
843 z_map[i].x=0.072200f*(MagickRealType) i;
844 x_map[i].y=(-0.114572f)*(MagickRealType) i;
845 y_map[i].y=(-0.385428f)*(MagickRealType) i;
846 z_map[i].y=0.500000f*(MagickRealType) i;
847 x_map[i].z=0.500000f*(MagickRealType) i;
848 y_map[i].z=(-0.454153f)*(MagickRealType) i;
849 z_map[i].z=(-0.045847f)*(MagickRealType) i;
856 Nonlinear sRGB to linear RGB (http://www.w3.org/Graphics/Color/sRGB):
858 R = 1.0*R+0.0*G+0.0*B
859 G = 0.0*R+0.1*G+0.0*B
860 B = 0.0*R+0.0*G+1.0*B
862 #if defined(MAGICKCORE_OPENMP_SUPPORT)
863 #pragma omp parallel for schedule(dynamic,4)
865 for (i=0; i <= (ssize_t) MaxMap; i++)
870 v=(MagickRealType) i/(MagickRealType) MaxMap;
871 if (((MagickRealType) i/(MagickRealType) MaxMap) <= 0.04045f)
874 v=(MagickRealType) pow((((double) i/MaxMap)+0.055)/1.055,2.4);
875 x_map[i].x=1.0f*MaxMap*v;
876 y_map[i].x=0.0f*MaxMap*v;
877 z_map[i].x=0.0f*MaxMap*v;
878 x_map[i].y=0.0f*MaxMap*v;
879 y_map[i].y=1.0f*MaxMap*v;
880 z_map[i].y=0.0f*MaxMap*v;
881 x_map[i].z=0.0f*MaxMap*v;
882 y_map[i].z=0.0f*MaxMap*v;
883 z_map[i].z=1.0f*MaxMap*v;
890 Initialize CIE XYZ tables (ITU-R 709 RGB):
892 X = 0.4124564*R+0.3575761*G+0.1804375*B
893 Y = 0.2126729*R+0.7151522*G+0.0721750*B
894 Z = 0.0193339*R+0.1191920*G+0.9503041*B
896 #if defined(MAGICKCORE_OPENMP_SUPPORT)
897 #pragma omp parallel for schedule(dynamic,4)
899 for (i=0; i <= (ssize_t) MaxMap; i++)
901 x_map[i].x=0.4124564f*(MagickRealType) i;
902 y_map[i].x=0.3575761f*(MagickRealType) i;
903 z_map[i].x=0.1804375f*(MagickRealType) i;
904 x_map[i].y=0.2126729f*(MagickRealType) i;
905 y_map[i].y=0.7151522f*(MagickRealType) i;
906 z_map[i].y=0.0721750f*(MagickRealType) i;
907 x_map[i].z=0.0193339f*(MagickRealType) i;
908 y_map[i].z=0.1191920f*(MagickRealType) i;
909 z_map[i].z=0.9503041f*(MagickRealType) i;
916 Initialize YCC tables:
918 Y = 0.29900*R+0.58700*G+0.11400*B
919 C1= -0.29900*R-0.58700*G+0.88600*B
920 C2= 0.70100*R-0.58700*G-0.11400*B
922 YCC is scaled by 1.3584. C1 zero is 156 and C2 is at 137.
924 primary_info.y=(double) ScaleQuantumToMap(ScaleCharToQuantum(156));
925 primary_info.z=(double) ScaleQuantumToMap(ScaleCharToQuantum(137));
926 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
928 x_map[i].x=0.003962014134275617f*(MagickRealType) i;
929 y_map[i].x=0.007778268551236748f*(MagickRealType) i;
930 z_map[i].x=0.001510600706713781f*(MagickRealType) i;
931 x_map[i].y=(-0.002426619775463276f)*(MagickRealType) i;
932 y_map[i].y=(-0.004763965913702149f)*(MagickRealType) i;
933 z_map[i].y=0.007190585689165425f*(MagickRealType) i;
934 x_map[i].z=0.006927257754597858f*(MagickRealType) i;
935 y_map[i].z=(-0.005800713697502058f)*(MagickRealType) i;
936 z_map[i].z=(-0.0011265440570958f)*(MagickRealType) i;
938 for ( ; i <= (ssize_t) MaxMap; i++)
940 x_map[i].x=0.2201118963486454*(1.099f*(MagickRealType) i-0.099f);
941 y_map[i].x=0.4321260306242638*(1.099f*(MagickRealType) i-0.099f);
942 z_map[i].x=0.08392226148409894*(1.099f*(MagickRealType) i-0.099f);
943 x_map[i].y=(-0.1348122097479598)*(1.099f*(MagickRealType) i-0.099f);
944 y_map[i].y=(-0.2646647729834528)*(1.099f*(MagickRealType) i-0.099f);
945 z_map[i].y=0.3994769827314126*(1.099f*(MagickRealType) i-0.099f);
946 x_map[i].z=0.3848476530332144*(1.099f*(MagickRealType) i-0.099f);
947 y_map[i].z=(-0.3222618720834477)*(1.099f*(MagickRealType) i-0.099f);
948 z_map[i].z=(-0.06258578094976668)*(1.099f*(MagickRealType) i-0.099f);
955 Initialize YIQ tables:
957 Y = 0.29900*R+0.58700*G+0.11400*B
958 I = 0.59600*R-0.27400*G-0.32200*B
959 Q = 0.21100*R-0.52300*G+0.31200*B
961 I and Q, normally -0.5 through 0.5, are normalized to the range 0
962 through QuantumRange.
964 primary_info.y=(double) (MaxMap+1.0)/2.0;
965 primary_info.z=(double) (MaxMap+1.0)/2.0;
966 #if defined(MAGICKCORE_OPENMP_SUPPORT)
967 #pragma omp parallel for schedule(dynamic,4)
969 for (i=0; i <= (ssize_t) MaxMap; i++)
971 x_map[i].x=0.29900f*(MagickRealType) i;
972 y_map[i].x=0.58700f*(MagickRealType) i;
973 z_map[i].x=0.11400f*(MagickRealType) i;
974 x_map[i].y=0.59600f*(MagickRealType) i;
975 y_map[i].y=(-0.27400f)*(MagickRealType) i;
976 z_map[i].y=(-0.32200f)*(MagickRealType) i;
977 x_map[i].z=0.21100f*(MagickRealType) i;
978 y_map[i].z=(-0.52300f)*(MagickRealType) i;
979 z_map[i].z=0.31200f*(MagickRealType) i;
983 case YPbPrColorspace:
986 Initialize YPbPr tables (ITU-R BT.601):
988 Y = 0.299000*R+0.587000*G+0.114000*B
989 Pb= -0.168736*R-0.331264*G+0.500000*B
990 Pr= 0.500000*R-0.418688*G-0.081312*B
992 Pb and Pr, normally -0.5 through 0.5, are normalized to the range 0
993 through QuantumRange.
995 primary_info.y=(double) (MaxMap+1.0)/2.0;
996 primary_info.z=(double) (MaxMap+1.0)/2.0;
997 #if defined(MAGICKCORE_OPENMP_SUPPORT)
998 #pragma omp parallel for schedule(dynamic,4)
1000 for (i=0; i <= (ssize_t) MaxMap; i++)
1002 x_map[i].x=0.299000f*(MagickRealType) i;
1003 y_map[i].x=0.587000f*(MagickRealType) i;
1004 z_map[i].x=0.114000f*(MagickRealType) i;
1005 x_map[i].y=(-0.168736f)*(MagickRealType) i;
1006 y_map[i].y=(-0.331264f)*(MagickRealType) i;
1007 z_map[i].y=0.500000f*(MagickRealType) i;
1008 x_map[i].z=0.500000f*(MagickRealType) i;
1009 y_map[i].z=(-0.418688f)*(MagickRealType) i;
1010 z_map[i].z=(-0.081312f)*(MagickRealType) i;
1018 Initialize YUV tables:
1020 Y = 0.29900*R+0.58700*G+0.11400*B
1021 U = -0.14740*R-0.28950*G+0.43690*B
1022 V = 0.61500*R-0.51500*G-0.10000*B
1024 U and V, normally -0.5 through 0.5, are normalized to the range 0
1025 through QuantumRange. Note that U = 0.493*(B-Y), V = 0.877*(R-Y).
1027 primary_info.y=(double) (MaxMap+1.0)/2.0;
1028 primary_info.z=(double) (MaxMap+1.0)/2.0;
1029 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1030 #pragma omp parallel for schedule(dynamic,4)
1032 for (i=0; i <= (ssize_t) MaxMap; i++)
1034 x_map[i].x=0.29900f*(MagickRealType) i;
1035 y_map[i].x=0.58700f*(MagickRealType) i;
1036 z_map[i].x=0.11400f*(MagickRealType) i;
1037 x_map[i].y=(-0.14740f)*(MagickRealType) i;
1038 y_map[i].y=(-0.28950f)*(MagickRealType) i;
1039 z_map[i].y=0.43690f*(MagickRealType) i;
1040 x_map[i].z=0.61500f*(MagickRealType) i;
1041 y_map[i].z=(-0.51500f)*(MagickRealType) i;
1042 z_map[i].z=(-0.10000f)*(MagickRealType) i;
1050 switch (image->storage_class)
1056 Convert DirectClass image.
1058 image_view=AcquireCacheView(image);
1059 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1060 #pragma omp parallel for schedule(dynamic,4) shared(status)
1062 for (y=0; y < (ssize_t) image->rows; y++)
1078 if (status == MagickFalse)
1080 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1082 if (q == (const Quantum *) NULL)
1087 for (x=0; x < (ssize_t) image->columns; x++)
1089 red=ScaleQuantumToMap(GetPixelRed(image,q));
1090 green=ScaleQuantumToMap(GetPixelGreen(image,q));
1091 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
1092 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1093 (MagickRealType) primary_info.x;
1094 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1095 (MagickRealType) primary_info.y;
1096 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1097 (MagickRealType) primary_info.z;
1098 SetPixelRed(image,ScaleMapToQuantum(pixel.red),q);
1099 SetPixelGreen(image,ScaleMapToQuantum(pixel.green),q);
1100 SetPixelBlue(image,ScaleMapToQuantum(pixel.blue),q);
1101 q+=GetPixelChannels(image);
1103 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1104 if (sync == MagickFalse)
1106 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1111 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1112 #pragma omp critical (MagickCore_RGBTransformImage)
1114 proceed=SetImageProgress(image,RGBTransformImageTag,progress++,
1116 if (proceed == MagickFalse)
1120 image_view=DestroyCacheView(image_view);
1131 Convert PseudoClass image.
1133 image_view=AcquireCacheView(image);
1134 for (i=0; i < (ssize_t) image->colors; i++)
1139 red=ScaleQuantumToMap(image->colormap[i].red);
1140 green=ScaleQuantumToMap(image->colormap[i].green);
1141 blue=ScaleQuantumToMap(image->colormap[i].blue);
1142 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1143 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1144 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1145 image->colormap[i].red=ScaleMapToQuantum(pixel.red);
1146 image->colormap[i].green=ScaleMapToQuantum(pixel.green);
1147 image->colormap[i].blue=ScaleMapToQuantum(pixel.blue);
1149 image_view=DestroyCacheView(image_view);
1150 (void) SyncImage(image);
1155 Relinquish resources.
1157 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1158 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1159 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1160 if (SetImageColorspace(image,colorspace) == MagickFalse)
1161 return(MagickFalse);
1166 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1170 % S e t I m a g e C o l o r s p a c e %
1174 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1176 % SetImageColorspace() sets the colorspace member of the Image structure.
1178 % The format of the SetImageColorspace method is:
1180 % MagickBooleanType SetImageColorspace(Image *image,
1181 % const ColorspaceType colorspace)
1183 % A description of each parameter follows:
1185 % o image: the image.
1187 % o colorspace: the colorspace.
1190 MagickExport MagickBooleanType SetImageColorspace(Image *image,
1191 const ColorspaceType colorspace)
1193 image->colorspace=colorspace;
1198 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1202 % T r a n s f o r m I m a g e C o l o r s p a c e %
1206 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1208 % TransformImageColorspace() transforms an image colorspace.
1210 % The format of the TransformImageColorspace method is:
1212 % MagickBooleanType TransformImageColorspace(Image *image,
1213 % const ColorspaceType colorspace)
1215 % A description of each parameter follows:
1217 % o image: the image.
1219 % o colorspace: the colorspace.
1222 MagickExport MagickBooleanType TransformImageColorspace(Image *image,
1223 const ColorspaceType colorspace)
1228 assert(image != (Image *) NULL);
1229 assert(image->signature == MagickSignature);
1230 if (image->debug != MagickFalse)
1231 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1232 if (colorspace == UndefinedColorspace)
1233 return(SetImageColorspace(image,colorspace));
1234 if (image->colorspace == colorspace)
1236 if ((colorspace == RGBColorspace) ||
1237 (colorspace == sRGBColorspace) ||
1238 (colorspace == TransparentColorspace))
1239 return(TransformRGBImage(image,image->colorspace));
1241 if (IsRGBColorspace(image->colorspace) == MagickFalse)
1242 status=TransformRGBImage(image,image->colorspace);
1243 if (RGBTransformImage(image,colorspace) == MagickFalse)
1249 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1253 + T r a n s f o r m R G B I m a g e %
1257 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1259 % TransformRGBImage() converts the reference image from an alternate
1260 % colorspace to RGB. The transformation matrices are not the standard ones:
1261 % the weights are rescaled to normalize the range of the transformed values to
1262 % be [0..QuantumRange].
1264 % The format of the TransformRGBImage method is:
1266 % MagickBooleanType TransformRGBImage(Image *image,
1267 % const ColorspaceType colorspace)
1269 % A description of each parameter follows:
1271 % o image: the image.
1273 % o colorspace: the colorspace to transform the image to.
1277 static double LabF2(double alpha)
1282 if (alpha > (24.0/116.0))
1283 return(alpha*alpha*alpha);
1284 beta=(108.0/841.0)*(alpha-(16.0/116.0));
1290 static inline void ConvertLabToXYZ(const double L,const double a,const double b,
1291 double *X,double *Y,double *Z)
1299 assert(X != (double *) NULL);
1300 assert(Y != (double *) NULL);
1301 assert(Z != (double *) NULL);
1307 y=(100.0*L+16.0)/116.0;
1308 x=y+255.0*0.002*(a > 0.5 ? a-1.0 : a);
1309 z=y-255.0*0.005*(b > 0.5 ? b-1.0 : b);
1315 static inline ssize_t RoundToYCC(const MagickRealType value)
1319 if (value >= 1388.0)
1321 return((ssize_t) (value+0.5));
1324 static inline void ConvertXYZToRGB(const double x,const double y,const double z,
1325 Quantum *red,Quantum *green,Quantum *blue)
1333 Convert XYZ to RGB colorspace.
1335 assert(red != (Quantum *) NULL);
1336 assert(green != (Quantum *) NULL);
1337 assert(blue != (Quantum *) NULL);
1338 r=3.2404542*x-1.5371385*y-0.4985314*z;
1339 g=(-0.9692660*x+1.8760108*y+0.0415560*z);
1340 b=0.0556434*x-0.2040259*y+1.0572252*z;
1342 r=1.055*pow(r,1.0/2.4)-0.055;
1346 g=1.055*pow(g,1.0/2.4)-0.055;
1350 b=1.055*pow(b,1.0/2.4)-0.055;
1353 *red=RoundToQuantum((MagickRealType) QuantumRange*r);
1354 *green=RoundToQuantum((MagickRealType) QuantumRange*g);
1355 *blue=RoundToQuantum((MagickRealType) QuantumRange*b);
1358 static inline void ConvertCMYKToRGB(PixelInfo *pixel)
1360 pixel->red=(MagickRealType) QuantumRange-(QuantumScale*pixel->red*
1361 (QuantumRange-pixel->black)+pixel->black);
1362 pixel->green=(MagickRealType) QuantumRange-(QuantumScale*pixel->green*
1363 (QuantumRange-pixel->black)+pixel->black);
1364 pixel->blue=(MagickRealType) QuantumRange-(QuantumScale*pixel->blue*
1365 (QuantumRange-pixel->black)+pixel->black);
1368 MagickExport MagickBooleanType TransformRGBImage(Image *image,
1369 const ColorspaceType colorspace)
1371 #define D50X (0.9642)
1373 #define D50Z (0.8249)
1374 #define TransformRGBImageTag "Transform/Image"
1376 #if !defined(MAGICKCORE_HDRI_SUPPORT)
1380 0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1381 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1382 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1383 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1384 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1385 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1386 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1387 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1388 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1389 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1390 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1391 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1392 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1393 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1394 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1395 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1396 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1397 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1398 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1399 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1400 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1401 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1402 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1403 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1404 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1405 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1406 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1407 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1408 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1409 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1410 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1411 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1412 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1413 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1414 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1415 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1416 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1417 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1418 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1419 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1420 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1421 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1422 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1423 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1424 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1425 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1426 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1427 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1428 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1429 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1430 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1431 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1432 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1433 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1434 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1435 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1436 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1437 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1438 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1439 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1440 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1441 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1442 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1443 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1444 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1445 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1446 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1447 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1448 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1449 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1450 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1451 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1452 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1453 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1454 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1455 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1456 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1457 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1458 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1459 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1460 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1461 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1462 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1463 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1464 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1465 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1466 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1467 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1468 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1469 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1470 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1471 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1472 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1473 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1474 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1475 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1476 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1477 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1478 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1479 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1480 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1481 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1482 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1483 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1484 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1485 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1486 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1487 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1488 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1489 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1490 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1491 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1492 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1493 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1494 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1495 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1496 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1497 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1498 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1499 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1500 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1501 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1502 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1503 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1504 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1505 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1506 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1507 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1508 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1509 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1510 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1511 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1512 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1513 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1514 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1515 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1516 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1517 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1518 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1519 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1520 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1521 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1522 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1523 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1524 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1525 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1526 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1527 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1528 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1529 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1530 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1531 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1532 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1533 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1534 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1535 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1536 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1537 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1538 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1539 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1540 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1541 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1542 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1543 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
1544 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
1545 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
1546 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
1547 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
1548 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
1549 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
1550 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
1551 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
1552 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
1553 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
1554 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
1555 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
1556 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
1557 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
1558 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
1559 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
1560 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
1561 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
1562 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
1563 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
1564 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
1565 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
1566 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
1567 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
1568 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
1569 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
1570 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
1571 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
1572 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
1573 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
1574 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
1575 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
1576 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
1577 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
1578 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
1579 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
1580 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
1581 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
1582 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
1583 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
1584 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
1585 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
1586 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
1587 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
1588 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
1589 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
1590 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
1591 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
1592 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
1593 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
1594 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
1595 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
1596 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
1597 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
1598 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
1599 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
1600 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
1601 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
1602 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
1603 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
1604 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
1605 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
1606 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
1607 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
1608 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
1609 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
1610 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
1611 0.998559f, 0.999280f, 1.000000f
1638 assert(image != (Image *) NULL);
1639 assert(image->signature == MagickSignature);
1640 if (image->debug != MagickFalse)
1641 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1644 case GRAYColorspace:
1645 case Rec601LumaColorspace:
1646 case Rec709LumaColorspace:
1648 case TransparentColorspace:
1649 case UndefinedColorspace:
1656 exception=(&image->exception);
1662 Transform image from CMY to RGB.
1664 if (image->storage_class == PseudoClass)
1666 if (SyncImage(image) == MagickFalse)
1667 return(MagickFalse);
1668 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1669 return(MagickFalse);
1671 image_view=AcquireCacheView(image);
1672 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1673 #pragma omp parallel for schedule(dynamic,4) shared(status)
1675 for (y=0; y < (ssize_t) image->rows; y++)
1686 if (status == MagickFalse)
1688 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1690 if (q == (const Quantum *) NULL)
1695 for (x=0; x < (ssize_t) image->columns; x++)
1697 SetPixelRed(image,ClampToQuantum((MagickRealType) (QuantumRange-
1698 GetPixelRed(image,q))),q);
1699 SetPixelGreen(image,ClampToQuantum((MagickRealType) (QuantumRange-
1700 GetPixelGreen(image,q))),q);
1701 SetPixelBlue(image,ClampToQuantum((MagickRealType) (QuantumRange-
1702 GetPixelBlue(image,q))),q);
1703 q+=GetPixelChannels(image);
1705 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1706 if (sync == MagickFalse)
1709 image_view=DestroyCacheView(image_view);
1710 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
1711 return(MagickFalse);
1714 case CMYKColorspace:
1720 Transform image from CMYK to RGB.
1722 if (image->storage_class == PseudoClass)
1724 if (SyncImage(image) == MagickFalse)
1725 return(MagickFalse);
1726 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1727 return(MagickFalse);
1729 GetPixelInfo(image,&zero);
1730 image_view=AcquireCacheView(image);
1731 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1732 #pragma omp parallel for schedule(dynamic,4) shared(status)
1734 for (y=0; y < (ssize_t) image->rows; y++)
1748 if (status == MagickFalse)
1750 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1752 if (q == (const Quantum *) NULL)
1758 for (x=0; x < (ssize_t) image->columns; x++)
1760 SetPixelInfo(image,q,&pixel);
1761 ConvertCMYKToRGB(&pixel);
1762 SetPixelPixelInfo(image,&pixel,q);
1763 q+=GetPixelChannels(image);
1765 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1766 if (sync == MagickFalse)
1769 image_view=DestroyCacheView(image_view);
1770 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
1771 return(MagickFalse);
1777 Transform image from HSB to RGB.
1779 if (image->storage_class == PseudoClass)
1781 if (SyncImage(image) == MagickFalse)
1782 return(MagickFalse);
1783 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1784 return(MagickFalse);
1786 image_view=AcquireCacheView(image);
1787 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1788 #pragma omp parallel for schedule(dynamic,4) shared(status)
1790 for (y=0; y < (ssize_t) image->rows; y++)
1806 if (status == MagickFalse)
1808 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1810 if (q == (const Quantum *) NULL)
1815 for (x=0; x < (ssize_t) image->columns; x++)
1822 hue=(double) (QuantumScale*GetPixelRed(image,q));
1823 saturation=(double) (QuantumScale*GetPixelGreen(image,q));
1824 brightness=(double) (QuantumScale*GetPixelBlue(image,q));
1825 ConvertHSBToRGB(hue,saturation,brightness,&red,&green,&blue);
1826 SetPixelRed(image,red,q);
1827 SetPixelGreen(image,green,q);
1828 SetPixelBlue(image,blue,q);
1829 q+=GetPixelChannels(image);
1831 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1832 if (sync == MagickFalse)
1835 image_view=DestroyCacheView(image_view);
1836 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
1837 return(MagickFalse);
1843 Transform image from HSL to RGB.
1845 if (image->storage_class == PseudoClass)
1847 if (SyncImage(image) == MagickFalse)
1848 return(MagickFalse);
1849 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1850 return(MagickFalse);
1852 image_view=AcquireCacheView(image);
1853 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1854 #pragma omp parallel for schedule(dynamic,4) shared(status)
1856 for (y=0; y < (ssize_t) image->rows; y++)
1872 if (status == MagickFalse)
1874 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1876 if (q == (const Quantum *) NULL)
1881 for (x=0; x < (ssize_t) image->columns; x++)
1888 hue=(double) (QuantumScale*GetPixelRed(image,q));
1889 saturation=(double) (QuantumScale*GetPixelGreen(image,q));
1890 lightness=(double) (QuantumScale*GetPixelBlue(image,q));
1891 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
1892 SetPixelRed(image,red,q);
1893 SetPixelGreen(image,green,q);
1894 SetPixelBlue(image,blue,q);
1895 q+=GetPixelChannels(image);
1897 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1898 if (sync == MagickFalse)
1901 image_view=DestroyCacheView(image_view);
1902 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
1903 return(MagickFalse);
1909 Transform image from HWB to RGB.
1911 if (image->storage_class == PseudoClass)
1913 if (SyncImage(image) == MagickFalse)
1914 return(MagickFalse);
1915 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1916 return(MagickFalse);
1918 image_view=AcquireCacheView(image);
1919 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1920 #pragma omp parallel for schedule(dynamic,4) shared(status)
1922 for (y=0; y < (ssize_t) image->rows; y++)
1938 if (status == MagickFalse)
1940 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1942 if (q == (const Quantum *) NULL)
1947 for (x=0; x < (ssize_t) image->columns; x++)
1954 hue=(double) (QuantumScale*GetPixelRed(image,q));
1955 whiteness=(double) (QuantumScale*GetPixelGreen(image,q));
1956 blackness=(double) (QuantumScale*GetPixelBlue(image,q));
1957 ConvertHWBToRGB(hue,whiteness,blackness,&red,&green,&blue);
1958 SetPixelRed(image,red,q);
1959 SetPixelGreen(image,green,q);
1960 SetPixelBlue(image,blue,q);
1961 q+=GetPixelChannels(image);
1963 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1964 if (sync == MagickFalse)
1967 image_view=DestroyCacheView(image_view);
1968 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
1969 return(MagickFalse);
1975 Transform image from Lab to RGB.
1977 if (image->storage_class == PseudoClass)
1979 if (SyncImage(image) == MagickFalse)
1980 return(MagickFalse);
1981 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1982 return(MagickFalse);
1984 image_view=AcquireCacheView(image);
1985 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1986 #pragma omp parallel for schedule(dynamic,4) shared(status)
1988 for (y=0; y < (ssize_t) image->rows; y++)
2007 if (status == MagickFalse)
2009 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2011 if (q == (const Quantum *) NULL)
2019 for (x=0; x < (ssize_t) image->columns; x++)
2026 L=QuantumScale*GetPixelRed(image,q);
2027 a=QuantumScale*GetPixelGreen(image,q);
2028 b=QuantumScale*GetPixelBlue(image,q);
2029 ConvertLabToXYZ(L,a,b,&X,&Y,&Z);
2030 ConvertXYZToRGB(X,Y,Z,&red,&green,&blue);
2031 SetPixelRed(image,red,q);
2032 SetPixelGreen(image,green,q);
2033 SetPixelBlue(image,blue,q);
2034 q+=GetPixelChannels(image);
2036 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2037 if (sync == MagickFalse)
2040 image_view=DestroyCacheView(image_view);
2041 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
2042 return(MagickFalse);
2062 Transform Log to RGB colorspace.
2064 density=DisplayGamma;
2066 value=GetImageProperty(image,"gamma");
2067 if (value != (const char *) NULL)
2068 gamma=1.0/InterpretLocaleValue(value,(char **) NULL) != 0.0 ?
2069 InterpretLocaleValue(value,(char **) NULL) : 1.0;
2070 film_gamma=FilmGamma;
2071 value=GetImageProperty(image,"film-gamma");
2072 if (value != (const char *) NULL)
2073 film_gamma=InterpretLocaleValue(value,(char **) NULL);
2074 reference_black=ReferenceBlack;
2075 value=GetImageProperty(image,"reference-black");
2076 if (value != (const char *) NULL)
2077 reference_black=InterpretLocaleValue(value,(char **) NULL);
2078 reference_white=ReferenceWhite;
2079 value=GetImageProperty(image,"reference-white");
2080 if (value != (const char *) NULL)
2081 reference_white=InterpretLocaleValue(value,(char **) NULL);
2082 logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2084 if (logmap == (Quantum *) NULL)
2085 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
2087 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*
2089 for (i=0; i <= (ssize_t) (reference_black*MaxMap/1024.0); i++)
2090 logmap[i]=(Quantum) 0;
2091 for ( ; i < (ssize_t) (reference_white*MaxMap/1024.0); i++)
2092 logmap[i]=ClampToQuantum((MagickRealType) QuantumRange/(1.0-black)*
2093 (pow(10.0,(1024.0*i/MaxMap-reference_white)*
2094 (gamma/density)*0.002/film_gamma)-black));
2095 for ( ; i <= (ssize_t) MaxMap; i++)
2096 logmap[i]=(Quantum) QuantumRange;
2097 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2098 return(MagickFalse);
2099 image_view=AcquireCacheView(image);
2100 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2101 #pragma omp parallel for schedule(dynamic,4) shared(status)
2103 for (y=0; y < (ssize_t) image->rows; y++)
2114 if (status == MagickFalse)
2116 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2118 if (q == (const Quantum *) NULL)
2123 for (x=(ssize_t) image->columns; x != 0; x--)
2125 SetPixelRed(image,logmap[ScaleQuantumToMap(
2126 GetPixelRed(image,q))],q);
2127 SetPixelGreen(image,logmap[ScaleQuantumToMap(
2128 GetPixelGreen(image,q))],q);
2129 SetPixelBlue(image,logmap[ScaleQuantumToMap(
2130 GetPixelBlue(image,q))],q);
2131 q+=GetPixelChannels(image);
2133 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2134 if (sync == MagickFalse)
2137 image_view=DestroyCacheView(image_view);
2138 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2139 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
2140 return(MagickFalse);
2147 Allocate the tables.
2149 x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2151 y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2153 z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2155 if ((x_map == (TransformPacket *) NULL) ||
2156 (y_map == (TransformPacket *) NULL) ||
2157 (z_map == (TransformPacket *) NULL))
2159 if (z_map != (TransformPacket *) NULL)
2160 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2161 if (y_map != (TransformPacket *) NULL)
2162 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2163 if (x_map != (TransformPacket *) NULL)
2164 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2165 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
2170 case OHTAColorspace:
2173 Initialize OHTA tables:
2175 R = I1+1.00000*I2-0.66668*I3
2176 G = I1+0.00000*I2+1.33333*I3
2177 B = I1-1.00000*I2-0.66668*I3
2179 I and Q, normally -0.5 through 0.5, must be normalized to the range 0
2180 through QuantumRange.
2182 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2183 #pragma omp parallel for schedule(dynamic,4)
2185 for (i=0; i <= (ssize_t) MaxMap; i++)
2187 x_map[i].x=(MagickRealType) i;
2188 y_map[i].x=0.500000f*(2.000000*(MagickRealType) i-(MagickRealType)
2190 z_map[i].x=(-0.333340f)*(2.000000f*(MagickRealType) i-(MagickRealType)
2192 x_map[i].y=(MagickRealType) i;
2193 y_map[i].y=0.000000f;
2194 z_map[i].y=0.666665f*(2.000000f*(MagickRealType) i-(MagickRealType)
2196 x_map[i].z=(MagickRealType) i;
2197 y_map[i].z=(-0.500000f)*(2.000000f*(MagickRealType) i-(MagickRealType)
2199 z_map[i].z=(-0.333340f)*(2.000000f*(MagickRealType) i-(MagickRealType)
2204 case Rec601YCbCrColorspace:
2205 case YCbCrColorspace:
2208 Initialize YCbCr tables:
2211 G = Y-0.344136*Cb-0.714136*Cr
2214 Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
2215 through QuantumRange.
2217 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2218 #pragma omp parallel for schedule(dynamic,4)
2220 for (i=0; i <= (ssize_t) MaxMap; i++)
2222 x_map[i].x=(MagickRealType) i;
2223 y_map[i].x=0.000000f;
2224 z_map[i].x=(1.402000f*0.500000f)*(2.000000f*(MagickRealType) i-
2225 (MagickRealType) MaxMap);
2226 x_map[i].y=(MagickRealType) i;
2227 y_map[i].y=(-0.344136f*0.500000f)*(2.000000f*(MagickRealType) i-
2228 (MagickRealType) MaxMap);
2229 z_map[i].y=(-0.714136f*0.500000f)*(2.000000f*(MagickRealType) i-
2230 (MagickRealType) MaxMap);
2231 x_map[i].z=(MagickRealType) i;
2232 y_map[i].z=(1.772000f*0.500000f)*(2.000000f*(MagickRealType) i-
2233 (MagickRealType) MaxMap);
2234 z_map[i].z=0.000000f;
2238 case Rec709YCbCrColorspace:
2241 Initialize YCbCr tables:
2244 G = Y-0.187324*Cb-0.468124*Cr
2247 Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
2248 through QuantumRange.
2250 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2251 #pragma omp parallel for schedule(dynamic,4)
2253 for (i=0; i <= (ssize_t) MaxMap; i++)
2255 x_map[i].x=(MagickRealType) i;
2256 y_map[i].x=0.000000f;
2257 z_map[i].x=(1.574800f*0.50000f)*(2.00000f*(MagickRealType) i-
2258 (MagickRealType) MaxMap);
2259 x_map[i].y=(MagickRealType) i;
2260 y_map[i].y=(-0.187324f*0.50000f)*(2.00000f*(MagickRealType) i-
2261 (MagickRealType) MaxMap);
2262 z_map[i].y=(-0.468124f*0.50000f)*(2.00000f*(MagickRealType) i-
2263 (MagickRealType) MaxMap);
2264 x_map[i].z=(MagickRealType) i;
2265 y_map[i].z=(1.855600f*0.50000f)*(2.00000f*(MagickRealType) i-
2266 (MagickRealType) MaxMap);
2267 z_map[i].z=0.00000f;
2271 case sRGBColorspace:
2274 Nonlinear sRGB to linear RGB.
2276 R = 1.0*R+0.0*G+0.0*B
2277 G = 0.0*R+1.0*G+0.0*B
2278 B = 0.0*R+0.0*G+1.0*B
2280 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2281 #pragma omp parallel for schedule(dynamic,4)
2283 for (i=0; i <= (ssize_t) MaxMap; i++)
2285 x_map[i].x=1.0f*(MagickRealType) i;
2286 y_map[i].x=0.0f*(MagickRealType) i;
2287 z_map[i].x=0.0f*(MagickRealType) i;
2288 x_map[i].y=0.0f*(MagickRealType) i;
2289 y_map[i].y=1.0f*(MagickRealType) i;
2290 z_map[i].y=0.0f*(MagickRealType) i;
2291 x_map[i].z=0.0f*(MagickRealType) i;
2292 y_map[i].z=0.0f*(MagickRealType) i;
2293 z_map[i].z=1.0f*(MagickRealType) i;
2300 Initialize CIE XYZ tables (ITU R-709 RGB):
2302 R = 3.2404542*X-1.5371385*Y-0.4985314*Z
2303 G = -0.9692660*X+1.8760108*Y+0.0415560*Z
2304 B = 0.0556434*X-0.2040259*Y+1.057225*Z
2306 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2307 #pragma omp parallel for schedule(dynamic,4)
2309 for (i=0; i <= (ssize_t) MaxMap; i++)
2311 x_map[i].x=3.2404542f*(MagickRealType) i;
2312 x_map[i].y=(-0.9692660f)*(MagickRealType) i;
2313 x_map[i].z=0.0556434f*(MagickRealType) i;
2314 y_map[i].x=(-1.5371385f)*(MagickRealType) i;
2315 y_map[i].y=1.8760108f*(MagickRealType) i;
2316 y_map[i].z=(-0.2040259f)*(MagickRealType) i;
2317 z_map[i].x=(-0.4985314f)*(MagickRealType) i;
2318 z_map[i].y=0.0415560f*(MagickRealType) i;
2319 z_map[i].z=1.0572252f*(MagickRealType) i;
2326 Initialize YCC tables:
2329 G = Y-0.317038*C1-0.682243*C2
2332 YCC is scaled by 1.3584. C1 zero is 156 and C2 is at 137.
2334 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2335 #pragma omp parallel for schedule(dynamic,4)
2337 for (i=0; i <= (ssize_t) MaxMap; i++)
2339 x_map[i].x=1.3584000f*(MagickRealType) i;
2340 y_map[i].x=0.0000000f;
2341 z_map[i].x=1.8215000f*((MagickRealType) i-(MagickRealType)
2342 ScaleQuantumToMap(ScaleCharToQuantum(137)));
2343 x_map[i].y=1.3584000f*(MagickRealType) i;
2344 y_map[i].y=(-0.4302726f)*((MagickRealType) i-(MagickRealType)
2345 ScaleQuantumToMap(ScaleCharToQuantum(156)));
2346 z_map[i].y=(-0.9271435f)*((MagickRealType) i-(MagickRealType)
2347 ScaleQuantumToMap(ScaleCharToQuantum(137)));
2348 x_map[i].z=1.3584000f*(MagickRealType) i;
2349 y_map[i].z=2.2179000f*((MagickRealType) i-(MagickRealType)
2350 ScaleQuantumToMap(ScaleCharToQuantum(156)));
2351 z_map[i].z=0.0000000f;
2358 Initialize YIQ tables:
2360 R = Y+0.95620*I+0.62140*Q
2361 G = Y-0.27270*I-0.64680*Q
2362 B = Y-1.10370*I+1.70060*Q
2364 I and Q, normally -0.5 through 0.5, must be normalized to the range 0
2365 through QuantumRange.
2367 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2368 #pragma omp parallel for schedule(dynamic,4)
2370 for (i=0; i <= (ssize_t) MaxMap; i++)
2372 x_map[i].x=(MagickRealType) i;
2373 y_map[i].x=0.47810f*(2.00000f*(MagickRealType) i-(MagickRealType)
2375 z_map[i].x=0.31070f*(2.00000f*(MagickRealType) i-(MagickRealType)
2377 x_map[i].y=(MagickRealType) i;
2378 y_map[i].y=(-0.13635f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2380 z_map[i].y=(-0.32340f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2382 x_map[i].z=(MagickRealType) i;
2383 y_map[i].z=(-0.55185f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2385 z_map[i].z=0.85030f*(2.00000f*(MagickRealType) i-(MagickRealType)
2390 case YPbPrColorspace:
2393 Initialize YPbPr tables:
2396 G = Y-0.344136*C1+0.714136*C2
2399 Pb and Pr, normally -0.5 through 0.5, must be normalized to the range 0
2400 through QuantumRange.
2402 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2403 #pragma omp parallel for schedule(dynamic,4)
2405 for (i=0; i <= (ssize_t) MaxMap; i++)
2407 x_map[i].x=(MagickRealType) i;
2408 y_map[i].x=0.000000f;
2409 z_map[i].x=0.701000f*(2.00000f*(MagickRealType) i-(MagickRealType)
2411 x_map[i].y=(MagickRealType) i;
2412 y_map[i].y=(-0.172068f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2414 z_map[i].y=0.357068f*(2.00000f*(MagickRealType) i-(MagickRealType)
2416 x_map[i].z=(MagickRealType) i;
2417 y_map[i].z=0.88600f*(2.00000f*(MagickRealType) i-(MagickRealType)
2419 z_map[i].z=0.00000f;
2427 Initialize YUV tables:
2430 G = Y-0.39380*U-0.58050*V
2433 U and V, normally -0.5 through 0.5, must be normalized to the range 0
2434 through QuantumRange.
2436 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2437 #pragma omp parallel for schedule(dynamic,4)
2439 for (i=0; i <= (ssize_t) MaxMap; i++)
2441 x_map[i].x=(MagickRealType) i;
2442 y_map[i].x=0.00000f;
2443 z_map[i].x=0.56990f*(2.0000f*(MagickRealType) i-(MagickRealType)
2445 x_map[i].y=(MagickRealType) i;
2446 y_map[i].y=(-0.19690f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2448 z_map[i].y=(-0.29025f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2450 x_map[i].z=(MagickRealType) i;
2451 y_map[i].z=1.01395f*(2.00000f*(MagickRealType) i-(MagickRealType)
2453 z_map[i].z=0.00000f;
2461 switch (image->storage_class)
2467 Convert DirectClass image.
2469 image_view=AcquireCacheView(image);
2470 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2471 #pragma omp parallel for schedule(dynamic,4) shared(status)
2473 for (y=0; y < (ssize_t) image->rows; y++)
2487 if (status == MagickFalse)
2489 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2491 if (q == (const Quantum *) NULL)
2496 for (x=0; x < (ssize_t) image->columns; x++)
2503 red=ScaleQuantumToMap(GetPixelRed(image,q));
2504 green=ScaleQuantumToMap(GetPixelGreen(image,q));
2505 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
2506 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2507 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2508 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2513 #if !defined(MAGICKCORE_HDRI_SUPPORT)
2514 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2516 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2518 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2523 case sRGBColorspace:
2525 if ((QuantumScale*pixel.red) <= 0.0031308)
2528 pixel.red=(MagickRealType) QuantumRange*(1.055*
2529 pow(QuantumScale*pixel.red,(1.0/2.4))-0.055);
2530 if ((QuantumScale*pixel.green) <= 0.0031308)
2531 pixel.green*=12.92f;
2533 pixel.green=(MagickRealType) QuantumRange*(1.055*
2534 pow(QuantumScale*pixel.green,(1.0/2.4))-0.055);
2535 if ((QuantumScale*pixel.blue) <= 0.0031308)
2538 pixel.blue=(MagickRealType) QuantumRange*(1.055*
2539 pow(QuantumScale*pixel.blue,(1.0/2.4))-0.055);
2545 SetPixelRed(image,ScaleMapToQuantum((MagickRealType) MaxMap*
2546 QuantumScale*pixel.red),q);
2547 SetPixelGreen(image,ScaleMapToQuantum((MagickRealType) MaxMap*
2548 QuantumScale*pixel.green),q);
2549 SetPixelBlue(image,ScaleMapToQuantum((MagickRealType) MaxMap*
2550 QuantumScale*pixel.blue),q);
2551 q+=GetPixelChannels(image);
2553 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2554 if (sync == MagickFalse)
2556 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2561 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2562 #pragma omp critical (MagickCore_TransformRGBImage)
2564 proceed=SetImageProgress(image,TransformRGBImageTag,progress++,
2566 if (proceed == MagickFalse)
2570 image_view=DestroyCacheView(image_view);
2576 Convert PseudoClass image.
2578 image_view=AcquireCacheView(image);
2579 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2580 #pragma omp parallel for schedule(dynamic,4) shared(status)
2582 for (i=0; i < (ssize_t) image->colors; i++)
2592 red=ScaleQuantumToMap(image->colormap[i].red);
2593 green=ScaleQuantumToMap(image->colormap[i].green);
2594 blue=ScaleQuantumToMap(image->colormap[i].blue);
2595 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2596 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2597 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2602 #if !defined(MAGICKCORE_HDRI_SUPPORT)
2603 image->colormap[i].red=(Quantum) (QuantumRange*YCCMap[
2604 RoundToYCC(1024.0*QuantumScale*pixel.red)]);
2605 image->colormap[i].green=(Quantum) (QuantumRange*YCCMap[
2606 RoundToYCC(1024.0*QuantumScale*pixel.green)]);
2607 image->colormap[i].blue=(Quantum) (QuantumRange*YCCMap[
2608 RoundToYCC(1024.0*QuantumScale*pixel.blue)]);
2612 case sRGBColorspace:
2614 if ((QuantumScale*pixel.red) <= 0.0031308)
2617 pixel.red=(MagickRealType) QuantumRange*(1.055*pow(QuantumScale*
2618 pixel.red,(1.0/2.4))-0.055);
2619 if ((QuantumScale*pixel.green) <= 0.0031308)
2620 pixel.green*=12.92f;
2622 pixel.green=(MagickRealType) QuantumRange*(1.055*pow(QuantumScale*
2623 pixel.green,(1.0/2.4))-0.055);
2624 if ((QuantumScale*pixel.blue) <= 0.0031308)
2627 pixel.blue=(MagickRealType) QuantumRange*(1.055*pow(QuantumScale*
2628 pixel.blue,(1.0/2.4))-0.055);
2632 image->colormap[i].red=ScaleMapToQuantum((MagickRealType) MaxMap*
2633 QuantumScale*pixel.red);
2634 image->colormap[i].green=ScaleMapToQuantum((MagickRealType) MaxMap*
2635 QuantumScale*pixel.green);
2636 image->colormap[i].blue=ScaleMapToQuantum((MagickRealType) MaxMap*
2637 QuantumScale*pixel.blue);
2642 image_view=DestroyCacheView(image_view);
2643 (void) SyncImage(image);
2648 Relinquish resources.
2650 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2651 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2652 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2653 if (SetImageColorspace(image,RGBColorspace) == MagickFalse)
2654 return(MagickFalse);