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"
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 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
226 Convert RGB to CMY colorspace.
228 if (image->storage_class == PseudoClass)
230 if (SyncImage(image,exception) == MagickFalse)
232 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
235 image_view=AcquireCacheView(image);
236 #if defined(MAGICKCORE_OPENMP_SUPPORT)
237 #pragma omp parallel for schedule(static,4) shared(status)
239 for (y=0; y < (ssize_t) image->rows; y++)
250 if (status == MagickFalse)
252 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
254 if (q == (Quantum *) NULL)
259 for (x=0; x < (ssize_t) image->columns; x++)
261 SetPixelRed(image,ClampToQuantum((MagickRealType) (QuantumRange-
262 GetPixelRed(image,q))),q);
263 SetPixelGreen(image,ClampToQuantum((MagickRealType) (QuantumRange-
264 GetPixelGreen(image,q))),q);
265 SetPixelBlue(image,ClampToQuantum((MagickRealType) (QuantumRange-
266 GetPixelBlue(image,q))),q);
267 q+=GetPixelChannels(image);
269 sync=SyncCacheViewAuthenticPixels(image_view,exception);
270 if (sync == MagickFalse)
273 image_view=DestroyCacheView(image_view);
274 image->type=image->matte == MagickFalse ? ColorSeparationType :
275 ColorSeparationMatteType;
284 Convert RGB to CMYK colorspace.
286 if (image->storage_class == PseudoClass)
288 if (SyncImage(image,exception) == MagickFalse)
290 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
293 GetPixelInfo(image,&zero);
294 image_view=AcquireCacheView(image);
295 #if defined(MAGICKCORE_OPENMP_SUPPORT)
296 #pragma omp parallel for schedule(static,4) shared(status)
298 for (y=0; y < (ssize_t) image->rows; y++)
312 if (status == MagickFalse)
314 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
316 if (q == (Quantum *) NULL)
322 for (x=0; x < (ssize_t) image->columns; x++)
324 GetPixelInfoPixel(image,q,&pixel);
325 ConvertRGBToCMYK(&pixel);
326 SetPixelInfoPixel(image,&pixel,q);
327 q+=GetPixelChannels(image);
329 sync=SyncCacheViewAuthenticPixels(image_view,exception);
330 if (sync == MagickFalse)
333 image_view=DestroyCacheView(image_view);
334 image->type=image->matte == MagickFalse ? ColorSeparationType :
335 ColorSeparationMatteType;
341 Transform image from RGB to HSB.
343 if (image->storage_class == PseudoClass)
345 if (SyncImage(image,exception) == MagickFalse)
347 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
350 image_view=AcquireCacheView(image);
351 #if defined(MAGICKCORE_OPENMP_SUPPORT)
352 #pragma omp parallel for schedule(static,4) shared(status)
354 for (y=0; y < (ssize_t) image->rows; y++)
370 if (status == MagickFalse)
372 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
374 if (q == (Quantum *) NULL)
382 for (x=0; x < (ssize_t) image->columns; x++)
384 ConvertRGBToHSB((double) GetPixelRed(image,q),
385 (double) GetPixelGreen(image,q),(double) GetPixelBlue(image,q),
386 &hue,&saturation,&brightness);
387 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
389 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
391 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
393 q+=GetPixelChannels(image);
395 sync=SyncCacheViewAuthenticPixels(image_view,exception);
396 if (sync == MagickFalse)
399 image_view=DestroyCacheView(image_view);
405 Transform image from RGB to HSL.
407 if (image->storage_class == PseudoClass)
409 if (SyncImage(image,exception) == MagickFalse)
411 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
414 image_view=AcquireCacheView(image);
415 #if defined(MAGICKCORE_OPENMP_SUPPORT)
416 #pragma omp parallel for schedule(static,4) shared(status)
418 for (y=0; y < (ssize_t) image->rows; y++)
434 if (status == MagickFalse)
436 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
438 if (q == (Quantum *) NULL)
446 for (x=0; x < (ssize_t) image->columns; x++)
448 ConvertRGBToHSL((double) GetPixelRed(image,q),(double)
449 GetPixelGreen(image,q),(double) GetPixelBlue(image,q),
450 &hue,&saturation,&lightness);
451 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
453 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
455 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
457 q+=GetPixelChannels(image);
459 sync=SyncCacheViewAuthenticPixels(image_view,exception);
460 if (sync == MagickFalse)
463 image_view=DestroyCacheView(image_view);
469 Transform image from RGB to HWB.
471 if (image->storage_class == PseudoClass)
473 if (SyncImage(image,exception) == MagickFalse)
475 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
478 image_view=AcquireCacheView(image);
479 #if defined(MAGICKCORE_OPENMP_SUPPORT)
480 #pragma omp parallel for schedule(static,4) shared(status)
482 for (y=0; y < (ssize_t) image->rows; y++)
498 if (status == MagickFalse)
500 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
502 if (q == (Quantum *) NULL)
510 for (x=0; x < (ssize_t) image->columns; x++)
512 ConvertRGBToHWB((double) GetPixelRed(image,q),(double)
513 GetPixelGreen(image,q),(double) GetPixelBlue(image,q),
514 &hue,&whiteness,&blackness);
515 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
517 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
519 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
521 q+=GetPixelChannels(image);
523 sync=SyncCacheViewAuthenticPixels(image_view,exception);
524 if (sync == MagickFalse)
527 image_view=DestroyCacheView(image_view);
533 Transform image from RGB to Lab.
535 if (image->storage_class == PseudoClass)
537 if (SyncImage(image,exception) == MagickFalse)
539 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
542 image_view=AcquireCacheView(image);
543 #if defined(MAGICKCORE_OPENMP_SUPPORT)
544 #pragma omp parallel for schedule(static,4) shared(status)
546 for (y=0; y < (ssize_t) image->rows; y++)
565 if (status == MagickFalse)
567 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
569 if (q == (Quantum *) NULL)
580 for (x=0; x < (ssize_t) image->columns; x++)
582 ConvertRGBToXYZ(GetPixelRed(image,q),GetPixelGreen(image,q),
583 GetPixelBlue(image,q),&X,&Y,&Z);
584 ConvertXYZToLab(X,Y,Z,&L,&a,&b);
585 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
587 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
589 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
591 q+=GetPixelChannels(image);
593 sync=SyncCacheViewAuthenticPixels(image_view,exception);
594 if (sync == MagickFalse)
597 image_view=DestroyCacheView(image_view);
602 #define DisplayGamma (1.0/1.7)
603 #define FilmGamma 0.6
604 #define ReferenceBlack 95.0
605 #define ReferenceWhite 685.0
622 Transform RGB to Log colorspace.
624 density=DisplayGamma;
626 value=GetImageProperty(image,"gamma",exception);
627 if (value != (const char *) NULL)
628 gamma=1.0/fabs(StringToDouble(value,(char **) NULL)) >= MagickEpsilon ?
629 StringToDouble(value,(char **) NULL) : 1.0;
630 film_gamma=FilmGamma;
631 value=GetImageProperty(image,"film-gamma",exception);
632 if (value != (const char *) NULL)
633 film_gamma=StringToDouble(value,(char **) NULL);
634 reference_black=ReferenceBlack;
635 value=GetImageProperty(image,"reference-black",exception);
636 if (value != (const char *) NULL)
637 reference_black=StringToDouble(value,(char **) NULL);
638 reference_white=ReferenceWhite;
639 value=GetImageProperty(image,"reference-white",exception);
640 if (value != (const char *) NULL)
641 reference_white=StringToDouble(value,(char **) NULL);
642 logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
644 if (logmap == (Quantum *) NULL)
645 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
647 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*
649 #if defined(MAGICKCORE_OPENMP_SUPPORT)
650 #pragma omp parallel for schedule(static)
652 for (i=0; i <= (ssize_t) MaxMap; i++)
653 logmap[i]=ScaleMapToQuantum((MagickRealType) (MaxMap*(reference_white+
654 log10(black+((MagickRealType) i/MaxMap)*(1.0-black))/((gamma/density)*
655 0.002/film_gamma))/1024.0));
656 image_view=AcquireCacheView(image);
657 #if defined(MAGICKCORE_OPENMP_SUPPORT)
658 #pragma omp parallel for schedule(static,4) shared(status)
660 for (y=0; y < (ssize_t) image->rows; y++)
671 if (status == MagickFalse)
673 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
675 if (q == (Quantum *) NULL)
680 for (x=(ssize_t) image->columns; x != 0; x--)
682 SetPixelRed(image,logmap[ScaleQuantumToMap(
683 GetPixelRed(image,q))],q);
684 SetPixelGreen(image,logmap[ScaleQuantumToMap(
685 GetPixelGreen(image,q))],q);
686 SetPixelBlue(image,logmap[ScaleQuantumToMap(
687 GetPixelBlue(image,q))],q);
688 q+=GetPixelChannels(image);
690 sync=SyncCacheViewAuthenticPixels(image_view,exception);
691 if (sync == MagickFalse)
694 image_view=DestroyCacheView(image_view);
695 logmap=(Quantum *) RelinquishMagickMemory(logmap);
704 x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
706 y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
708 z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
710 if ((x_map == (TransformPacket *) NULL) ||
711 (y_map == (TransformPacket *) NULL) ||
712 (z_map == (TransformPacket *) NULL))
713 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
715 (void) ResetMagickMemory(&primary_info,0,sizeof(primary_info));
721 Initialize OHTA tables:
723 I1 = 0.33333*R+0.33334*G+0.33333*B
724 I2 = 0.50000*R+0.00000*G-0.50000*B
725 I3 =-0.25000*R+0.50000*G-0.25000*B
727 I and Q, normally -0.5 through 0.5, are normalized to the range 0
728 through QuantumRange.
730 primary_info.y=(double) (MaxMap+1.0)/2.0;
731 primary_info.z=(double) (MaxMap+1.0)/2.0;
732 #if defined(MAGICKCORE_OPENMP_SUPPORT)
733 #pragma omp parallel for schedule(static)
735 for (i=0; i <= (ssize_t) MaxMap; i++)
737 x_map[i].x=0.33333f*(MagickRealType) i;
738 y_map[i].x=0.33334f*(MagickRealType) i;
739 z_map[i].x=0.33333f*(MagickRealType) i;
740 x_map[i].y=0.50000f*(MagickRealType) i;
741 y_map[i].y=0.00000f*(MagickRealType) i;
742 z_map[i].y=(-0.50000f)*(MagickRealType) i;
743 x_map[i].z=(-0.25000f)*(MagickRealType) i;
744 y_map[i].z=0.50000f*(MagickRealType) i;
745 z_map[i].z=(-0.25000f)*(MagickRealType) i;
749 case Rec601LumaColorspace:
753 Initialize Rec601 luma tables:
755 G = 0.29900*R+0.58700*G+0.11400*B
757 #if defined(MAGICKCORE_OPENMP_SUPPORT)
758 #pragma omp parallel for schedule(static)
760 for (i=0; i <= (ssize_t) MaxMap; i++)
762 x_map[i].x=0.29900f*(MagickRealType) i;
763 y_map[i].x=0.58700f*(MagickRealType) i;
764 z_map[i].x=0.11400f*(MagickRealType) i;
765 x_map[i].y=0.29900f*(MagickRealType) i;
766 y_map[i].y=0.58700f*(MagickRealType) i;
767 z_map[i].y=0.11400f*(MagickRealType) i;
768 x_map[i].z=0.29900f*(MagickRealType) i;
769 y_map[i].z=0.58700f*(MagickRealType) i;
770 z_map[i].z=0.11400f*(MagickRealType) i;
772 image->type=GrayscaleType;
775 case Rec601YCbCrColorspace:
776 case YCbCrColorspace:
779 Initialize YCbCr tables (ITU-R BT.601):
781 Y = 0.299000*R+0.587000*G+0.114000*B
782 Cb= -0.168736*R-0.331264*G+0.500000*B
783 Cr= 0.500000*R-0.418688*G-0.081312*B
785 Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
786 through QuantumRange.
788 primary_info.y=(double) (MaxMap+1.0)/2.0;
789 primary_info.z=(double) (MaxMap+1.0)/2.0;
790 #if defined(MAGICKCORE_OPENMP_SUPPORT)
791 #pragma omp parallel for schedule(static)
793 for (i=0; i <= (ssize_t) MaxMap; i++)
795 x_map[i].x=0.299000f*(MagickRealType) i;
796 y_map[i].x=0.587000f*(MagickRealType) i;
797 z_map[i].x=0.114000f*(MagickRealType) i;
798 x_map[i].y=(-0.168730f)*(MagickRealType) i;
799 y_map[i].y=(-0.331264f)*(MagickRealType) i;
800 z_map[i].y=0.500000f*(MagickRealType) i;
801 x_map[i].z=0.500000f*(MagickRealType) i;
802 y_map[i].z=(-0.418688f)*(MagickRealType) i;
803 z_map[i].z=(-0.081312f)*(MagickRealType) i;
807 case Rec709LumaColorspace:
810 Initialize Rec709 luma tables:
812 G = 0.21260*R+0.71520*G+0.07220*B
814 #if defined(MAGICKCORE_OPENMP_SUPPORT)
815 #pragma omp parallel for schedule(static)
817 for (i=0; i <= (ssize_t) MaxMap; i++)
819 x_map[i].x=0.21260f*(MagickRealType) i;
820 y_map[i].x=0.71520f*(MagickRealType) i;
821 z_map[i].x=0.07220f*(MagickRealType) i;
822 x_map[i].y=0.21260f*(MagickRealType) i;
823 y_map[i].y=0.71520f*(MagickRealType) i;
824 z_map[i].y=0.07220f*(MagickRealType) i;
825 x_map[i].z=0.21260f*(MagickRealType) i;
826 y_map[i].z=0.71520f*(MagickRealType) i;
827 z_map[i].z=0.07220f*(MagickRealType) i;
831 case Rec709YCbCrColorspace:
834 Initialize YCbCr tables (ITU-R BT.709):
836 Y = 0.212600*R+0.715200*G+0.072200*B
837 Cb= -0.114572*R-0.385428*G+0.500000*B
838 Cr= 0.500000*R-0.454153*G-0.045847*B
840 Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
841 through QuantumRange.
843 primary_info.y=(double) (MaxMap+1.0)/2.0;
844 primary_info.z=(double) (MaxMap+1.0)/2.0;
845 #if defined(MAGICKCORE_OPENMP_SUPPORT)
846 #pragma omp parallel for schedule(static)
848 for (i=0; i <= (ssize_t) MaxMap; i++)
850 x_map[i].x=0.212600f*(MagickRealType) i;
851 y_map[i].x=0.715200f*(MagickRealType) i;
852 z_map[i].x=0.072200f*(MagickRealType) i;
853 x_map[i].y=(-0.114572f)*(MagickRealType) i;
854 y_map[i].y=(-0.385428f)*(MagickRealType) i;
855 z_map[i].y=0.500000f*(MagickRealType) i;
856 x_map[i].z=0.500000f*(MagickRealType) i;
857 y_map[i].z=(-0.454153f)*(MagickRealType) i;
858 z_map[i].z=(-0.045847f)*(MagickRealType) i;
865 Nonlinear sRGB to linear RGB (http://www.w3.org/Graphics/Color/sRGB):
867 R = 1.0*R+0.0*G+0.0*B
868 G = 0.0*R+1.0*G+0.0*B
869 B = 0.0*R+0.0*G+1.0*B
871 #if defined(MAGICKCORE_OPENMP_SUPPORT)
872 #pragma omp parallel for schedule(static)
874 for (i=0; i <= (ssize_t) MaxMap; i++)
879 v=(MagickRealType) i/(MagickRealType) MaxMap;
880 if (((MagickRealType) i/(MagickRealType) MaxMap) <= 0.0031308)
883 v=(MagickRealType) (1.055*pow((double) i/MaxMap,1.0/2.4)-0.055);
884 x_map[i].x=1.0f*MaxMap*v;
885 y_map[i].x=0.0f*MaxMap*v;
886 z_map[i].x=0.0f*MaxMap*v;
887 x_map[i].y=0.0f*MaxMap*v;
888 y_map[i].y=1.0f*MaxMap*v;
889 z_map[i].y=0.0f*MaxMap*v;
890 x_map[i].z=0.0f*MaxMap*v;
891 y_map[i].z=0.0f*MaxMap*v;
892 z_map[i].z=1.0f*MaxMap*v;
899 Initialize CIE XYZ tables (ITU-R 709 RGB):
901 X = 0.4124564*R+0.3575761*G+0.1804375*B
902 Y = 0.2126729*R+0.7151522*G+0.0721750*B
903 Z = 0.0193339*R+0.1191920*G+0.9503041*B
905 #if defined(MAGICKCORE_OPENMP_SUPPORT)
906 #pragma omp parallel for schedule(static)
908 for (i=0; i <= (ssize_t) MaxMap; i++)
910 x_map[i].x=0.4124564f*(MagickRealType) i;
911 y_map[i].x=0.3575761f*(MagickRealType) i;
912 z_map[i].x=0.1804375f*(MagickRealType) i;
913 x_map[i].y=0.2126729f*(MagickRealType) i;
914 y_map[i].y=0.7151522f*(MagickRealType) i;
915 z_map[i].y=0.0721750f*(MagickRealType) i;
916 x_map[i].z=0.0193339f*(MagickRealType) i;
917 y_map[i].z=0.1191920f*(MagickRealType) i;
918 z_map[i].z=0.9503041f*(MagickRealType) i;
925 Initialize YCC tables:
927 Y = 0.29900*R+0.58700*G+0.11400*B
928 C1= -0.29900*R-0.58700*G+0.88600*B
929 C2= 0.70100*R-0.58700*G-0.11400*B
931 YCC is scaled by 1.3584. C1 zero is 156 and C2 is at 137.
933 primary_info.y=(double) ScaleQuantumToMap(ScaleCharToQuantum(156));
934 primary_info.z=(double) ScaleQuantumToMap(ScaleCharToQuantum(137));
935 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
937 x_map[i].x=0.003962014134275617f*(MagickRealType) i;
938 y_map[i].x=0.007778268551236748f*(MagickRealType) i;
939 z_map[i].x=0.001510600706713781f*(MagickRealType) i;
940 x_map[i].y=(-0.002426619775463276f)*(MagickRealType) i;
941 y_map[i].y=(-0.004763965913702149f)*(MagickRealType) i;
942 z_map[i].y=0.007190585689165425f*(MagickRealType) i;
943 x_map[i].z=0.006927257754597858f*(MagickRealType) i;
944 y_map[i].z=(-0.005800713697502058f)*(MagickRealType) i;
945 z_map[i].z=(-0.0011265440570958f)*(MagickRealType) i;
947 for ( ; i <= (ssize_t) MaxMap; i++)
949 x_map[i].x=0.2201118963486454*(1.099f*(MagickRealType) i-0.099f);
950 y_map[i].x=0.4321260306242638*(1.099f*(MagickRealType) i-0.099f);
951 z_map[i].x=0.08392226148409894*(1.099f*(MagickRealType) i-0.099f);
952 x_map[i].y=(-0.1348122097479598)*(1.099f*(MagickRealType) i-0.099f);
953 y_map[i].y=(-0.2646647729834528)*(1.099f*(MagickRealType) i-0.099f);
954 z_map[i].y=0.3994769827314126*(1.099f*(MagickRealType) i-0.099f);
955 x_map[i].z=0.3848476530332144*(1.099f*(MagickRealType) i-0.099f);
956 y_map[i].z=(-0.3222618720834477)*(1.099f*(MagickRealType) i-0.099f);
957 z_map[i].z=(-0.06258578094976668)*(1.099f*(MagickRealType) i-0.099f);
964 Initialize YIQ tables:
966 Y = 0.29900*R+0.58700*G+0.11400*B
967 I = 0.59600*R-0.27400*G-0.32200*B
968 Q = 0.21100*R-0.52300*G+0.31200*B
970 I and Q, normally -0.5 through 0.5, are normalized to the range 0
971 through QuantumRange.
973 primary_info.y=(double) (MaxMap+1.0)/2.0;
974 primary_info.z=(double) (MaxMap+1.0)/2.0;
975 #if defined(MAGICKCORE_OPENMP_SUPPORT)
976 #pragma omp parallel for schedule(static)
978 for (i=0; i <= (ssize_t) MaxMap; i++)
980 x_map[i].x=0.29900f*(MagickRealType) i;
981 y_map[i].x=0.58700f*(MagickRealType) i;
982 z_map[i].x=0.11400f*(MagickRealType) i;
983 x_map[i].y=0.59600f*(MagickRealType) i;
984 y_map[i].y=(-0.27400f)*(MagickRealType) i;
985 z_map[i].y=(-0.32200f)*(MagickRealType) i;
986 x_map[i].z=0.21100f*(MagickRealType) i;
987 y_map[i].z=(-0.52300f)*(MagickRealType) i;
988 z_map[i].z=0.31200f*(MagickRealType) i;
992 case YPbPrColorspace:
995 Initialize YPbPr tables (ITU-R BT.601):
997 Y = 0.299000*R+0.587000*G+0.114000*B
998 Pb= -0.168736*R-0.331264*G+0.500000*B
999 Pr= 0.500000*R-0.418688*G-0.081312*B
1001 Pb and Pr, normally -0.5 through 0.5, are normalized to the range 0
1002 through QuantumRange.
1004 primary_info.y=(double) (MaxMap+1.0)/2.0;
1005 primary_info.z=(double) (MaxMap+1.0)/2.0;
1006 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1007 #pragma omp parallel for schedule(static)
1009 for (i=0; i <= (ssize_t) MaxMap; i++)
1011 x_map[i].x=0.299000f*(MagickRealType) i;
1012 y_map[i].x=0.587000f*(MagickRealType) i;
1013 z_map[i].x=0.114000f*(MagickRealType) i;
1014 x_map[i].y=(-0.168736f)*(MagickRealType) i;
1015 y_map[i].y=(-0.331264f)*(MagickRealType) i;
1016 z_map[i].y=0.500000f*(MagickRealType) i;
1017 x_map[i].z=0.500000f*(MagickRealType) i;
1018 y_map[i].z=(-0.418688f)*(MagickRealType) i;
1019 z_map[i].z=(-0.081312f)*(MagickRealType) i;
1027 Initialize YUV tables:
1029 Y = 0.29900*R+0.58700*G+0.11400*B
1030 U = -0.14740*R-0.28950*G+0.43690*B
1031 V = 0.61500*R-0.51500*G-0.10000*B
1033 U and V, normally -0.5 through 0.5, are normalized to the range 0
1034 through QuantumRange. Note that U = 0.493*(B-Y), V = 0.877*(R-Y).
1036 primary_info.y=(double) (MaxMap+1.0)/2.0;
1037 primary_info.z=(double) (MaxMap+1.0)/2.0;
1038 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1039 #pragma omp parallel for schedule(static)
1041 for (i=0; i <= (ssize_t) MaxMap; i++)
1043 x_map[i].x=0.29900f*(MagickRealType) i;
1044 y_map[i].x=0.58700f*(MagickRealType) i;
1045 z_map[i].x=0.11400f*(MagickRealType) i;
1046 x_map[i].y=(-0.14740f)*(MagickRealType) i;
1047 y_map[i].y=(-0.28950f)*(MagickRealType) i;
1048 z_map[i].y=0.43690f*(MagickRealType) i;
1049 x_map[i].z=0.61500f*(MagickRealType) i;
1050 y_map[i].z=(-0.51500f)*(MagickRealType) i;
1051 z_map[i].z=(-0.10000f)*(MagickRealType) i;
1059 switch (image->storage_class)
1065 Convert DirectClass image.
1067 image_view=AcquireCacheView(image);
1068 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1069 #pragma omp parallel for schedule(static,4) shared(status)
1071 for (y=0; y < (ssize_t) image->rows; y++)
1085 register unsigned int
1090 if (status == MagickFalse)
1092 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1094 if (q == (Quantum *) NULL)
1099 for (x=0; x < (ssize_t) image->columns; x++)
1101 red=ScaleQuantumToMap(GetPixelRed(image,q));
1102 green=ScaleQuantumToMap(GetPixelGreen(image,q));
1103 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
1104 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1105 (MagickRealType) primary_info.x;
1106 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1107 (MagickRealType) primary_info.y;
1108 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1109 (MagickRealType) primary_info.z;
1110 SetPixelRed(image,ScaleMapToQuantum(pixel.red),q);
1111 SetPixelGreen(image,ScaleMapToQuantum(pixel.green),q);
1112 SetPixelBlue(image,ScaleMapToQuantum(pixel.blue),q);
1113 q+=GetPixelChannels(image);
1115 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1116 if (sync == MagickFalse)
1118 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1123 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1124 #pragma omp critical (MagickCore_RGBTransformImage)
1126 proceed=SetImageProgress(image,RGBTransformImageTag,progress++,
1128 if (proceed == MagickFalse)
1132 image_view=DestroyCacheView(image_view);
1137 register unsigned int
1143 Convert PseudoClass image.
1145 for (i=0; i < (ssize_t) image->colors; i++)
1150 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
1151 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
1152 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
1153 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1154 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1155 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1156 image->colormap[i].red=(double) ScaleMapToQuantum(pixel.red);
1157 image->colormap[i].green=(double) ScaleMapToQuantum(pixel.green);
1158 image->colormap[i].blue=(double) ScaleMapToQuantum(pixel.blue);
1160 (void) SyncImage(image,exception);
1165 Relinquish resources.
1167 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1168 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1169 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1170 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1171 return(MagickFalse);
1176 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1180 % S e t I m a g e C o l o r s p a c e %
1184 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1186 % SetImageColorspace() sets the colorspace member of the Image structure.
1188 % The format of the SetImageColorspace method is:
1190 % MagickBooleanType SetImageColorspace(Image *image,
1191 % const ColorspaceType colorspace,ExceptiionInfo *exception)
1193 % A description of each parameter follows:
1195 % o image: the image.
1197 % o colorspace: the colorspace.
1199 % o exception: return any errors or warnings in this structure.
1202 MagickExport MagickBooleanType SetImageColorspace(Image *image,
1203 const ColorspaceType colorspace,ExceptionInfo *exception)
1205 image->colorspace=colorspace;
1206 return(SyncImagePixelCache(image,exception));
1210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1214 % T r a n s f o r m I m a g e C o l o r s p a c e %
1218 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1220 % TransformImageColorspace() transforms an image colorspace.
1222 % The format of the TransformImageColorspace method is:
1224 % MagickBooleanType TransformImageColorspace(Image *image,
1225 % const ColorspaceType colorspace,ExceptionInfo *exception)
1227 % A description of each parameter follows:
1229 % o image: the image.
1231 % o colorspace: the colorspace.
1233 % o exception: return any errors or warnings in this structure.
1236 MagickExport MagickBooleanType TransformImageColorspace(Image *image,
1237 const ColorspaceType colorspace,ExceptionInfo *exception)
1242 assert(image != (Image *) NULL);
1243 assert(image->signature == MagickSignature);
1244 if (image->debug != MagickFalse)
1245 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1246 if (colorspace == UndefinedColorspace)
1247 return(SetImageColorspace(image,colorspace,exception));
1248 if (image->colorspace == colorspace)
1249 return(MagickTrue); /* same colorspace: no op */
1251 Convert the reference image from an alternate colorspace to RGB.
1253 if ((colorspace == RGBColorspace) || (colorspace == TransparentColorspace))
1254 return(TransformRGBImage(image,colorspace,exception));
1256 if (IsRGBColorspace(image->colorspace) == MagickFalse)
1257 status=TransformRGBImage(image,image->colorspace,exception);
1259 Convert the reference image from RGB to an alternate colorspace.
1261 if (RGBTransformImage(image,colorspace,exception) == MagickFalse)
1267 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1271 + T r a n s f o r m R G B I m a g e %
1275 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1277 % TransformRGBImage() converts the reference image from an alternate
1278 % colorspace to RGB. The transformation matrices are not the standard ones:
1279 % the weights are rescaled to normalize the range of the transformed values to
1280 % be [0..QuantumRange].
1282 % The format of the TransformRGBImage method is:
1284 % MagickBooleanType TransformRGBImage(Image *image,
1285 % const ColorspaceType colorspace,ExceptionInfo *exception)
1287 % A description of each parameter follows:
1289 % o image: the image.
1291 % o colorspace: the colorspace to transform the image to.
1293 % o exception: return any errors or warnings in this structure.
1297 static double LabF2(double alpha)
1302 if (alpha > (24.0/116.0))
1303 return(alpha*alpha*alpha);
1304 beta=(108.0/841.0)*(alpha-(16.0/116.0));
1310 static inline void ConvertLabToXYZ(const double L,const double a,const double b,
1311 double *X,double *Y,double *Z)
1319 assert(X != (double *) NULL);
1320 assert(Y != (double *) NULL);
1321 assert(Z != (double *) NULL);
1327 y=(100.0*L+16.0)/116.0;
1328 x=y+255.0*0.002*(a > 0.5 ? a-1.0 : a);
1329 z=y-255.0*0.005*(b > 0.5 ? b-1.0 : b);
1335 static inline ssize_t RoundToYCC(const MagickRealType value)
1339 if (value >= 1388.0)
1341 return((ssize_t) (value+0.5));
1344 static inline void ConvertXYZToRGB(const double x,const double y,const double z,
1345 Quantum *red,Quantum *green,Quantum *blue)
1353 Convert XYZ to RGB colorspace.
1355 assert(red != (Quantum *) NULL);
1356 assert(green != (Quantum *) NULL);
1357 assert(blue != (Quantum *) NULL);
1358 r=3.2404542*x-1.5371385*y-0.4985314*z;
1359 g=(-0.9692660*x+1.8760108*y+0.0415560*z);
1360 b=0.0556434*x-0.2040259*y+1.0572252*z;
1362 r=1.055*pow(r,1.0/2.4)-0.055;
1366 g=1.055*pow(g,1.0/2.4)-0.055;
1370 b=1.055*pow(b,1.0/2.4)-0.055;
1373 *red=RoundToQuantum((MagickRealType) QuantumRange*r);
1374 *green=RoundToQuantum((MagickRealType) QuantumRange*g);
1375 *blue=RoundToQuantum((MagickRealType) QuantumRange*b);
1378 static inline void ConvertCMYKToRGB(PixelInfo *pixel)
1380 pixel->red=(MagickRealType) QuantumRange-(QuantumScale*pixel->red*
1381 (QuantumRange-pixel->black)+pixel->black);
1382 pixel->green=(MagickRealType) QuantumRange-(QuantumScale*pixel->green*
1383 (QuantumRange-pixel->black)+pixel->black);
1384 pixel->blue=(MagickRealType) QuantumRange-(QuantumScale*pixel->blue*
1385 (QuantumRange-pixel->black)+pixel->black);
1388 MagickExport MagickBooleanType TransformRGBImage(Image *image,
1389 const ColorspaceType colorspace,ExceptionInfo *exception)
1391 #define D50X (0.9642)
1393 #define D50Z (0.8249)
1394 #define TransformRGBImageTag "Transform/Image"
1396 #if !defined(MAGICKCORE_HDRI_SUPPORT)
1400 0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1401 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1402 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1403 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1404 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1405 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1406 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1407 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1408 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1409 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1410 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1411 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1412 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1413 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1414 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1415 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1416 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1417 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1418 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1419 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1420 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1421 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1422 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1423 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1424 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1425 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1426 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1427 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1428 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1429 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1430 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1431 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1432 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1433 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1434 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1435 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1436 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1437 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1438 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1439 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1440 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1441 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1442 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1443 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1444 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1445 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1446 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1447 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1448 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1449 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1450 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1451 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1452 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1453 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1454 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1455 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1456 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1457 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1458 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1459 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1460 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1461 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1462 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1463 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1464 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1465 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1466 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1467 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1468 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1469 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1470 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1471 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1472 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1473 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1474 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1475 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1476 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1477 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1478 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1479 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1480 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1481 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1482 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1483 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1484 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1485 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1486 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1487 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1488 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1489 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1490 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1491 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1492 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1493 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1494 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1495 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1496 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1497 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1498 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1499 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1500 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1501 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1502 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1503 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1504 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1505 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1506 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1507 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1508 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1509 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1510 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1511 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1512 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1513 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1514 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1515 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1516 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1517 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1518 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1519 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1520 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1521 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1522 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1523 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1524 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1525 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1526 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1527 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1528 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1529 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1530 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1531 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1532 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1533 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1534 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1535 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1536 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1537 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1538 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1539 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1540 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1541 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1542 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1543 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1544 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1545 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1546 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1547 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1548 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1549 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1550 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1551 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1552 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1553 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1554 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1555 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1556 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1557 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1558 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1559 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1560 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1561 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1562 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1563 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
1564 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
1565 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
1566 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
1567 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
1568 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
1569 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
1570 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
1571 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
1572 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
1573 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
1574 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
1575 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
1576 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
1577 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
1578 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
1579 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
1580 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
1581 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
1582 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
1583 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
1584 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
1585 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
1586 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
1587 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
1588 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
1589 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
1590 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
1591 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
1592 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
1593 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
1594 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
1595 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
1596 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
1597 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
1598 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
1599 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
1600 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
1601 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
1602 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
1603 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
1604 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
1605 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
1606 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
1607 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
1608 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
1609 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
1610 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
1611 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
1612 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
1613 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
1614 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
1615 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
1616 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
1617 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
1618 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
1619 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
1620 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
1621 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
1622 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
1623 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
1624 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
1625 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
1626 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
1627 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
1628 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
1629 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
1630 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
1631 0.998559f, 0.999280f, 1.000000f
1655 assert(image != (Image *) NULL);
1656 assert(image->signature == MagickSignature);
1657 if (image->debug != MagickFalse)
1658 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1661 switch (image->colorspace)
1666 Transform image from CMY to RGB.
1668 if (image->storage_class == PseudoClass)
1670 if (SyncImage(image,exception) == MagickFalse)
1671 return(MagickFalse);
1672 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1673 return(MagickFalse);
1675 image_view=AcquireCacheView(image);
1676 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1677 #pragma omp parallel for schedule(static,4) shared(status)
1679 for (y=0; y < (ssize_t) image->rows; y++)
1690 if (status == MagickFalse)
1692 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1694 if (q == (Quantum *) NULL)
1699 for (x=0; x < (ssize_t) image->columns; x++)
1701 SetPixelRed(image,ClampToQuantum((MagickRealType) (QuantumRange-
1702 GetPixelRed(image,q))),q);
1703 SetPixelGreen(image,ClampToQuantum((MagickRealType) (QuantumRange-
1704 GetPixelGreen(image,q))),q);
1705 SetPixelBlue(image,ClampToQuantum((MagickRealType) (QuantumRange-
1706 GetPixelBlue(image,q))),q);
1707 q+=GetPixelChannels(image);
1709 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1710 if (sync == MagickFalse)
1713 image_view=DestroyCacheView(image_view);
1714 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
1715 return(MagickFalse);
1718 case CMYKColorspace:
1724 Transform image from CMYK to RGB.
1726 if (image->storage_class == PseudoClass)
1728 if (SyncImage(image,exception) == MagickFalse)
1729 return(MagickFalse);
1730 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1731 return(MagickFalse);
1733 GetPixelInfo(image,&zero);
1734 image_view=AcquireCacheView(image);
1735 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1736 #pragma omp parallel for schedule(static,4) shared(status)
1738 for (y=0; y < (ssize_t) image->rows; y++)
1752 if (status == MagickFalse)
1754 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1756 if (q == (Quantum *) NULL)
1762 for (x=0; x < (ssize_t) image->columns; x++)
1764 GetPixelInfoPixel(image,q,&pixel);
1765 ConvertCMYKToRGB(&pixel);
1766 SetPixelInfoPixel(image,&pixel,q);
1767 q+=GetPixelChannels(image);
1769 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1770 if (sync == MagickFalse)
1773 image_view=DestroyCacheView(image_view);
1774 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
1775 return(MagickFalse);
1781 Transform image from HSB to RGB.
1783 if (image->storage_class == PseudoClass)
1785 if (SyncImage(image,exception) == MagickFalse)
1786 return(MagickFalse);
1787 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1788 return(MagickFalse);
1790 image_view=AcquireCacheView(image);
1791 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1792 #pragma omp parallel for schedule(static,4) shared(status)
1794 for (y=0; y < (ssize_t) image->rows; y++)
1810 if (status == MagickFalse)
1812 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1814 if (q == (Quantum *) NULL)
1819 for (x=0; x < (ssize_t) image->columns; x++)
1826 hue=(double) (QuantumScale*GetPixelRed(image,q));
1827 saturation=(double) (QuantumScale*GetPixelGreen(image,q));
1828 brightness=(double) (QuantumScale*GetPixelBlue(image,q));
1829 ConvertHSBToRGB(hue,saturation,brightness,&red,&green,&blue);
1830 SetPixelRed(image,ClampToQuantum(red),q);
1831 SetPixelGreen(image,ClampToQuantum(green),q);
1832 SetPixelBlue(image,ClampToQuantum(blue),q);
1833 q+=GetPixelChannels(image);
1835 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1836 if (sync == MagickFalse)
1839 image_view=DestroyCacheView(image_view);
1840 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
1841 return(MagickFalse);
1847 Transform image from HSL to RGB.
1849 if (image->storage_class == PseudoClass)
1851 if (SyncImage(image,exception) == MagickFalse)
1852 return(MagickFalse);
1853 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1854 return(MagickFalse);
1856 image_view=AcquireCacheView(image);
1857 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1858 #pragma omp parallel for schedule(static,4) shared(status)
1860 for (y=0; y < (ssize_t) image->rows; y++)
1876 if (status == MagickFalse)
1878 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1880 if (q == (Quantum *) NULL)
1885 for (x=0; x < (ssize_t) image->columns; x++)
1892 hue=(double) (QuantumScale*GetPixelRed(image,q));
1893 saturation=(double) (QuantumScale*GetPixelGreen(image,q));
1894 lightness=(double) (QuantumScale*GetPixelBlue(image,q));
1895 ConvertHSLToRGB(hue,saturation,lightness,&red,&green,&blue);
1896 SetPixelRed(image,ClampToQuantum(red),q);
1897 SetPixelGreen(image,ClampToQuantum(green),q);
1898 SetPixelBlue(image,ClampToQuantum(blue),q);
1899 q+=GetPixelChannels(image);
1901 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1902 if (sync == MagickFalse)
1905 image_view=DestroyCacheView(image_view);
1906 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
1907 return(MagickFalse);
1913 Transform image from HWB to RGB.
1915 if (image->storage_class == PseudoClass)
1917 if (SyncImage(image,exception) == MagickFalse)
1918 return(MagickFalse);
1919 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1920 return(MagickFalse);
1922 image_view=AcquireCacheView(image);
1923 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1924 #pragma omp parallel for schedule(static,4) shared(status)
1926 for (y=0; y < (ssize_t) image->rows; y++)
1942 if (status == MagickFalse)
1944 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1946 if (q == (Quantum *) NULL)
1951 for (x=0; x < (ssize_t) image->columns; x++)
1958 hue=(double) (QuantumScale*GetPixelRed(image,q));
1959 whiteness=(double) (QuantumScale*GetPixelGreen(image,q));
1960 blackness=(double) (QuantumScale*GetPixelBlue(image,q));
1961 ConvertHWBToRGB(hue,whiteness,blackness,&red,&green,&blue);
1962 SetPixelRed(image,ClampToQuantum(red),q);
1963 SetPixelGreen(image,ClampToQuantum(green),q);
1964 SetPixelBlue(image,ClampToQuantum(blue),q);
1965 q+=GetPixelChannels(image);
1967 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1968 if (sync == MagickFalse)
1971 image_view=DestroyCacheView(image_view);
1972 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
1973 return(MagickFalse);
1979 Transform image from Lab to RGB.
1981 if (image->storage_class == PseudoClass)
1983 if (SyncImage(image,exception) == MagickFalse)
1984 return(MagickFalse);
1985 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1986 return(MagickFalse);
1988 image_view=AcquireCacheView(image);
1989 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1990 #pragma omp parallel for schedule(static,4) shared(status)
1992 for (y=0; y < (ssize_t) image->rows; y++)
2011 if (status == MagickFalse)
2013 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2015 if (q == (Quantum *) NULL)
2023 for (x=0; x < (ssize_t) image->columns; x++)
2030 L=QuantumScale*GetPixelRed(image,q);
2031 a=QuantumScale*GetPixelGreen(image,q);
2032 b=QuantumScale*GetPixelBlue(image,q);
2033 ConvertLabToXYZ(L,a,b,&X,&Y,&Z);
2034 ConvertXYZToRGB(X,Y,Z,&red,&green,&blue);
2035 SetPixelRed(image,red,q);
2036 SetPixelGreen(image,green,q);
2037 SetPixelBlue(image,blue,q);
2038 q+=GetPixelChannels(image);
2040 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2041 if (sync == MagickFalse)
2044 image_view=DestroyCacheView(image_view);
2045 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
2046 return(MagickFalse);
2066 Transform Log to RGB colorspace.
2068 density=DisplayGamma;
2070 value=GetImageProperty(image,"gamma",exception);
2071 if (value != (const char *) NULL)
2072 gamma=1.0/fabs(StringToDouble(value,(char **) NULL)) >=
2073 MagickEpsilon ? StringToDouble(value,(char **) NULL) : 1.0;
2074 film_gamma=FilmGamma;
2075 value=GetImageProperty(image,"film-gamma",exception);
2076 if (value != (const char *) NULL)
2077 film_gamma=StringToDouble(value,(char **) NULL);
2078 reference_black=ReferenceBlack;
2079 value=GetImageProperty(image,"reference-black",exception);
2080 if (value != (const char *) NULL)
2081 reference_black=StringToDouble(value,(char **) NULL);
2082 reference_white=ReferenceWhite;
2083 value=GetImageProperty(image,"reference-white",exception);
2084 if (value != (const char *) NULL)
2085 reference_white=StringToDouble(value,(char **) NULL);
2086 logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2088 if (logmap == (Quantum *) NULL)
2089 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
2091 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*
2093 for (i=0; i <= (ssize_t) (reference_black*MaxMap/1024.0); i++)
2094 logmap[i]=(Quantum) 0;
2095 for ( ; i < (ssize_t) (reference_white*MaxMap/1024.0); i++)
2096 logmap[i]=ClampToQuantum((MagickRealType) QuantumRange/(1.0-black)*
2097 (pow(10.0,(1024.0*i/MaxMap-reference_white)*
2098 (gamma/density)*0.002/film_gamma)-black));
2099 for ( ; i <= (ssize_t) MaxMap; i++)
2100 logmap[i]=(Quantum) QuantumRange;
2101 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2102 return(MagickFalse);
2103 image_view=AcquireCacheView(image);
2104 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2105 #pragma omp parallel for schedule(static,4) shared(status)
2107 for (y=0; y < (ssize_t) image->rows; y++)
2118 if (status == MagickFalse)
2120 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2122 if (q == (Quantum *) NULL)
2127 for (x=(ssize_t) image->columns; x != 0; x--)
2129 SetPixelRed(image,logmap[ScaleQuantumToMap(
2130 GetPixelRed(image,q))],q);
2131 SetPixelGreen(image,logmap[ScaleQuantumToMap(
2132 GetPixelGreen(image,q))],q);
2133 SetPixelBlue(image,logmap[ScaleQuantumToMap(
2134 GetPixelBlue(image,q))],q);
2135 q+=GetPixelChannels(image);
2137 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2138 if (sync == MagickFalse)
2141 image_view=DestroyCacheView(image_view);
2142 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2143 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
2144 return(MagickFalse);
2151 Allocate the tables.
2153 x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2155 y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2157 z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2159 if ((x_map == (TransformPacket *) NULL) ||
2160 (y_map == (TransformPacket *) NULL) ||
2161 (z_map == (TransformPacket *) NULL))
2163 if (z_map != (TransformPacket *) NULL)
2164 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2165 if (y_map != (TransformPacket *) NULL)
2166 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2167 if (x_map != (TransformPacket *) NULL)
2168 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2169 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
2172 switch (image->colorspace)
2174 case OHTAColorspace:
2177 Initialize OHTA tables:
2179 R = I1+1.00000*I2-0.66668*I3
2180 G = I1+0.00000*I2+1.33333*I3
2181 B = I1-1.00000*I2-0.66668*I3
2183 I and Q, normally -0.5 through 0.5, must be normalized to the range 0
2184 through QuantumRange.
2186 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2187 #pragma omp parallel for schedule(static)
2189 for (i=0; i <= (ssize_t) MaxMap; i++)
2191 x_map[i].x=(MagickRealType) i;
2192 y_map[i].x=0.500000f*(2.000000*(MagickRealType) i-(MagickRealType)
2194 z_map[i].x=(-0.333340f)*(2.000000f*(MagickRealType) i-(MagickRealType)
2196 x_map[i].y=(MagickRealType) i;
2197 y_map[i].y=0.000000f;
2198 z_map[i].y=0.666665f*(2.000000f*(MagickRealType) i-(MagickRealType)
2200 x_map[i].z=(MagickRealType) i;
2201 y_map[i].z=(-0.500000f)*(2.000000f*(MagickRealType) i-(MagickRealType)
2203 z_map[i].z=(-0.333340f)*(2.000000f*(MagickRealType) i-(MagickRealType)
2208 case Rec601YCbCrColorspace:
2209 case YCbCrColorspace:
2212 Initialize YCbCr tables:
2215 G = Y-0.344136*Cb-0.714136*Cr
2218 Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
2219 through QuantumRange.
2221 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2222 #pragma omp parallel for schedule(static)
2224 for (i=0; i <= (ssize_t) MaxMap; i++)
2226 x_map[i].x=(MagickRealType) i;
2227 y_map[i].x=0.000000f;
2228 z_map[i].x=(1.402000f*0.500000f)*(2.000000f*(MagickRealType) i-
2229 (MagickRealType) MaxMap);
2230 x_map[i].y=(MagickRealType) i;
2231 y_map[i].y=(-0.344136f*0.500000f)*(2.000000f*(MagickRealType) i-
2232 (MagickRealType) MaxMap);
2233 z_map[i].y=(-0.714136f*0.500000f)*(2.000000f*(MagickRealType) i-
2234 (MagickRealType) MaxMap);
2235 x_map[i].z=(MagickRealType) i;
2236 y_map[i].z=(1.772000f*0.500000f)*(2.000000f*(MagickRealType) i-
2237 (MagickRealType) MaxMap);
2238 z_map[i].z=0.000000f;
2242 case Rec709YCbCrColorspace:
2245 Initialize YCbCr tables:
2248 G = Y-0.187324*Cb-0.468124*Cr
2251 Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
2252 through QuantumRange.
2254 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2255 #pragma omp parallel for schedule(static)
2257 for (i=0; i <= (ssize_t) MaxMap; i++)
2259 x_map[i].x=(MagickRealType) i;
2260 y_map[i].x=0.000000f;
2261 z_map[i].x=(1.574800f*0.50000f)*(2.00000f*(MagickRealType) i-
2262 (MagickRealType) MaxMap);
2263 x_map[i].y=(MagickRealType) i;
2264 y_map[i].y=(-0.187324f*0.50000f)*(2.00000f*(MagickRealType) i-
2265 (MagickRealType) MaxMap);
2266 z_map[i].y=(-0.468124f*0.50000f)*(2.00000f*(MagickRealType) i-
2267 (MagickRealType) MaxMap);
2268 x_map[i].z=(MagickRealType) i;
2269 y_map[i].z=(1.855600f*0.50000f)*(2.00000f*(MagickRealType) i-
2270 (MagickRealType) MaxMap);
2271 z_map[i].z=0.00000f;
2275 case sRGBColorspace:
2278 Nonlinear sRGB to linear RGB.
2279 Mostly removal of a gamma function, but with a linear component
2281 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2282 #pragma omp parallel for schedule(static)
2284 for (i=0; i <= (ssize_t) MaxMap; i++)
2289 v=(MagickRealType) i/(MagickRealType) MaxMap;
2290 if (((MagickRealType) i/(MagickRealType) MaxMap) <= 0.04045f)
2293 v=(MagickRealType) pow((((double) i/MaxMap)+0.055)/1.055,2.4);
2294 x_map[i].x=1.0f*MaxMap*v;
2295 y_map[i].x=0.0f*MaxMap*v;
2296 z_map[i].x=0.0f*MaxMap*v;
2297 x_map[i].y=0.0f*MaxMap*v;
2298 y_map[i].y=1.0f*MaxMap*v;
2299 z_map[i].y=0.0f*MaxMap*v;
2300 x_map[i].z=0.0f*MaxMap*v;
2301 y_map[i].z=0.0f*MaxMap*v;
2302 z_map[i].z=1.0f*MaxMap*v;
2309 Initialize CIE XYZ tables (ITU R-709 RGB):
2311 R = 3.2404542*X-1.5371385*Y-0.4985314*Z
2312 G = -0.9692660*X+1.8760108*Y+0.0415560*Z
2313 B = 0.0556434*X-0.2040259*Y+1.057225*Z
2315 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2316 #pragma omp parallel for schedule(static)
2318 for (i=0; i <= (ssize_t) MaxMap; i++)
2320 x_map[i].x=3.2404542f*(MagickRealType) i;
2321 x_map[i].y=(-0.9692660f)*(MagickRealType) i;
2322 x_map[i].z=0.0556434f*(MagickRealType) i;
2323 y_map[i].x=(-1.5371385f)*(MagickRealType) i;
2324 y_map[i].y=1.8760108f*(MagickRealType) i;
2325 y_map[i].z=(-0.2040259f)*(MagickRealType) i;
2326 z_map[i].x=(-0.4985314f)*(MagickRealType) i;
2327 z_map[i].y=0.0415560f*(MagickRealType) i;
2328 z_map[i].z=1.0572252f*(MagickRealType) i;
2335 Initialize YCC tables:
2338 G = Y-0.317038*C1-0.682243*C2
2341 YCC is scaled by 1.3584. C1 zero is 156 and C2 is at 137.
2343 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2344 #pragma omp parallel for schedule(static)
2346 for (i=0; i <= (ssize_t) MaxMap; i++)
2348 x_map[i].x=1.3584000f*(MagickRealType) i;
2349 y_map[i].x=0.0000000f;
2350 z_map[i].x=1.8215000f*((MagickRealType) i-(MagickRealType)
2351 ScaleQuantumToMap(ScaleCharToQuantum(137)));
2352 x_map[i].y=1.3584000f*(MagickRealType) i;
2353 y_map[i].y=(-0.4302726f)*((MagickRealType) i-(MagickRealType)
2354 ScaleQuantumToMap(ScaleCharToQuantum(156)));
2355 z_map[i].y=(-0.9271435f)*((MagickRealType) i-(MagickRealType)
2356 ScaleQuantumToMap(ScaleCharToQuantum(137)));
2357 x_map[i].z=1.3584000f*(MagickRealType) i;
2358 y_map[i].z=2.2179000f*((MagickRealType) i-(MagickRealType)
2359 ScaleQuantumToMap(ScaleCharToQuantum(156)));
2360 z_map[i].z=0.0000000f;
2367 Initialize YIQ tables:
2369 R = Y+0.95620*I+0.62140*Q
2370 G = Y-0.27270*I-0.64680*Q
2371 B = Y-1.10370*I+1.70060*Q
2373 I and Q, normally -0.5 through 0.5, must be normalized to the range 0
2374 through QuantumRange.
2376 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2377 #pragma omp parallel for schedule(static)
2379 for (i=0; i <= (ssize_t) MaxMap; i++)
2381 x_map[i].x=(MagickRealType) i;
2382 y_map[i].x=0.47810f*(2.00000f*(MagickRealType) i-(MagickRealType)
2384 z_map[i].x=0.31070f*(2.00000f*(MagickRealType) i-(MagickRealType)
2386 x_map[i].y=(MagickRealType) i;
2387 y_map[i].y=(-0.13635f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2389 z_map[i].y=(-0.32340f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2391 x_map[i].z=(MagickRealType) i;
2392 y_map[i].z=(-0.55185f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2394 z_map[i].z=0.85030f*(2.00000f*(MagickRealType) i-(MagickRealType)
2399 case YPbPrColorspace:
2402 Initialize YPbPr tables:
2405 G = Y-0.344136*C1+0.714136*C2
2408 Pb and Pr, normally -0.5 through 0.5, must be normalized to the range 0
2409 through QuantumRange.
2411 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2412 #pragma omp parallel for schedule(static)
2414 for (i=0; i <= (ssize_t) MaxMap; i++)
2416 x_map[i].x=(MagickRealType) i;
2417 y_map[i].x=0.000000f;
2418 z_map[i].x=0.701000f*(2.00000f*(MagickRealType) i-(MagickRealType)
2420 x_map[i].y=(MagickRealType) i;
2421 y_map[i].y=(-0.172068f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2423 z_map[i].y=0.357068f*(2.00000f*(MagickRealType) i-(MagickRealType)
2425 x_map[i].z=(MagickRealType) i;
2426 y_map[i].z=0.88600f*(2.00000f*(MagickRealType) i-(MagickRealType)
2428 z_map[i].z=0.00000f;
2435 Initialize YUV tables:
2438 G = Y-0.39380*U-0.58050*V
2441 U and V, normally -0.5 through 0.5, must be normalized to the range 0
2442 through QuantumRange.
2444 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2445 #pragma omp parallel for schedule(static)
2447 for (i=0; i <= (ssize_t) MaxMap; i++)
2449 x_map[i].x=(MagickRealType) i;
2450 y_map[i].x=0.00000f;
2451 z_map[i].x=0.56990f*(2.0000f*(MagickRealType) i-(MagickRealType)
2453 x_map[i].y=(MagickRealType) i;
2454 y_map[i].y=(-0.19690f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2456 z_map[i].y=(-0.29025f)*(2.00000f*(MagickRealType) i-(MagickRealType)
2458 x_map[i].z=(MagickRealType) i;
2459 y_map[i].z=1.01395f*(2.00000f*(MagickRealType) i-(MagickRealType)
2461 z_map[i].z=0.00000f;
2468 Linear conversion tables.
2470 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2471 #pragma omp parallel for schedule(static)
2473 for (i=0; i <= (ssize_t) MaxMap; i++)
2475 x_map[i].x=(MagickRealType) i;
2479 y_map[i].y=(MagickRealType) i;
2483 z_map[i].z=(MagickRealType) i;
2491 switch (image->storage_class)
2497 Convert DirectClass image.
2499 image_view=AcquireCacheView(image);
2500 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2501 #pragma omp parallel for schedule(static,4) shared(status)
2503 for (y=0; y < (ssize_t) image->rows; y++)
2517 if (status == MagickFalse)
2519 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2521 if (q == (Quantum *) NULL)
2526 for (x=0; x < (ssize_t) image->columns; x++)
2533 red=ScaleQuantumToMap(GetPixelRed(image,q));
2534 green=ScaleQuantumToMap(GetPixelGreen(image,q));
2535 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
2536 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2537 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2538 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2543 #if !defined(MAGICKCORE_HDRI_SUPPORT)
2544 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2546 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2548 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2553 case sRGBColorspace:
2555 if ((QuantumScale*pixel.red) <= 0.0031308)
2558 pixel.red=(MagickRealType) QuantumRange*(1.055*
2559 pow(QuantumScale*pixel.red,(1.0/2.4))-0.055);
2560 if ((QuantumScale*pixel.green) <= 0.0031308)
2561 pixel.green*=12.92f;
2563 pixel.green=(MagickRealType) QuantumRange*(1.055*
2564 pow(QuantumScale*pixel.green,(1.0/2.4))-0.055);
2565 if ((QuantumScale*pixel.blue) <= 0.0031308)
2568 pixel.blue=(MagickRealType) QuantumRange*(1.055*
2569 pow(QuantumScale*pixel.blue,(1.0/2.4))-0.055);
2575 SetPixelRed(image,ScaleMapToQuantum((MagickRealType) MaxMap*
2576 QuantumScale*pixel.red),q);
2577 SetPixelGreen(image,ScaleMapToQuantum((MagickRealType) MaxMap*
2578 QuantumScale*pixel.green),q);
2579 SetPixelBlue(image,ScaleMapToQuantum((MagickRealType) MaxMap*
2580 QuantumScale*pixel.blue),q);
2581 q+=GetPixelChannels(image);
2583 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2584 if (sync == MagickFalse)
2586 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2591 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2592 #pragma omp critical (MagickCore_TransformRGBImage)
2594 proceed=SetImageProgress(image,TransformRGBImageTag,progress++,
2596 if (proceed == MagickFalse)
2600 image_view=DestroyCacheView(image_view);
2606 Convert PseudoClass image.
2608 image_view=AcquireCacheView(image);
2609 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2610 #pragma omp parallel for schedule(static,4) shared(status)
2612 for (i=0; i < (ssize_t) image->colors; i++)
2622 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
2623 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
2624 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
2625 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2626 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2627 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2632 #if !defined(MAGICKCORE_HDRI_SUPPORT)
2633 image->colormap[i].red=(double) (QuantumRange*YCCMap[
2634 RoundToYCC(1024.0*QuantumScale*pixel.red)]);
2635 image->colormap[i].green=(double) (QuantumRange*YCCMap[
2636 RoundToYCC(1024.0*QuantumScale*pixel.green)]);
2637 image->colormap[i].blue=(double) (QuantumRange*YCCMap[
2638 RoundToYCC(1024.0*QuantumScale*pixel.blue)]);
2642 case sRGBColorspace:
2644 if ((QuantumScale*pixel.red) <= 0.0031308)
2647 pixel.red=(MagickRealType) QuantumRange*(1.055*pow(QuantumScale*
2648 pixel.red,(1.0/2.4))-0.055);
2649 if ((QuantumScale*pixel.green) <= 0.0031308)
2650 pixel.green*=12.92f;
2652 pixel.green=(MagickRealType) QuantumRange*(1.055*pow(QuantumScale*
2653 pixel.green,(1.0/2.4))-0.055);
2654 if ((QuantumScale*pixel.blue) <= 0.0031308)
2657 pixel.blue=(MagickRealType) QuantumRange*(1.055*pow(QuantumScale*
2658 pixel.blue,(1.0/2.4))-0.055);
2662 image->colormap[i].red=(double) ScaleMapToQuantum((MagickRealType)
2663 MaxMap*QuantumScale*pixel.red);
2664 image->colormap[i].green=(double) ScaleMapToQuantum((MagickRealType)
2665 MaxMap*QuantumScale*pixel.green);
2666 image->colormap[i].blue=(double) ScaleMapToQuantum((MagickRealType)
2667 MaxMap*QuantumScale*pixel.blue);
2672 image_view=DestroyCacheView(image_view);
2673 (void) SyncImage(image,exception);
2678 Relinquish resources.
2680 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2681 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2682 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2683 if (SetImageColorspace(image,RGBColorspace,exception) == MagickFalse)
2684 return(MagickFalse);