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-2012 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/gem-private.h"
57 #include "MagickCore/memory_.h"
58 #include "MagickCore/monitor.h"
59 #include "MagickCore/monitor-private.h"
60 #include "MagickCore/pixel-accessor.h"
61 #include "MagickCore/quantize.h"
62 #include "MagickCore/quantum.h"
63 #include "MagickCore/quantum-private.h"
64 #include "MagickCore/string_.h"
65 #include "MagickCore/string-private.h"
66 #include "MagickCore/utility.h"
71 typedef struct _TransformPacket
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
84 + R G B T r a n s f o r m I m a g e %
88 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
90 % RGBTransformImage() converts the reference image from RGB to an alternate
91 % colorspace. The transformation matrices are not the standard ones: the
92 % weights are rescaled to normalized the range of the transformed values to
93 % be [0..QuantumRange].
95 % The format of the RGBTransformImage method is:
97 % MagickBooleanType RGBTransformImage(Image *image,
98 % const ColorspaceType colorspace,EsceptionInfo *exception)
100 % A description of each parameter follows:
102 % o image: the image.
104 % o colorspace: the colorspace to transform the image to.
106 % o exception: return any errors or warnings in this structure.
110 static inline void ConvertRGBToXYZ(const Quantum red,const Quantum green,
111 const Quantum blue,double *X,double *Y,double *Z)
118 assert(X != (double *) NULL);
119 assert(Y != (double *) NULL);
120 assert(Z != (double *) NULL);
123 r=pow((r+0.055)/1.055,2.4);
126 g=QuantumScale*green;
128 g=pow((g+0.055)/1.055,2.4);
133 b=pow((b+0.055)/1.055,2.4);
136 *X=0.4124240*r+0.3575790*g+0.1804640*b;
137 *Y=0.2126560*r+0.7151580*g+0.0721856*b;
138 *Z=0.0193324*r+0.1191930*g+0.9504440*b;
141 static double LabF1(double alpha)
144 if (alpha <= ((24.0/116.0)*(24.0/116.0)*(24.0/116.0)))
145 return((841.0/108.0)*alpha+(16.0/116.0));
146 return(pow(alpha,1.0/3.0));
149 static inline void ConvertXYZToLab(const double X,const double Y,const double Z,
150 double *L,double *a,double *b)
152 #define D50X (0.9642)
154 #define D50Z (0.8249)
161 assert(L != (double *) NULL);
162 assert(a != (double *) NULL);
163 assert(b != (double *) NULL);
167 if ((fabs(X) < MagickEpsilon) && (fabs(Y) < MagickEpsilon) &&
168 (fabs(Z) < MagickEpsilon))
173 *L=(116.0*fy-16.0)/100.0;
174 *a=(500.0*(fx-fy))/255.0;
177 *b=(200.0*(fy-fz))/255.0;
182 MagickExport MagickBooleanType RGBTransformImage(Image *image,
183 const ColorspaceType colorspace,ExceptionInfo *exception)
185 #define RGBTransformImageTag "RGBTransform/Image"
211 assert(image != (Image *) NULL);
212 assert(image->signature == MagickSignature);
213 if (image->debug != MagickFalse)
214 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
215 assert(colorspace != RGBColorspace);
216 assert(colorspace != TransparentColorspace);
217 assert(colorspace != UndefinedColorspace);
218 switch (image->colorspace)
221 case Rec601LumaColorspace:
222 case Rec709LumaColorspace:
224 case TransparentColorspace:
228 (void) TransformImageColorspace(image,image->colorspace,exception);
232 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
241 Convert RGB to CMY colorspace.
243 if (image->storage_class == PseudoClass)
245 if (SyncImage(image,exception) == 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(static,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 == (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,exception) == 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(static,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 == (Quantum *) NULL)
331 for (x=0; x < (ssize_t) image->columns; x++)
333 GetPixelInfoPixel(image,q,&pixel);
334 ConvertRGBToCMYK(&pixel);
335 SetPixelInfoPixel(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,exception) == 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(static,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 == (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,exception) == 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(static,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 == (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,exception) == 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(static,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 == (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,exception) == 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(static,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 == (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",exception);
621 if (value != (const char *) NULL)
622 gamma=1.0/fabs(StringToDouble(value,(char **) NULL)) >= MagickEpsilon ?
623 StringToDouble(value,(char **) NULL) : 1.0;
624 film_gamma=FilmGamma;
625 value=GetImageProperty(image,"film-gamma",exception);
626 if (value != (const char *) NULL)
627 film_gamma=StringToDouble(value,(char **) NULL);
628 reference_black=ReferenceBlack;
629 value=GetImageProperty(image,"reference-black",exception);
630 if (value != (const char *) NULL)
631 reference_black=StringToDouble(value,(char **) NULL);
632 reference_white=ReferenceWhite;
633 value=GetImageProperty(image,"reference-white",exception);
634 if (value != (const char *) NULL)
635 reference_white=StringToDouble(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(static,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(static,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 == (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(static,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(static,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(static,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(static,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(static,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(static,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(static,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(static,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(static,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(static,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(static,4) shared(status)
1062 for (y=0; y < (ssize_t) image->rows; y++)
1073 register unsigned int
1078 if (status == MagickFalse)
1080 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1082 if (q == (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);
1125 register unsigned int
1131 Convert PseudoClass image.
1133 for (i=0; i < (ssize_t) image->colors; i++)
1138 red=ScaleQuantumToMap(image->colormap[i].red);
1139 green=ScaleQuantumToMap(image->colormap[i].green);
1140 blue=ScaleQuantumToMap(image->colormap[i].blue);
1141 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1142 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1143 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1144 image->colormap[i].red=ScaleMapToQuantum(pixel.red);
1145 image->colormap[i].green=ScaleMapToQuantum(pixel.green);
1146 image->colormap[i].blue=ScaleMapToQuantum(pixel.blue);
1148 (void) SyncImage(image,exception);
1153 Relinquish resources.
1155 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1156 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1157 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1158 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1159 return(MagickFalse);
1164 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1168 % S e t I m a g e C o l o r s p a c e %
1172 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1174 % SetImageColorspace() sets the colorspace member of the Image structure.
1176 % The format of the SetImageColorspace method is:
1178 % MagickBooleanType SetImageColorspace(Image *image,
1179 % const ColorspaceType colorspace,ExceptiionInfo *exception)
1181 % A description of each parameter follows:
1183 % o image: the image.
1185 % o colorspace: the colorspace.
1187 % o exception: return any errors or warnings in this structure.
1190 MagickExport MagickBooleanType SetImageColorspace(Image *image,
1191 const ColorspaceType colorspace,ExceptionInfo *exception)
1193 image->colorspace=colorspace;
1194 return(SyncImagePixelCache(image,exception));
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,ExceptionInfo *exception)
1215 % A description of each parameter follows:
1217 % o image: the image.
1219 % o colorspace: the colorspace.
1221 % o exception: return any errors or warnings in this structure.
1224 MagickExport MagickBooleanType TransformImageColorspace(Image *image,
1225 const ColorspaceType colorspace,ExceptionInfo *exception)
1230 assert(image != (Image *) NULL);
1231 assert(image->signature == MagickSignature);
1232 if (image->debug != MagickFalse)
1233 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1234 if (colorspace == UndefinedColorspace)
1235 return(SetImageColorspace(image,colorspace,exception));
1236 if (image->colorspace == colorspace)
1238 if ((colorspace == RGBColorspace) || (colorspace == TransparentColorspace))
1239 return(TransformRGBImage(image,image->colorspace,exception));
1241 if ((image->colorspace != RGBColorspace) &&
1242 (image->colorspace != TransparentColorspace) &&
1243 (image->colorspace != GRAYColorspace))
1244 status=TransformRGBImage(image,image->colorspace,exception);
1245 if (RGBTransformImage(image,colorspace,exception) == MagickFalse)
1251 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1255 + T r a n s f o r m R G B I m a g e %
1259 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1261 % TransformRGBImage() converts the reference image from an alternate
1262 % colorspace to RGB. The transformation matrices are not the standard ones:
1263 % the weights are rescaled to normalize the range of the transformed values to
1264 % be [0..QuantumRange].
1266 % The format of the TransformRGBImage method is:
1268 % MagickBooleanType TransformRGBImage(Image *image,
1269 % const ColorspaceType colorspace,ExceptionInfo *exception)
1271 % A description of each parameter follows:
1273 % o image: the image.
1275 % o colorspace: the colorspace to transform the image to.
1277 % o exception: return any errors or warnings in this structure.
1281 static double LabF2(double alpha)
1286 if (alpha > (24.0/116.0))
1287 return(alpha*alpha*alpha);
1288 beta=(108.0/841.0)*(alpha-(16.0/116.0));
1294 static inline void ConvertLabToXYZ(const double L,const double a,const double b,
1295 double *X,double *Y,double *Z)
1303 assert(X != (double *) NULL);
1304 assert(Y != (double *) NULL);
1305 assert(Z != (double *) NULL);
1311 y=(100.0*L+16.0)/116.0;
1312 x=y+255.0*0.002*(a > 0.5 ? a-1.0 : a);
1313 z=y-255.0*0.005*(b > 0.5 ? b-1.0 : b);
1319 static inline ssize_t RoundToYCC(const MagickRealType value)
1323 if (value >= 1388.0)
1325 return((ssize_t) (value+0.5));
1328 static inline void ConvertXYZToRGB(const double x,const double y,const double z,
1329 Quantum *red,Quantum *green,Quantum *blue)
1337 Convert XYZ to RGB colorspace.
1339 assert(red != (Quantum *) NULL);
1340 assert(green != (Quantum *) NULL);
1341 assert(blue != (Quantum *) NULL);
1342 r=3.2404542*x-1.5371385*y-0.4985314*z;
1343 g=(-0.9692660*x+1.8760108*y+0.0415560*z);
1344 b=0.0556434*x-0.2040259*y+1.0572252*z;
1346 r=1.055*pow(r,1.0/2.4)-0.055;
1350 g=1.055*pow(g,1.0/2.4)-0.055;
1354 b=1.055*pow(b,1.0/2.4)-0.055;
1357 *red=RoundToQuantum((MagickRealType) QuantumRange*r);
1358 *green=RoundToQuantum((MagickRealType) QuantumRange*g);
1359 *blue=RoundToQuantum((MagickRealType) QuantumRange*b);
1362 static inline void ConvertCMYKToRGB(PixelInfo *pixel)
1364 pixel->red=(MagickRealType) QuantumRange-(QuantumScale*pixel->red*
1365 (QuantumRange-pixel->black)+pixel->black);
1366 pixel->green=(MagickRealType) QuantumRange-(QuantumScale*pixel->green*
1367 (QuantumRange-pixel->black)+pixel->black);
1368 pixel->blue=(MagickRealType) QuantumRange-(QuantumScale*pixel->blue*
1369 (QuantumRange-pixel->black)+pixel->black);
1372 MagickExport MagickBooleanType TransformRGBImage(Image *image,
1373 const ColorspaceType colorspace,ExceptionInfo *exception)
1375 #define D50X (0.9642)
1377 #define D50Z (0.8249)
1378 #define TransformRGBImageTag "Transform/Image"
1380 #if !defined(MAGICKCORE_HDRI_SUPPORT)
1384 0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1385 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1386 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1387 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1388 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1389 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1390 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1391 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1392 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1393 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1394 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1395 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1396 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1397 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1398 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1399 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1400 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1401 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1402 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1403 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1404 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1405 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1406 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1407 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1408 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1409 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1410 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1411 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1412 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1413 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1414 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1415 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1416 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1417 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1418 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1419 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1420 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1421 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1422 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1423 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1424 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1425 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1426 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1427 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1428 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1429 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1430 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1431 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1432 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1433 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1434 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1435 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1436 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1437 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1438 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1439 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1440 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1441 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1442 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1443 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1444 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1445 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1446 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1447 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1448 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1449 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1450 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1451 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1452 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1453 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1454 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1455 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1456 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1457 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1458 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1459 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1460 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1461 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1462 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1463 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1464 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1465 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1466 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1467 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1468 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1469 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1470 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1471 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1472 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1473 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1474 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1475 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1476 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1477 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1478 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1479 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1480 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1481 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1482 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1483 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1484 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1485 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1486 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1487 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1488 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1489 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1490 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1491 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1492 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1493 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1494 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1495 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1496 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1497 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1498 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1499 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1500 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1501 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1502 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1503 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1504 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1505 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1506 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1507 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1508 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1509 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1510 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1511 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1512 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1513 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1514 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1515 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1516 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1517 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1518 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1519 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1520 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1521 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1522 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1523 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1524 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1525 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1526 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1527 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1528 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1529 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1530 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1531 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1532 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1533 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1534 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1535 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1536 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1537 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1538 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1539 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1540 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1541 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1542 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1543 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1544 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1545 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1546 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1547 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
1548 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
1549 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
1550 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
1551 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
1552 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
1553 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
1554 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
1555 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
1556 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
1557 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
1558 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
1559 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
1560 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
1561 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
1562 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
1563 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
1564 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
1565 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
1566 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
1567 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
1568 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
1569 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
1570 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
1571 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
1572 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
1573 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
1574 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
1575 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
1576 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
1577 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
1578 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
1579 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
1580 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
1581 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
1582 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
1583 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
1584 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
1585 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
1586 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
1587 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
1588 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
1589 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
1590 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
1591 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
1592 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
1593 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
1594 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
1595 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
1596 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
1597 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
1598 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
1599 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
1600 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
1601 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
1602 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
1603 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
1604 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
1605 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
1606 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
1607 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
1608 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
1609 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
1610 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
1611 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
1612 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
1613 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
1614 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
1615 0.998559f, 0.999280f, 1.000000f
1639 assert(image != (Image *) NULL);
1640 assert(image->signature == MagickSignature);
1641 if (image->debug != MagickFalse)
1642 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1645 case GRAYColorspace:
1646 case Rec601LumaColorspace:
1647 case Rec709LumaColorspace:
1649 case TransparentColorspace:
1650 case UndefinedColorspace:
1662 Transform image from CMY to RGB.
1664 if (image->storage_class == PseudoClass)
1666 if (SyncImage(image,exception) == 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(static,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 == (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,exception) == MagickFalse)
1711 return(MagickFalse);
1714 case CMYKColorspace:
1720 Transform image from CMYK to RGB.
1722 if (image->storage_class == PseudoClass)
1724 if (SyncImage(image,exception) == 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(static,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 == (Quantum *) NULL)
1758 for (x=0; x < (ssize_t) image->columns; x++)
1760 GetPixelInfoPixel(image,q,&pixel);
1761 ConvertCMYKToRGB(&pixel);
1762 SetPixelInfoPixel(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,exception) == MagickFalse)
1771 return(MagickFalse);
1777 Transform image from HSB to RGB.
1779 if (image->storage_class == PseudoClass)
1781 if (SyncImage(image,exception) == 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(static,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 == (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,ClampToQuantum(red),q);
1827 SetPixelGreen(image,ClampToQuantum(green),q);
1828 SetPixelBlue(image,ClampToQuantum(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,exception) == MagickFalse)
1837 return(MagickFalse);
1843 Transform image from HSL to RGB.
1845 if (image->storage_class == PseudoClass)
1847 if (SyncImage(image,exception) == 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(static,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 == (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,ClampToQuantum(red),q);
1893 SetPixelGreen(image,ClampToQuantum(green),q);
1894 SetPixelBlue(image,ClampToQuantum(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,exception) == MagickFalse)
1903 return(MagickFalse);
1909 Transform image from HWB to RGB.
1911 if (image->storage_class == PseudoClass)
1913 if (SyncImage(image,exception) == 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(static,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 == (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,ClampToQuantum(red),q);
1959 SetPixelGreen(image,ClampToQuantum(green),q);
1960 SetPixelBlue(image,ClampToQuantum(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,exception) == MagickFalse)
1969 return(MagickFalse);
1975 Transform image from Lab to RGB.
1977 if (image->storage_class == PseudoClass)
1979 if (SyncImage(image,exception) == 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(static,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 == (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,exception) == MagickFalse)
2042 return(MagickFalse);
2062 Transform Log to RGB colorspace.
2064 density=DisplayGamma;
2066 value=GetImageProperty(image,"gamma",exception);
2067 if (value != (const char *) NULL)
2068 gamma=1.0/fabs(StringToDouble(value,(char **) NULL)) >=
2069 MagickEpsilon ? StringToDouble(value,(char **) NULL) : 1.0;
2070 film_gamma=FilmGamma;
2071 value=GetImageProperty(image,"film-gamma",exception);
2072 if (value != (const char *) NULL)
2073 film_gamma=StringToDouble(value,(char **) NULL);
2074 reference_black=ReferenceBlack;
2075 value=GetImageProperty(image,"reference-black",exception);
2076 if (value != (const char *) NULL)
2077 reference_black=StringToDouble(value,(char **) NULL);
2078 reference_white=ReferenceWhite;
2079 value=GetImageProperty(image,"reference-white",exception);
2080 if (value != (const char *) NULL)
2081 reference_white=StringToDouble(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(static,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 == (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,exception) == 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(static,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(static,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(static,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(static,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(static,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(static,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(static,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(static,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(static,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(static,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 == (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(static,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,exception);
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,exception) == MagickFalse)
2654 return(MagickFalse);