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/pixel-private.h"
62 #include "MagickCore/quantize.h"
63 #include "MagickCore/quantum.h"
64 #include "MagickCore/quantum-private.h"
65 #include "MagickCore/resource_.h"
66 #include "MagickCore/string_.h"
67 #include "MagickCore/string-private.h"
68 #include "MagickCore/utility.h"
73 typedef struct _TransformPacket
84 static MagickBooleanType
85 TransformsRGBImage(Image *,const ColorspaceType,ExceptionInfo *);
88 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
92 + s R G B T r a n s f o r m I m a g e %
96 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
98 % sRGBTransformImage() converts the reference image from sRGB to an alternate
99 % colorspace. The transformation matrices are not the standard ones: the
100 % weights are rescaled to normalized the range of the transformed values to
101 % be [0..QuantumRange].
103 % The format of the sRGBTransformImage method is:
105 % MagickBooleanType sRGBTransformImage(Image *image,
106 % const ColorspaceType colorspace,EsceptionInfo *exception)
108 % A description of each parameter follows:
110 % o image: the image.
112 % o colorspace: the colorspace to transform the image to.
114 % o exception: return any errors or warnings in this structure.
118 static inline void ConvertsRGBToXYZ(const Quantum red,const Quantum green,
119 const Quantum blue,double *X,double *Y,double *Z)
126 assert(X != (double *) NULL);
127 assert(Y != (double *) NULL);
128 assert(Z != (double *) NULL);
129 r=DecompandsRGB(QuantumScale*red);
130 g=DecompandsRGB(QuantumScale*green);
131 b=DecompandsRGB(QuantumScale*blue);
132 *X=0.4360747*r+0.3850649*g+0.1430804*b;
133 *Y=0.2225045*r+0.7168786*g+0.0606169*b;
134 *Z=0.0139322*r+0.0971045*g+0.7141733*b;
137 static inline void ConvertXYZToLab(const double X,const double Y,const double Z,
138 double *L,double *a,double *b)
140 #define D50X (0.964221)
142 #define D50Z (0.825211)
143 #define CIEEpsilon (216.0/24389.0)
144 #define CIEK (24389.0/27.0)
151 assert(L != (double *) NULL);
152 assert(a != (double *) NULL);
153 assert(b != (double *) NULL);
154 if ((X/D50X) > CIEEpsilon)
155 x=pow(X/D50X,1.0/3.0);
157 x=(CIEK*X/D50X+16.0)/116.0;
158 if ((Y/D50Y) > CIEEpsilon)
159 y=pow(Y/D50Y,1.0/3.0);
161 y=(CIEK*Y/D50Y+16.0)/116.0;
162 if ((Z/D50Z) > CIEEpsilon)
163 z=pow(Z/D50Z,1.0/3.0);
165 z=(CIEK*Z/D50Z+16.0)/116.0;
166 *L=((116.0*y)-16.0)/100.0;
167 *a=(500.0*(x-y))/255.0;
170 *b=(200.0*(y-z))/255.0;
175 static MagickBooleanType sRGBTransformImage(Image *image,
176 const ColorspaceType colorspace,ExceptionInfo *exception)
178 #define sRGBTransformImageTag "RGBTransform/Image"
203 assert(image != (Image *) NULL);
204 assert(image->signature == MagickSignature);
205 if (image->debug != MagickFalse)
206 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
207 assert(colorspace != sRGBColorspace);
208 assert(colorspace != TransparentColorspace);
209 assert(colorspace != UndefinedColorspace);
217 Convert RGB to CMY colorspace.
219 if (image->storage_class == PseudoClass)
221 if (SyncImage(image,exception) == MagickFalse)
223 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
226 image_view=AcquireAuthenticCacheView(image,exception);
227 #if defined(MAGICKCORE_OPENMP_SUPPORT)
228 #pragma omp parallel for schedule(static,4) shared(status) \
229 dynamic_number_threads(image,image->columns,image->rows,1)
231 for (y=0; y < (ssize_t) image->rows; y++)
242 if (status == MagickFalse)
244 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
246 if (q == (Quantum *) NULL)
251 for (x=0; x < (ssize_t) image->columns; x++)
258 cyan=QuantumRange*DecompandsRGB(QuantumScale*
259 GetPixelCyan(image,q));
260 magenta=QuantumRange*DecompandsRGB(QuantumScale*
261 GetPixelMagenta(image,q));
262 yellow=QuantumRange*DecompandsRGB(QuantumScale*
263 GetPixelYellow(image,q));
264 SetPixelCyan(image,ClampToQuantum((MagickRealType) (QuantumRange-
266 SetPixelMagenta(image,ClampToQuantum((MagickRealType) (QuantumRange-
268 SetPixelYellow(image,ClampToQuantum((MagickRealType) (QuantumRange-
270 q+=GetPixelChannels(image);
272 sync=SyncCacheViewAuthenticPixels(image_view,exception);
273 if (sync == MagickFalse)
276 image_view=DestroyCacheView(image_view);
277 image->type=image->matte == MagickFalse ? ColorSeparationType :
278 ColorSeparationMatteType;
279 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
289 Convert RGB to CMYK colorspace.
291 if (image->storage_class == PseudoClass)
293 if (SyncImage(image,exception) == MagickFalse)
295 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
298 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
300 GetPixelInfo(image,&zero);
301 image_view=AcquireAuthenticCacheView(image,exception);
302 #if defined(MAGICKCORE_OPENMP_SUPPORT)
303 #pragma omp parallel for schedule(static,4) shared(status) \
304 dynamic_number_threads(image,image->columns,image->rows,1)
306 for (y=0; y < (ssize_t) image->rows; y++)
320 if (status == MagickFalse)
322 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
324 if (q == (Quantum *) NULL)
330 for (x=0; x < (ssize_t) image->columns; x++)
332 GetPixelInfoPixel(image,q,&pixel);
333 ConvertsRGBToCMYK(&pixel);
334 SetPixelInfoPixel(image,&pixel,q);
335 q+=GetPixelChannels(image);
337 sync=SyncCacheViewAuthenticPixels(image_view,exception);
338 if (sync == MagickFalse)
341 image_view=DestroyCacheView(image_view);
342 image->type=image->matte == MagickFalse ? ColorSeparationType :
343 ColorSeparationMatteType;
344 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
349 case Rec601LumaColorspace:
352 Transform image from sRGB to GRAY.
354 if (image->storage_class == PseudoClass)
356 if (SyncImage(image,exception) == MagickFalse)
358 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
361 image_view=AcquireAuthenticCacheView(image,exception);
362 #if defined(MAGICKCORE_OPENMP_SUPPORT)
363 #pragma omp parallel for schedule(static,4) shared(status) \
364 dynamic_number_threads(image,image->columns,image->rows,1)
366 for (y=0; y < (ssize_t) image->rows; y++)
377 if (status == MagickFalse)
379 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
381 if (q == (Quantum *) NULL)
386 for (x=0; x < (ssize_t) image->columns; x++)
394 red=QuantumRange*DecompandsRGB(QuantumScale*GetPixelRed(image,q));
395 green=QuantumRange*DecompandsRGB(QuantumScale*GetPixelGreen(image,q));
396 blue=QuantumRange*DecompandsRGB(QuantumScale*GetPixelBlue(image,q));
397 gray=0.298839*red+0.586811*green+0.114350*blue;
398 SetPixelGray(image,ClampToQuantum(gray),q);
399 q+=GetPixelChannels(image);
401 sync=SyncCacheViewAuthenticPixels(image_view,exception);
402 if (sync == MagickFalse)
405 image_view=DestroyCacheView(image_view);
406 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
408 image->type=GrayscaleType;
414 Transform image from sRGB to HSB.
416 if (image->storage_class == PseudoClass)
418 if (SyncImage(image,exception) == MagickFalse)
420 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
423 image_view=AcquireAuthenticCacheView(image,exception);
424 #if defined(MAGICKCORE_OPENMP_SUPPORT)
425 #pragma omp parallel for schedule(static,4) shared(status) \
426 dynamic_number_threads(image,image->columns,image->rows,1)
428 for (y=0; y < (ssize_t) image->rows; y++)
444 if (status == MagickFalse)
446 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
448 if (q == (Quantum *) NULL)
456 for (x=0; x < (ssize_t) image->columns; x++)
458 ConvertsRGBToHSB((double) GetPixelRed(image,q),
459 (double) GetPixelGreen(image,q),(double) GetPixelBlue(image,q),
460 &hue,&saturation,&brightness);
461 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
463 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
465 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
467 q+=GetPixelChannels(image);
469 sync=SyncCacheViewAuthenticPixels(image_view,exception);
470 if (sync == MagickFalse)
473 image_view=DestroyCacheView(image_view);
474 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
481 Transform image from sRGB to HSL.
483 if (image->storage_class == PseudoClass)
485 if (SyncImage(image,exception) == MagickFalse)
487 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
490 image_view=AcquireAuthenticCacheView(image,exception);
491 #if defined(MAGICKCORE_OPENMP_SUPPORT)
492 #pragma omp parallel for schedule(static,4) shared(status) \
493 dynamic_number_threads(image,image->columns,image->rows,1)
495 for (y=0; y < (ssize_t) image->rows; y++)
511 if (status == MagickFalse)
513 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
515 if (q == (Quantum *) NULL)
523 for (x=0; x < (ssize_t) image->columns; x++)
525 ConvertsRGBToHSL((double) GetPixelRed(image,q),(double)
526 GetPixelGreen(image,q),(double) GetPixelBlue(image,q),
527 &hue,&saturation,&lightness);
528 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
530 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
532 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
534 q+=GetPixelChannels(image);
536 sync=SyncCacheViewAuthenticPixels(image_view,exception);
537 if (sync == MagickFalse)
540 image_view=DestroyCacheView(image_view);
541 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
548 Transform image from sRGB to HWB.
550 if (image->storage_class == PseudoClass)
552 if (SyncImage(image,exception) == MagickFalse)
554 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
557 image_view=AcquireAuthenticCacheView(image,exception);
558 #if defined(MAGICKCORE_OPENMP_SUPPORT)
559 #pragma omp parallel for schedule(static,4) shared(status) \
560 dynamic_number_threads(image,image->columns,image->rows,1)
562 for (y=0; y < (ssize_t) image->rows; y++)
578 if (status == MagickFalse)
580 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
582 if (q == (Quantum *) NULL)
590 for (x=0; x < (ssize_t) image->columns; x++)
592 ConvertsRGBToHWB((double) GetPixelRed(image,q),(double)
593 GetPixelGreen(image,q),(double) GetPixelBlue(image,q),
594 &hue,&whiteness,&blackness);
595 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
597 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
599 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
601 q+=GetPixelChannels(image);
603 sync=SyncCacheViewAuthenticPixels(image_view,exception);
604 if (sync == MagickFalse)
607 image_view=DestroyCacheView(image_view);
608 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
615 Transform image from sRGB to Lab.
617 if (image->storage_class == PseudoClass)
619 if (SyncImage(image,exception) == MagickFalse)
621 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
624 image_view=AcquireAuthenticCacheView(image,exception);
625 #if defined(MAGICKCORE_OPENMP_SUPPORT)
626 #pragma omp parallel for schedule(static,4) shared(status) \
627 dynamic_number_threads(image,image->columns,image->rows,1)
629 for (y=0; y < (ssize_t) image->rows; y++)
648 if (status == MagickFalse)
650 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
652 if (q == (Quantum *) NULL)
663 for (x=0; x < (ssize_t) image->columns; x++)
665 ConvertsRGBToXYZ(GetPixelRed(image,q),GetPixelGreen(image,q),
666 GetPixelBlue(image,q),&X,&Y,&Z);
667 ConvertXYZToLab(X,Y,Z,&L,&a,&b);
668 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
670 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
672 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
674 q+=GetPixelChannels(image);
676 sync=SyncCacheViewAuthenticPixels(image_view,exception);
677 if (sync == MagickFalse)
680 image_view=DestroyCacheView(image_view);
681 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
687 #define DisplayGamma (1.0/1.7)
688 #define FilmGamma 0.6
689 #define ReferenceBlack 95.0
690 #define ReferenceWhite 685.0
707 Transform RGB to Log colorspace.
709 density=DisplayGamma;
711 value=GetImageProperty(image,"gamma",exception);
712 if (value != (const char *) NULL)
713 gamma=MagickEpsilonReciprocal(StringToDouble(value,(char **) NULL));
714 film_gamma=FilmGamma;
715 value=GetImageProperty(image,"film-gamma",exception);
716 if (value != (const char *) NULL)
717 film_gamma=StringToDouble(value,(char **) NULL);
718 reference_black=ReferenceBlack;
719 value=GetImageProperty(image,"reference-black",exception);
720 if (value != (const char *) NULL)
721 reference_black=StringToDouble(value,(char **) NULL);
722 reference_white=ReferenceWhite;
723 value=GetImageProperty(image,"reference-white",exception);
724 if (value != (const char *) NULL)
725 reference_white=StringToDouble(value,(char **) NULL);
726 logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
728 if (logmap == (Quantum *) NULL)
729 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
731 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*
733 #if defined(MAGICKCORE_OPENMP_SUPPORT)
734 #pragma omp parallel for schedule(static) \
735 dynamic_number_threads(image,image->columns,1,1)
737 for (i=0; i <= (ssize_t) MaxMap; i++)
738 logmap[i]=ScaleMapToQuantum((MagickRealType) (MaxMap*(reference_white+
739 log10(black+((MagickRealType) i/MaxMap)*(1.0-black))/((gamma/density)*
740 0.002/film_gamma))/1024.0));
741 image_view=AcquireAuthenticCacheView(image,exception);
742 #if defined(MAGICKCORE_OPENMP_SUPPORT)
743 #pragma omp parallel for schedule(static,4) shared(status) \
744 dynamic_number_threads(image,image->columns,image->rows,1)
746 for (y=0; y < (ssize_t) image->rows; y++)
757 if (status == MagickFalse)
759 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
761 if (q == (Quantum *) NULL)
766 for (x=(ssize_t) image->columns; x != 0; x--)
773 red=QuantumRange*DecompandsRGB(QuantumScale*GetPixelRed(image,q));
774 green=QuantumRange*DecompandsRGB(QuantumScale*GetPixelGreen(image,q));
775 blue=QuantumRange*DecompandsRGB(QuantumScale*GetPixelBlue(image,q));
776 SetPixelRed(image,logmap[ScaleQuantumToMap(
777 ClampToQuantum(red))],q);
778 SetPixelGreen(image,logmap[ScaleQuantumToMap(
779 ClampToQuantum(green))],q);
780 SetPixelBlue(image,logmap[ScaleQuantumToMap(
781 ClampToQuantum(blue))],q);
782 q+=GetPixelChannels(image);
784 sync=SyncCacheViewAuthenticPixels(image_view,exception);
785 if (sync == MagickFalse)
788 image_view=DestroyCacheView(image_view);
789 logmap=(Quantum *) RelinquishMagickMemory(logmap);
790 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
794 case Rec709LumaColorspace:
797 Transform image from sRGB to Rec709Luma.
799 if (image->storage_class == PseudoClass)
801 if (SyncImage(image,exception) == MagickFalse)
803 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
806 image_view=AcquireAuthenticCacheView(image,exception);
807 #if defined(MAGICKCORE_OPENMP_SUPPORT)
808 #pragma omp parallel for schedule(static,4) shared(status) \
809 dynamic_number_threads(image,image->columns,image->rows,1)
811 for (y=0; y < (ssize_t) image->rows; y++)
822 if (status == MagickFalse)
824 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
826 if (q == (Quantum *) NULL)
831 for (x=0; x < (ssize_t) image->columns; x++)
839 red=QuantumRange*DecompandsRGB(QuantumScale*GetPixelRed(image,q));
840 green=QuantumRange*DecompandsRGB(QuantumScale*GetPixelGreen(image,q));
841 blue=QuantumRange*DecompandsRGB(QuantumScale*GetPixelBlue(image,q));
842 gray=0.212600*red+0.715200*green+0.072200*blue;
843 SetPixelGray(image,ClampToQuantum(gray),q);
844 q+=GetPixelChannels(image);
846 sync=SyncCacheViewAuthenticPixels(image_view,exception);
847 if (sync == MagickFalse)
850 image_view=DestroyCacheView(image_view);
851 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
853 image->type=GrayscaleType;
859 Transform image from sRGB to linear RGB.
861 if (image->storage_class == PseudoClass)
863 if (SyncImage(image,exception) == MagickFalse)
865 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
868 image_view=AcquireAuthenticCacheView(image,exception);
869 #if defined(MAGICKCORE_OPENMP_SUPPORT)
870 #pragma omp parallel for schedule(static,4) shared(status) \
871 dynamic_number_threads(image,image->columns,image->rows,1)
873 for (y=0; y < (ssize_t) image->rows; y++)
884 if (status == MagickFalse)
886 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
888 if (q == (Quantum *) NULL)
893 for (x=0; x < (ssize_t) image->columns; x++)
900 red=QuantumRange*DecompandsRGB(QuantumScale*GetPixelRed(image,q));
901 green=QuantumRange*DecompandsRGB(QuantumScale*GetPixelGreen(image,q));
902 blue=QuantumRange*DecompandsRGB(QuantumScale*GetPixelBlue(image,q));
903 SetPixelRed(image,ClampToQuantum(red),q);
904 SetPixelGreen(image,ClampToQuantum(green),q);
905 SetPixelBlue(image,ClampToQuantum(blue),q);
906 q+=GetPixelChannels(image);
908 sync=SyncCacheViewAuthenticPixels(image_view,exception);
909 if (sync == MagickFalse)
912 image_view=DestroyCacheView(image_view);
913 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
920 Transform image from sRGB to XYZ.
922 if (image->storage_class == PseudoClass)
924 if (SyncImage(image,exception) == MagickFalse)
926 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
929 image_view=AcquireAuthenticCacheView(image,exception);
930 #if defined(MAGICKCORE_OPENMP_SUPPORT)
931 #pragma omp parallel for schedule(static,4) shared(status) \
932 dynamic_number_threads(image,image->columns,image->rows,1)
934 for (y=0; y < (ssize_t) image->rows; y++)
950 if (status == MagickFalse)
952 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
954 if (q == (Quantum *) NULL)
962 for (x=0; x < (ssize_t) image->columns; x++)
964 ConvertsRGBToXYZ(GetPixelRed(image,q),GetPixelGreen(image,q),
965 GetPixelBlue(image,q),&X,&Y,&Z);
966 SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*X),q);
967 SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*Y),
969 SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*Z),q);
970 q+=GetPixelChannels(image);
972 sync=SyncCacheViewAuthenticPixels(image_view,exception);
973 if (sync == MagickFalse)
976 image_view=DestroyCacheView(image_view);
977 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
987 x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
989 y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
991 z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
993 if ((x_map == (TransformPacket *) NULL) ||
994 (y_map == (TransformPacket *) NULL) ||
995 (z_map == (TransformPacket *) NULL))
996 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
998 (void) ResetMagickMemory(&primary_info,0,sizeof(primary_info));
1001 case OHTAColorspace:
1004 Initialize OHTA tables:
1006 I1 = 0.33333*R+0.33334*G+0.33333*B
1007 I2 = 0.50000*R+0.00000*G-0.50000*B
1008 I3 =-0.25000*R+0.50000*G-0.25000*B
1010 I and Q, normally -0.5 through 0.5, are normalized to the range 0
1011 through QuantumRange.
1013 primary_info.y=(double) (MaxMap+1.0)/2.0;
1014 primary_info.z=(double) (MaxMap+1.0)/2.0;
1015 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1016 #pragma omp parallel for schedule(static) \
1017 dynamic_number_threads(image,image->columns,1,1)
1019 for (i=0; i <= (ssize_t) MaxMap; i++)
1021 x_map[i].x=0.33333*(MagickRealType) i;
1022 y_map[i].x=0.33334*(MagickRealType) i;
1023 z_map[i].x=0.33333*(MagickRealType) i;
1024 x_map[i].y=0.50000*(MagickRealType) i;
1025 y_map[i].y=0.00000*(MagickRealType) i;
1026 z_map[i].y=(-0.50000)*(MagickRealType) i;
1027 x_map[i].z=(-0.25000)*(MagickRealType) i;
1028 y_map[i].z=0.50000*(MagickRealType) i;
1029 z_map[i].z=(-0.25000)*(MagickRealType) i;
1033 case Rec601YCbCrColorspace:
1034 case YCbCrColorspace:
1037 Initialize YCbCr tables (ITU-R BT.601):
1039 Y = 0.298839*R+0.586811*G+0.114350*B
1040 Cb= -0.168736*R-0.331264*G+0.500000*B
1041 Cr= 0.500000*R-0.418688*G-0.081312*B
1043 Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
1044 through QuantumRange.
1046 primary_info.y=(double) (MaxMap+1.0)/2.0;
1047 primary_info.z=(double) (MaxMap+1.0)/2.0;
1048 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1049 #pragma omp parallel for schedule(static) \
1050 dynamic_number_threads(image,image->columns,1,1)
1052 for (i=0; i <= (ssize_t) MaxMap; i++)
1054 x_map[i].x=0.298839*(MagickRealType) i;
1055 y_map[i].x=0.586811*(MagickRealType) i;
1056 z_map[i].x=0.114350*(MagickRealType) i;
1057 x_map[i].y=(-0.168730)*(MagickRealType) i;
1058 y_map[i].y=(-0.331264)*(MagickRealType) i;
1059 z_map[i].y=0.500000*(MagickRealType) i;
1060 x_map[i].z=0.500000*(MagickRealType) i;
1061 y_map[i].z=(-0.418688)*(MagickRealType) i;
1062 z_map[i].z=(-0.081312)*(MagickRealType) i;
1066 case Rec709YCbCrColorspace:
1069 Initialize YCbCr tables (ITU-R BT.709):
1071 Y = 0.212600*R+0.715200*G+0.072200*B
1072 Cb= -0.114572*R-0.385428*G+0.500000*B
1073 Cr= 0.500000*R-0.454153*G-0.045847*B
1075 Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
1076 through QuantumRange.
1078 primary_info.y=(double) (MaxMap+1.0)/2.0;
1079 primary_info.z=(double) (MaxMap+1.0)/2.0;
1080 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1081 #pragma omp parallel for schedule(static) \
1082 dynamic_number_threads(image,image->columns,1,1)
1084 for (i=0; i <= (ssize_t) MaxMap; i++)
1086 x_map[i].x=0.212600*(MagickRealType) i;
1087 y_map[i].x=0.715200*(MagickRealType) i;
1088 z_map[i].x=0.072200*(MagickRealType) i;
1089 x_map[i].y=(-0.114572)*(MagickRealType) i;
1090 y_map[i].y=(-0.385428)*(MagickRealType) i;
1091 z_map[i].y=0.500000*(MagickRealType) i;
1092 x_map[i].z=0.500000*(MagickRealType) i;
1093 y_map[i].z=(-0.454153)*(MagickRealType) i;
1094 z_map[i].z=(-0.045847)*(MagickRealType) i;
1101 Initialize YCC tables:
1103 Y = 0.298839*R+0.586811*G+0.114350*B
1104 C1= -0.298839*R-0.586811*G+0.88600*B
1105 C2= 0.70100*R-0.586811*G-0.114350*B
1107 YCC is scaled by 1.3584. C1 zero is 156 and C2 is at 137.
1109 primary_info.y=(double) ScaleQuantumToMap(ScaleCharToQuantum(156));
1110 primary_info.z=(double) ScaleQuantumToMap(ScaleCharToQuantum(137));
1111 for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
1113 x_map[i].x=0.003962014134275617*(MagickRealType) i;
1114 y_map[i].x=0.007778268551236748*(MagickRealType) i;
1115 z_map[i].x=0.001510600706713781*(MagickRealType) i;
1116 x_map[i].y=(-0.002426619775463276)*(MagickRealType) i;
1117 y_map[i].y=(-0.004763965913702149)*(MagickRealType) i;
1118 z_map[i].y=0.007190585689165425*(MagickRealType) i;
1119 x_map[i].z=0.006927257754597858*(MagickRealType) i;
1120 y_map[i].z=(-0.005800713697502058)*(MagickRealType) i;
1121 z_map[i].z=(-0.0011265440570958)*(MagickRealType) i;
1123 for ( ; i <= (ssize_t) MaxMap; i++)
1125 x_map[i].x=0.2201118963486454*(1.099*(MagickRealType) i-0.099);
1126 y_map[i].x=0.4321260306242638*(1.099*(MagickRealType) i-0.099);
1127 z_map[i].x=0.08392226148409894*(1.099*(MagickRealType) i-0.099);
1128 x_map[i].y=(-0.1348122097479598)*(1.099*(MagickRealType) i-0.099);
1129 y_map[i].y=(-0.2646647729834528)*(1.099*(MagickRealType) i-0.099);
1130 z_map[i].y=0.3994769827314126*(1.099*(MagickRealType) i-0.099);
1131 x_map[i].z=0.3848476530332144*(1.099*(MagickRealType) i-0.099);
1132 y_map[i].z=(-0.3222618720834477)*(1.099*(MagickRealType) i-0.099);
1133 z_map[i].z=(-0.06258578094976668)*(1.099*(MagickRealType) i-0.099);
1140 Initialize YIQ tables:
1142 Y = 0.298839*R+0.586811*G+0.114350*B
1143 I = 0.59600*R-0.27400*G-0.32200*B
1144 Q = 0.21100*R-0.52300*G+0.31200*B
1146 I and Q, normally -0.5 through 0.5, are normalized to the range 0
1147 through QuantumRange.
1149 primary_info.y=(double) (MaxMap+1.0)/2.0;
1150 primary_info.z=(double) (MaxMap+1.0)/2.0;
1151 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1152 #pragma omp parallel for schedule(static) \
1153 dynamic_number_threads(image,image->columns,1,1)
1155 for (i=0; i <= (ssize_t) MaxMap; i++)
1157 x_map[i].x=0.298839*(MagickRealType) i;
1158 y_map[i].x=0.586811*(MagickRealType) i;
1159 z_map[i].x=0.114350*(MagickRealType) i;
1160 x_map[i].y=0.59600*(MagickRealType) i;
1161 y_map[i].y=(-0.27400)*(MagickRealType) i;
1162 z_map[i].y=(-0.32200)*(MagickRealType) i;
1163 x_map[i].z=0.21100*(MagickRealType) i;
1164 y_map[i].z=(-0.52300)*(MagickRealType) i;
1165 z_map[i].z=0.31200*(MagickRealType) i;
1169 case YPbPrColorspace:
1172 Initialize YPbPr tables (ITU-R BT.601):
1174 Y = 0.298839*R+0.586811*G+0.114350*B
1175 Pb= -0.168736*R-0.331264*G+0.500000*B
1176 Pr= 0.500000*R-0.418688*G-0.081312*B
1178 Pb and Pr, normally -0.5 through 0.5, are normalized to the range 0
1179 through QuantumRange.
1181 primary_info.y=(double) (MaxMap+1.0)/2.0;
1182 primary_info.z=(double) (MaxMap+1.0)/2.0;
1183 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1184 #pragma omp parallel for schedule(static) \
1185 dynamic_number_threads(image,image->columns,1,1)
1187 for (i=0; i <= (ssize_t) MaxMap; i++)
1189 x_map[i].x=0.298839*(MagickRealType) i;
1190 y_map[i].x=0.586811*(MagickRealType) i;
1191 z_map[i].x=0.114350*(MagickRealType) i;
1192 x_map[i].y=(-0.168736)*(MagickRealType) i;
1193 y_map[i].y=(-0.331264)*(MagickRealType) i;
1194 z_map[i].y=0.500000*(MagickRealType) i;
1195 x_map[i].z=0.500000*(MagickRealType) i;
1196 y_map[i].z=(-0.418688)*(MagickRealType) i;
1197 z_map[i].z=(-0.081312)*(MagickRealType) i;
1204 Initialize YUV tables:
1206 Y = 0.298839*R+0.586811*G+0.114350*B
1207 U = -0.14740*R-0.28950*G+0.43690*B
1208 V = 0.61500*R-0.51500*G-0.10000*B
1210 U and V, normally -0.5 through 0.5, are normalized to the range 0
1211 through QuantumRange. Note that U = 0.493*(B-Y), V = 0.877*(R-Y).
1213 primary_info.y=(double) (MaxMap+1.0)/2.0;
1214 primary_info.z=(double) (MaxMap+1.0)/2.0;
1215 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1216 #pragma omp parallel for schedule(static) \
1217 dynamic_number_threads(image,image->columns,1,1)
1219 for (i=0; i <= (ssize_t) MaxMap; i++)
1221 x_map[i].x=0.298839*(MagickRealType) i;
1222 y_map[i].x=0.586811*(MagickRealType) i;
1223 z_map[i].x=0.114350*(MagickRealType) i;
1224 x_map[i].y=(-0.14740)*(MagickRealType) i;
1225 y_map[i].y=(-0.28950)*(MagickRealType) i;
1226 z_map[i].y=0.43690*(MagickRealType) i;
1227 x_map[i].z=0.61500*(MagickRealType) i;
1228 y_map[i].z=(-0.51500)*(MagickRealType) i;
1229 z_map[i].z=(-0.10000)*(MagickRealType) i;
1236 Linear conversion tables.
1238 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1239 #pragma omp parallel for schedule(static) \
1240 dynamic_number_threads(image,image->columns,1,1)
1242 for (i=0; i <= (ssize_t) MaxMap; i++)
1244 x_map[i].x=(MagickRealType) i;
1248 y_map[i].y=(MagickRealType) i;
1252 z_map[i].z=(MagickRealType) i;
1260 switch (image->storage_class)
1266 Convert DirectClass image.
1268 image_view=AcquireAuthenticCacheView(image,exception);
1269 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1270 #pragma omp parallel for schedule(static,4) shared(status) \
1271 dynamic_number_threads(image,image->columns,image->rows,1)
1273 for (y=0; y < (ssize_t) image->rows; y++)
1287 register unsigned int
1292 if (status == MagickFalse)
1294 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1296 if (q == (Quantum *) NULL)
1301 for (x=0; x < (ssize_t) image->columns; x++)
1303 red=ScaleQuantumToMap(ClampToQuantum(QuantumRange*DecompandsRGB(
1304 QuantumScale*GetPixelRed(image,q))));
1305 green=ScaleQuantumToMap(ClampToQuantum(QuantumRange*DecompandsRGB(
1306 QuantumScale*GetPixelGreen(image,q))));
1307 blue=ScaleQuantumToMap(ClampToQuantum(QuantumRange*DecompandsRGB(
1308 QuantumScale*GetPixelBlue(image,q))));
1309 pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
1310 (MagickRealType) primary_info.x;
1311 pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
1312 (MagickRealType) primary_info.y;
1313 pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
1314 (MagickRealType) primary_info.z;
1315 SetPixelRed(image,ScaleMapToQuantum(pixel.red),q);
1316 SetPixelGreen(image,ScaleMapToQuantum(pixel.green),q);
1317 SetPixelBlue(image,ScaleMapToQuantum(pixel.blue),q);
1318 q+=GetPixelChannels(image);
1320 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1321 if (sync == MagickFalse)
1323 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1328 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1329 #pragma omp critical (MagickCore_sRGBTransformImage)
1331 proceed=SetImageProgress(image,sRGBTransformImageTag,progress++,
1333 if (proceed == MagickFalse)
1337 image_view=DestroyCacheView(image_view);
1342 register unsigned int
1348 Convert PseudoClass image.
1350 for (i=0; i < (ssize_t) image->colors; i++)
1355 red=ScaleQuantumToMap(ClampToQuantum(QuantumRange*DecompandsRGB(
1356 QuantumScale*image->colormap[i].red)));
1357 green=ScaleQuantumToMap(ClampToQuantum(QuantumRange*DecompandsRGB(
1358 QuantumScale*image->colormap[i].green)));
1359 blue=ScaleQuantumToMap(ClampToQuantum(QuantumRange*DecompandsRGB(
1360 QuantumScale*image->colormap[i].blue)));
1361 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
1362 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
1363 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1364 image->colormap[i].red=(double) ScaleMapToQuantum(pixel.red);
1365 image->colormap[i].green=(double) ScaleMapToQuantum(pixel.green);
1366 image->colormap[i].blue=(double) ScaleMapToQuantum(pixel.blue);
1368 (void) SyncImage(image,exception);
1373 Relinquish resources.
1375 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
1376 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
1377 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
1378 if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
1379 return(MagickFalse);
1384 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1388 % S e t I m a g e C o l o r s p a c e %
1392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1394 % SetImageColorspace() sets the colorspace member of the Image structure.
1396 % The format of the SetImageColorspace method is:
1398 % MagickBooleanType SetImageColorspace(Image *image,
1399 % const ColorspaceType colorspace,ExceptiionInfo *exception)
1401 % A description of each parameter follows:
1403 % o image: the image.
1405 % o colorspace: the colorspace.
1407 % o exception: return any errors or warnings in this structure.
1410 MagickExport MagickBooleanType SetImageColorspace(Image *image,
1411 const ColorspaceType colorspace,ExceptionInfo *exception)
1413 image->colorspace=colorspace;
1414 image->rendering_intent=UndefinedIntent;
1416 (void) ResetMagickMemory(&image->chromaticity,0,sizeof(image->chromaticity));
1417 if (IssRGBColorspace(colorspace) != MagickFalse)
1419 image->rendering_intent=PerceptualIntent;
1420 image->gamma=1.000/2.200;
1421 image->chromaticity.red_primary.x=0.6400;
1422 image->chromaticity.red_primary.y=0.3300;
1423 image->chromaticity.red_primary.z=0.0300;
1424 image->chromaticity.green_primary.x=0.3000;
1425 image->chromaticity.green_primary.y=0.6000;
1426 image->chromaticity.green_primary.z=0.1000;
1427 image->chromaticity.blue_primary.x=0.1500;
1428 image->chromaticity.blue_primary.y=0.0600;
1429 image->chromaticity.blue_primary.z=0.7900;
1430 image->chromaticity.white_point.x=0.3127;
1431 image->chromaticity.white_point.y=0.3290;
1432 image->chromaticity.white_point.z=0.3583f;
1434 if (IsGrayColorspace(colorspace) != MagickFalse)
1435 image->type=GrayscaleType;
1436 return(SyncImagePixelCache(image,exception));
1440 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1444 % T r a n s f o r m I m a g e C o l o r s p a c e %
1448 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1450 % TransformImageColorspace() transforms an image colorspace, changing the
1451 % image data to reflect the new colorspace.
1453 % The format of the TransformImageColorspace method is:
1455 % MagickBooleanType TransformImageColorspace(Image *image,
1456 % const ColorspaceType colorspace,ExceptionInfo *exception)
1458 % A description of each parameter follows:
1460 % o image: the image.
1462 % o colorspace: the colorspace.
1464 % o exception: return any errors or warnings in this structure.
1467 MagickExport MagickBooleanType TransformImageColorspace(Image *image,
1468 const ColorspaceType colorspace,ExceptionInfo *exception)
1473 assert(image != (Image *) NULL);
1474 assert(image->signature == MagickSignature);
1475 if (image->debug != MagickFalse)
1476 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1477 if (colorspace == UndefinedColorspace)
1478 return(SetImageColorspace(image,colorspace,exception));
1479 if (image->colorspace == colorspace)
1480 return(MagickTrue); /* same colorspace: no op */
1482 Convert the reference image from an alternate colorspace to sRGB.
1484 if (IssRGBColorspace(colorspace) != MagickFalse)
1485 return(TransformsRGBImage(image,colorspace,exception));
1487 if (IssRGBColorspace(image->colorspace) == MagickFalse)
1488 status=TransformsRGBImage(image,image->colorspace,exception);
1489 if (status == MagickFalse)
1492 Convert the reference image from sRGB to an alternate colorspace.
1494 if (sRGBTransformImage(image,colorspace,exception) == MagickFalse)
1500 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1504 + T r a n s f o r m s R G B I m a g e %
1508 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1510 % TransformsRGBImage() converts the reference image from an alternate
1511 % colorspace to sRGB. The transformation matrices are not the standard ones:
1512 % the weights are rescaled to normalize the range of the transformed values
1513 % to be [0..QuantumRange].
1515 % The format of the TransformsRGBImage method is:
1517 % MagickBooleanType TransformsRGBImage(Image *image,
1518 % const ColorspaceType colorspace,ExceptionInfo *exception)
1520 % A description of each parameter follows:
1522 % o image: the image.
1524 % o colorspace: the colorspace to transform the image to.
1526 % o exception: return any errors or warnings in this structure.
1530 static inline void ConvertLabToXYZ(const double L,const double a,const double b,
1531 double *X,double *Y,double *Z)
1538 assert(X != (double *) NULL);
1539 assert(Y != (double *) NULL);
1540 assert(Z != (double *) NULL);
1541 y=(100.0*L+16.0)/116.0;
1542 x=y+255.0*(a > 0.5 ? a-1.0 : a)/500.0;
1543 z=y-255.0*(b > 0.5 ? b-1.0 : b)/200.0;
1544 if (pow(x,3.0) > CIEEpsilon)
1547 x=(116.0*x-16.0)/CIEK;
1548 if (pow(y,3.0) > CIEEpsilon)
1552 if (pow(z,3.0) > CIEEpsilon)
1555 z=(116*z-16.0)/CIEK;
1561 static inline ssize_t RoundToYCC(const MagickRealType value)
1565 if (value >= 1388.0)
1567 return((ssize_t) (value+0.5));
1570 static inline void ConvertXYZTosRGB(const double x,const double y,
1571 const double z,Quantum *red,Quantum *green,Quantum *blue)
1579 Convert XYZ to sRGB colorspace.
1581 assert(red != (Quantum *) NULL);
1582 assert(green != (Quantum *) NULL);
1583 assert(blue != (Quantum *) NULL);
1584 r=3.1338561*x-1.6168667*y-0.4906146*z;
1585 g=(-0.9787684*x+1.9161415*y+0.0334540*z);
1586 b=0.0719453*x-0.2289914*y+1.4052427*z;
1587 *red=RoundToQuantum((MagickRealType) QuantumRange*CompandsRGB(r));
1588 *green=RoundToQuantum((MagickRealType) QuantumRange*CompandsRGB(g));
1589 *blue=RoundToQuantum((MagickRealType) QuantumRange*CompandsRGB(b));
1592 static inline void ConvertCMYKTosRGB(PixelInfo *pixel)
1594 pixel->red=QuantumRange*CompandsRGB(QuantumScale*(QuantumRange-
1595 (QuantumScale*pixel->red*(QuantumRange-pixel->black)+pixel->black)));
1596 pixel->green=QuantumRange*CompandsRGB(QuantumScale*(QuantumRange-
1597 (QuantumScale*pixel->green*(QuantumRange-pixel->black)+pixel->black)));
1598 pixel->blue=QuantumRange*CompandsRGB(QuantumScale*(QuantumRange-
1599 (QuantumScale*pixel->blue*(QuantumRange-pixel->black)+pixel->black)));
1602 static MagickBooleanType TransformsRGBImage(Image *image,
1603 const ColorspaceType colorspace,ExceptionInfo *exception)
1605 #define TransformsRGBImageTag "Transform/Image"
1607 #if !defined(MAGICKCORE_HDRI_SUPPORT)
1611 0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
1612 0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
1613 0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
1614 0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
1615 0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
1616 0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
1617 0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
1618 0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
1619 0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
1620 0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
1621 0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
1622 0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
1623 0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
1624 0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
1625 0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
1626 0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
1627 0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
1628 0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
1629 0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
1630 0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
1631 0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
1632 0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
1633 0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
1634 0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
1635 0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
1636 0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
1637 0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
1638 0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
1639 0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
1640 0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
1641 0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
1642 0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
1643 0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
1644 0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
1645 0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
1646 0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
1647 0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
1648 0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
1649 0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
1650 0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
1651 0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
1652 0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
1653 0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
1654 0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
1655 0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
1656 0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
1657 0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
1658 0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
1659 0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
1660 0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
1661 0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
1662 0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
1663 0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
1664 0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
1665 0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
1666 0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
1667 0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
1668 0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
1669 0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
1670 0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
1671 0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
1672 0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
1673 0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
1674 0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
1675 0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
1676 0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
1677 0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
1678 0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
1679 0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
1680 0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
1681 0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
1682 0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
1683 0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
1684 0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
1685 0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
1686 0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
1687 0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
1688 0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
1689 0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
1690 0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
1691 0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
1692 0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
1693 0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
1694 0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
1695 0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
1696 0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
1697 0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
1698 0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
1699 0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
1700 0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
1701 0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
1702 0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
1703 0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
1704 0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
1705 0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
1706 0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
1707 0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
1708 0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
1709 0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
1710 0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
1711 0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
1712 0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
1713 0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
1714 0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
1715 0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
1716 0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
1717 0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
1718 0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
1719 0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
1720 0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
1721 0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
1722 0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
1723 0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
1724 0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
1725 0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
1726 0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
1727 0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
1728 0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
1729 0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
1730 0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
1731 0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
1732 0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
1733 0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
1734 0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
1735 0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
1736 0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
1737 0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
1738 0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
1739 0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
1740 0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
1741 0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
1742 0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
1743 0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
1744 0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
1745 0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
1746 0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
1747 0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
1748 0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
1749 0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
1750 0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
1751 0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
1752 0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
1753 0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
1754 0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
1755 0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
1756 0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
1757 0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
1758 0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
1759 0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
1760 0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
1761 0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
1762 0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
1763 0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
1764 0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
1765 0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
1766 0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
1767 0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
1768 0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
1769 0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
1770 0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
1771 0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
1772 0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
1773 0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
1774 0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
1775 0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
1776 0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
1777 0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
1778 0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
1779 0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
1780 0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
1781 0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
1782 0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
1783 0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
1784 0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
1785 0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
1786 0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
1787 0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
1788 0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
1789 0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
1790 0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
1791 0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
1792 0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
1793 0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
1794 0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
1795 0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
1796 0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
1797 0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
1798 0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
1799 0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
1800 0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
1801 0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
1802 0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
1803 0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
1804 0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
1805 0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
1806 0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
1807 0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
1808 0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
1809 0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
1810 0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
1811 0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
1812 0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
1813 0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
1814 0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
1815 0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
1816 0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
1817 0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
1818 0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
1819 0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
1820 0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
1821 0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
1822 0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
1823 0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
1824 0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
1825 0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
1826 0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
1827 0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
1828 0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
1829 0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
1830 0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
1831 0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
1832 0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
1833 0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
1834 0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
1835 0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
1836 0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
1837 0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
1838 0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
1839 0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
1840 0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
1841 0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
1842 0.998559f, 0.999280f, 1.000000f
1866 assert(image != (Image *) NULL);
1867 assert(image->signature == MagickSignature);
1868 if (image->debug != MagickFalse)
1869 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1872 switch (image->colorspace)
1877 Transform image from CMY to sRGB.
1879 if (image->storage_class == PseudoClass)
1881 if (SyncImage(image,exception) == MagickFalse)
1882 return(MagickFalse);
1883 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1884 return(MagickFalse);
1886 image_view=AcquireAuthenticCacheView(image,exception);
1887 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1888 #pragma omp parallel for schedule(static,4) shared(status) \
1889 dynamic_number_threads(image,image->columns,image->rows,1)
1891 for (y=0; y < (ssize_t) image->rows; y++)
1902 if (status == MagickFalse)
1904 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1906 if (q == (Quantum *) NULL)
1911 for (x=0; x < (ssize_t) image->columns; x++)
1918 cyan=QuantumRange*CompandsRGB(QuantumScale*(QuantumRange-
1919 GetPixelCyan(image,q)));
1920 magenta=QuantumRange*CompandsRGB(QuantumScale*(QuantumRange-
1921 GetPixelMagenta(image,q)));
1922 yellow=QuantumRange*CompandsRGB(QuantumScale*(QuantumRange-
1923 GetPixelYellow(image,q)));
1924 SetPixelCyan(image,ClampToQuantum((MagickRealType) cyan),q);
1925 SetPixelMagenta(image,ClampToQuantum((MagickRealType) magenta),q);
1926 SetPixelYellow(image,ClampToQuantum((MagickRealType) yellow),q);
1927 q+=GetPixelChannels(image);
1929 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1930 if (sync == MagickFalse)
1933 image_view=DestroyCacheView(image_view);
1934 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
1935 return(MagickFalse);
1938 case CMYKColorspace:
1944 Transform image from CMYK to sRGB.
1946 if (image->storage_class == PseudoClass)
1948 if (SyncImage(image,exception) == MagickFalse)
1949 return(MagickFalse);
1950 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1951 return(MagickFalse);
1953 GetPixelInfo(image,&zero);
1954 image_view=AcquireAuthenticCacheView(image,exception);
1955 #if defined(MAGICKCORE_OPENMP_SUPPORT)
1956 #pragma omp parallel for schedule(static,4) shared(status) \
1957 dynamic_number_threads(image,image->columns,image->rows,1)
1959 for (y=0; y < (ssize_t) image->rows; y++)
1973 if (status == MagickFalse)
1975 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1977 if (q == (Quantum *) NULL)
1983 for (x=0; x < (ssize_t) image->columns; x++)
1985 GetPixelInfoPixel(image,q,&pixel);
1986 ConvertCMYKTosRGB(&pixel);
1987 SetPixelInfoPixel(image,&pixel,q);
1988 q+=GetPixelChannels(image);
1990 sync=SyncCacheViewAuthenticPixels(image_view,exception);
1991 if (sync == MagickFalse)
1994 image_view=DestroyCacheView(image_view);
1995 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
1996 return(MagickFalse);
1999 case GRAYColorspace:
2000 case Rec601LumaColorspace:
2001 case Rec709LumaColorspace:
2004 Transform linear GRAY to sRGB colorspace.
2006 if (image->storage_class == PseudoClass)
2008 if (SyncImage(image,exception) == MagickFalse)
2009 return(MagickFalse);
2010 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2011 return(MagickFalse);
2013 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2014 return(MagickFalse);
2015 image_view=AcquireAuthenticCacheView(image,exception);
2016 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2017 #pragma omp parallel for schedule(static,4) shared(status) \
2018 dynamic_number_threads(image,image->columns,image->rows,1)
2020 for (y=0; y < (ssize_t) image->rows; y++)
2031 if (status == MagickFalse)
2033 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2035 if (q == (Quantum *) NULL)
2040 for (x=(ssize_t) image->columns; x != 0; x--)
2045 gray=QuantumRange*CompandsRGB(QuantumScale*GetPixelGray(image,q));
2046 SetPixelRed(image,ClampToQuantum(gray),q);
2047 SetPixelGreen(image,ClampToQuantum(gray),q);
2048 SetPixelBlue(image,ClampToQuantum(gray),q);
2049 q+=GetPixelChannels(image);
2051 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2052 if (sync == MagickFalse)
2055 image_view=DestroyCacheView(image_view);
2056 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2057 return(MagickFalse);
2063 Transform image from HSB to sRGB.
2065 if (image->storage_class == PseudoClass)
2067 if (SyncImage(image,exception) == MagickFalse)
2068 return(MagickFalse);
2069 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2070 return(MagickFalse);
2072 image_view=AcquireAuthenticCacheView(image,exception);
2073 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2074 #pragma omp parallel for schedule(static,4) shared(status) \
2075 dynamic_number_threads(image,image->columns,image->rows,1)
2077 for (y=0; y < (ssize_t) image->rows; y++)
2093 if (status == MagickFalse)
2095 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2097 if (q == (Quantum *) NULL)
2102 for (x=0; x < (ssize_t) image->columns; x++)
2109 hue=(double) (QuantumScale*GetPixelRed(image,q));
2110 saturation=(double) (QuantumScale*GetPixelGreen(image,q));
2111 brightness=(double) (QuantumScale*GetPixelBlue(image,q));
2112 ConvertHSBTosRGB(hue,saturation,brightness,&red,&green,&blue);
2113 SetPixelRed(image,ClampToQuantum(red),q);
2114 SetPixelGreen(image,ClampToQuantum(green),q);
2115 SetPixelBlue(image,ClampToQuantum(blue),q);
2116 q+=GetPixelChannels(image);
2118 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2119 if (sync == MagickFalse)
2122 image_view=DestroyCacheView(image_view);
2123 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2124 return(MagickFalse);
2130 Transform image from HSL to sRGB.
2132 if (image->storage_class == PseudoClass)
2134 if (SyncImage(image,exception) == MagickFalse)
2135 return(MagickFalse);
2136 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2137 return(MagickFalse);
2139 image_view=AcquireAuthenticCacheView(image,exception);
2140 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2141 #pragma omp parallel for schedule(static,4) shared(status) \
2142 dynamic_number_threads(image,image->columns,image->rows,1)
2144 for (y=0; y < (ssize_t) image->rows; y++)
2160 if (status == MagickFalse)
2162 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2164 if (q == (Quantum *) NULL)
2169 for (x=0; x < (ssize_t) image->columns; x++)
2176 hue=(double) (QuantumScale*GetPixelRed(image,q));
2177 saturation=(double) (QuantumScale*GetPixelGreen(image,q));
2178 lightness=(double) (QuantumScale*GetPixelBlue(image,q));
2179 ConvertHSLTosRGB(hue,saturation,lightness,&red,&green,&blue);
2180 SetPixelRed(image,ClampToQuantum(red),q);
2181 SetPixelGreen(image,ClampToQuantum(green),q);
2182 SetPixelBlue(image,ClampToQuantum(blue),q);
2183 q+=GetPixelChannels(image);
2185 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2186 if (sync == MagickFalse)
2189 image_view=DestroyCacheView(image_view);
2190 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2191 return(MagickFalse);
2197 Transform image from HWB to sRGB.
2199 if (image->storage_class == PseudoClass)
2201 if (SyncImage(image,exception) == MagickFalse)
2202 return(MagickFalse);
2203 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2204 return(MagickFalse);
2206 image_view=AcquireAuthenticCacheView(image,exception);
2207 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2208 #pragma omp parallel for schedule(static,4) shared(status) \
2209 dynamic_number_threads(image,image->columns,image->rows,1)
2211 for (y=0; y < (ssize_t) image->rows; y++)
2227 if (status == MagickFalse)
2229 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2231 if (q == (Quantum *) NULL)
2236 for (x=0; x < (ssize_t) image->columns; x++)
2243 hue=(double) (QuantumScale*GetPixelRed(image,q));
2244 whiteness=(double) (QuantumScale*GetPixelGreen(image,q));
2245 blackness=(double) (QuantumScale*GetPixelBlue(image,q));
2246 ConvertHWBTosRGB(hue,whiteness,blackness,&red,&green,&blue);
2247 SetPixelRed(image,ClampToQuantum(red),q);
2248 SetPixelGreen(image,ClampToQuantum(green),q);
2249 SetPixelBlue(image,ClampToQuantum(blue),q);
2250 q+=GetPixelChannels(image);
2252 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2253 if (sync == MagickFalse)
2256 image_view=DestroyCacheView(image_view);
2257 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2258 return(MagickFalse);
2264 Transform image from Lab to sRGB.
2266 if (image->storage_class == PseudoClass)
2268 if (SyncImage(image,exception) == MagickFalse)
2269 return(MagickFalse);
2270 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2271 return(MagickFalse);
2273 image_view=AcquireAuthenticCacheView(image,exception);
2274 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2275 #pragma omp parallel for schedule(static,4) shared(status) \
2276 dynamic_number_threads(image,image->columns,image->rows,1)
2278 for (y=0; y < (ssize_t) image->rows; y++)
2297 if (status == MagickFalse)
2299 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2301 if (q == (Quantum *) NULL)
2309 for (x=0; x < (ssize_t) image->columns; x++)
2316 L=QuantumScale*GetPixelRed(image,q);
2317 a=QuantumScale*GetPixelGreen(image,q);
2318 b=QuantumScale*GetPixelBlue(image,q);
2319 ConvertLabToXYZ(L,a,b,&X,&Y,&Z);
2320 ConvertXYZTosRGB(X,Y,Z,&red,&green,&blue);
2321 SetPixelRed(image,red,q);
2322 SetPixelGreen(image,green,q);
2323 SetPixelBlue(image,blue,q);
2324 q+=GetPixelChannels(image);
2326 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2327 if (sync == MagickFalse)
2330 image_view=DestroyCacheView(image_view);
2331 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2332 return(MagickFalse);
2352 Transform Log to sRGB colorspace.
2354 density=DisplayGamma;
2356 value=GetImageProperty(image,"gamma",exception);
2357 if (value != (const char *) NULL)
2358 gamma=MagickEpsilonReciprocal(StringToDouble(value,(char **) NULL));
2359 film_gamma=FilmGamma;
2360 value=GetImageProperty(image,"film-gamma",exception);
2361 if (value != (const char *) NULL)
2362 film_gamma=StringToDouble(value,(char **) NULL);
2363 reference_black=ReferenceBlack;
2364 value=GetImageProperty(image,"reference-black",exception);
2365 if (value != (const char *) NULL)
2366 reference_black=StringToDouble(value,(char **) NULL);
2367 reference_white=ReferenceWhite;
2368 value=GetImageProperty(image,"reference-white",exception);
2369 if (value != (const char *) NULL)
2370 reference_white=StringToDouble(value,(char **) NULL);
2371 logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2373 if (logmap == (Quantum *) NULL)
2374 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
2376 black=pow(10.0,(reference_black-reference_white)*(gamma/density)*
2378 for (i=0; i <= (ssize_t) (reference_black*MaxMap/1024.0); i++)
2379 logmap[i]=(Quantum) 0;
2380 for ( ; i < (ssize_t) (reference_white*MaxMap/1024.0); i++)
2381 logmap[i]=ClampToQuantum((MagickRealType) QuantumRange/(1.0-black)*
2382 (pow(10.0,(1024.0*i/MaxMap-reference_white)*
2383 (gamma/density)*0.002/film_gamma)-black));
2384 for ( ; i <= (ssize_t) MaxMap; i++)
2385 logmap[i]=QuantumRange;
2386 if (image->storage_class == PseudoClass)
2388 if (SyncImage(image,exception) == MagickFalse)
2389 return(MagickFalse);
2390 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2391 return(MagickFalse);
2393 image_view=AcquireAuthenticCacheView(image,exception);
2394 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2395 #pragma omp parallel for schedule(static,4) shared(status) \
2396 dynamic_number_threads(image,image->columns,image->rows,1)
2398 for (y=0; y < (ssize_t) image->rows; y++)
2409 if (status == MagickFalse)
2411 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2413 if (q == (Quantum *) NULL)
2418 for (x=(ssize_t) image->columns; x != 0; x--)
2425 red=QuantumRange*CompandsRGB(QuantumScale*logmap[ScaleQuantumToMap(
2426 GetPixelRed(image,q))]);
2427 green=QuantumRange*CompandsRGB(QuantumScale*logmap[ScaleQuantumToMap(
2428 GetPixelGreen(image,q))]);
2429 blue=QuantumRange*CompandsRGB(QuantumScale*logmap[ScaleQuantumToMap(
2430 GetPixelBlue(image,q))]);
2431 SetPixelRed(image,ClampToQuantum(red),q);
2432 SetPixelGreen(image,ClampToQuantum(green),q);
2433 SetPixelBlue(image,ClampToQuantum(blue),q);
2434 q+=GetPixelChannels(image);
2436 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2437 if (sync == MagickFalse)
2440 image_view=DestroyCacheView(image_view);
2441 logmap=(Quantum *) RelinquishMagickMemory(logmap);
2442 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2443 return(MagickFalse);
2449 Transform linear RGB to sRGB colorspace.
2451 if (image->storage_class == PseudoClass)
2453 if (SyncImage(image,exception) == MagickFalse)
2454 return(MagickFalse);
2455 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2456 return(MagickFalse);
2458 image_view=AcquireAuthenticCacheView(image,exception);
2459 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2460 #pragma omp parallel for schedule(static,4) shared(status) \
2461 dynamic_number_threads(image,image->columns,image->rows,1)
2463 for (y=0; y < (ssize_t) image->rows; y++)
2474 if (status == MagickFalse)
2476 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2478 if (q == (Quantum *) NULL)
2483 for (x=(ssize_t) image->columns; x != 0; x--)
2490 red=QuantumRange*CompandsRGB(QuantumScale*GetPixelRed(image,q));
2491 green=QuantumRange*CompandsRGB(QuantumScale*GetPixelGreen(image,q));
2492 blue=QuantumRange*CompandsRGB(QuantumScale*GetPixelBlue(image,q));
2493 SetPixelRed(image,ClampToQuantum(red),q);
2494 SetPixelGreen(image,ClampToQuantum(green),q);
2495 SetPixelBlue(image,ClampToQuantum(blue),q);
2496 q+=GetPixelChannels(image);
2498 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2499 if (sync == MagickFalse)
2502 image_view=DestroyCacheView(image_view);
2503 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2504 return(MagickFalse);
2510 Transform image from XYZ to sRGB.
2512 if (image->storage_class == PseudoClass)
2514 if (SyncImage(image,exception) == MagickFalse)
2515 return(MagickFalse);
2516 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2517 return(MagickFalse);
2519 image_view=AcquireAuthenticCacheView(image,exception);
2520 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2521 #pragma omp parallel for schedule(static,4) shared(status) \
2522 dynamic_number_threads(image,image->columns,image->rows,1)
2524 for (y=0; y < (ssize_t) image->rows; y++)
2535 if (status == MagickFalse)
2537 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2539 if (q == (Quantum *) NULL)
2544 for (x=0; x < (ssize_t) image->columns; x++)
2556 X=QuantumScale*GetPixelRed(image,q);
2557 Y=QuantumScale*GetPixelGreen(image,q);
2558 Z=QuantumScale*GetPixelBlue(image,q);
2559 ConvertXYZTosRGB(X,Y,Z,&red,&green,&blue);
2560 SetPixelRed(image,red,q);
2561 SetPixelGreen(image,green,q);
2562 SetPixelBlue(image,blue,q);
2563 q+=GetPixelChannels(image);
2565 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2566 if (sync == MagickFalse)
2569 image_view=DestroyCacheView(image_view);
2570 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
2571 return(MagickFalse);
2578 Allocate the tables.
2580 x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2582 y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2584 z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
2586 if ((x_map == (TransformPacket *) NULL) ||
2587 (y_map == (TransformPacket *) NULL) ||
2588 (z_map == (TransformPacket *) NULL))
2590 if (z_map != (TransformPacket *) NULL)
2591 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
2592 if (y_map != (TransformPacket *) NULL)
2593 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
2594 if (x_map != (TransformPacket *) NULL)
2595 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2596 ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
2599 switch (image->colorspace)
2601 case OHTAColorspace:
2604 Initialize OHTA tables:
2606 R = I1+1.00000*I2-0.66668*I3
2607 G = I1+0.00000*I2+1.33333*I3
2608 B = I1-1.00000*I2-0.66668*I3
2610 I and Q, normally -0.5 through 0.5, must be normalized to the range 0
2611 through QuantumRange.
2613 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2614 #pragma omp parallel for schedule(static) \
2615 dynamic_number_threads(image,image->columns,1,1)
2617 for (i=0; i <= (ssize_t) MaxMap; i++)
2619 x_map[i].x=(MagickRealType) i;
2620 y_map[i].x=0.500000*(2.000000*(MagickRealType) i-(MagickRealType)
2622 z_map[i].x=(-0.333340)*(2.000000*(MagickRealType) i-(MagickRealType)
2624 x_map[i].y=(MagickRealType) i;
2625 y_map[i].y=0.000000;
2626 z_map[i].y=0.666665*(2.000000*(MagickRealType) i-(MagickRealType)
2628 x_map[i].z=(MagickRealType) i;
2629 y_map[i].z=(-0.500000)*(2.000000*(MagickRealType) i-(MagickRealType)
2631 z_map[i].z=(-0.333340)*(2.000000*(MagickRealType) i-(MagickRealType)
2636 case Rec601YCbCrColorspace:
2637 case YCbCrColorspace:
2640 Initialize YCbCr tables:
2643 G = Y-0.344136*Cb-0.714136*Cr
2646 Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
2647 through QuantumRange.
2649 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2650 #pragma omp parallel for schedule(static) \
2651 dynamic_number_threads(image,image->columns,1,1)
2653 for (i=0; i <= (ssize_t) MaxMap; i++)
2655 x_map[i].x=(MagickRealType) i;
2656 y_map[i].x=0.000000;
2657 z_map[i].x=(1.402000*0.500000)*(2.000000*(MagickRealType) i-
2658 (MagickRealType) MaxMap);
2659 x_map[i].y=(MagickRealType) i;
2660 y_map[i].y=(-0.344136*0.500000)*(2.000000*(MagickRealType) i-
2661 (MagickRealType) MaxMap);
2662 z_map[i].y=(-0.714136*0.500000)*(2.000000*(MagickRealType) i-
2663 (MagickRealType) MaxMap);
2664 x_map[i].z=(MagickRealType) i;
2665 y_map[i].z=(1.772000*0.500000)*(2.000000*(MagickRealType) i-
2666 (MagickRealType) MaxMap);
2667 z_map[i].z=0.000000;
2671 case Rec709YCbCrColorspace:
2674 Initialize YCbCr tables:
2677 G = Y-0.187324*Cb-0.468124*Cr
2680 Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
2681 through QuantumRange.
2683 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2684 #pragma omp parallel for schedule(static) \
2685 dynamic_number_threads(image,image->columns,1,1)
2687 for (i=0; i <= (ssize_t) MaxMap; i++)
2689 x_map[i].x=(MagickRealType) i;
2690 y_map[i].x=0.000000;
2691 z_map[i].x=(1.574800*0.50000)*(2.00000*(MagickRealType) i-
2692 (MagickRealType) MaxMap);
2693 x_map[i].y=(MagickRealType) i;
2694 y_map[i].y=(-0.187324*0.50000)*(2.00000*(MagickRealType) i-
2695 (MagickRealType) MaxMap);
2696 z_map[i].y=(-0.468124*0.50000)*(2.00000*(MagickRealType) i-
2697 (MagickRealType) MaxMap);
2698 x_map[i].z=(MagickRealType) i;
2699 y_map[i].z=(1.855600*0.50000)*(2.00000*(MagickRealType) i-
2700 (MagickRealType) MaxMap);
2708 Initialize YCC tables:
2711 G = Y-0.317038*C1-0.682243*C2
2714 YCC is scaled by 1.3584. C1 zero is 156 and C2 is at 137.
2716 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2717 #pragma omp parallel for schedule(static) \
2718 dynamic_number_threads(image,image->columns,1,1)
2720 for (i=0; i <= (ssize_t) MaxMap; i++)
2722 x_map[i].x=1.3584000*(MagickRealType) i;
2723 y_map[i].x=0.0000000;
2724 z_map[i].x=1.8215000*((MagickRealType) i-(MagickRealType)
2725 ScaleQuantumToMap(ScaleCharToQuantum(137)));
2726 x_map[i].y=1.3584000*(MagickRealType) i;
2727 y_map[i].y=(-0.4302726)*((MagickRealType) i-(MagickRealType)
2728 ScaleQuantumToMap(ScaleCharToQuantum(156)));
2729 z_map[i].y=(-0.9271435)*((MagickRealType) i-(MagickRealType)
2730 ScaleQuantumToMap(ScaleCharToQuantum(137)));
2731 x_map[i].z=1.3584000*(MagickRealType) i;
2732 y_map[i].z=2.2179000*((MagickRealType) i-(MagickRealType)
2733 ScaleQuantumToMap(ScaleCharToQuantum(156)));
2734 z_map[i].z=0.0000000;
2741 Initialize YIQ tables:
2743 R = Y+0.95620*I+0.62140*Q
2744 G = Y-0.27270*I-0.64680*Q
2745 B = Y-1.10370*I+1.70060*Q
2747 I and Q, normally -0.5 through 0.5, must be normalized to the range 0
2748 through QuantumRange.
2750 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2751 #pragma omp parallel for schedule(static) \
2752 dynamic_number_threads(image,image->columns,1,1)
2754 for (i=0; i <= (ssize_t) MaxMap; i++)
2756 x_map[i].x=(MagickRealType) i;
2757 y_map[i].x=0.47810*(2.00000*(MagickRealType) i-(MagickRealType)
2759 z_map[i].x=0.31070*(2.00000*(MagickRealType) i-(MagickRealType)
2761 x_map[i].y=(MagickRealType) i;
2762 y_map[i].y=(-0.13635)*(2.00000*(MagickRealType) i-(MagickRealType)
2764 z_map[i].y=(-0.32340)*(2.00000*(MagickRealType) i-(MagickRealType)
2766 x_map[i].z=(MagickRealType) i;
2767 y_map[i].z=(-0.55185)*(2.00000*(MagickRealType) i-(MagickRealType)
2769 z_map[i].z=0.85030*(2.00000*(MagickRealType) i-(MagickRealType)
2774 case YPbPrColorspace:
2777 Initialize YPbPr tables:
2780 G = Y-0.344136*C1+0.714136*C2
2783 Pb and Pr, normally -0.5 through 0.5, must be normalized to the range 0
2784 through QuantumRange.
2786 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2787 #pragma omp parallel for schedule(static) \
2788 dynamic_number_threads(image,image->columns,1,1)
2790 for (i=0; i <= (ssize_t) MaxMap; i++)
2792 x_map[i].x=(MagickRealType) i;
2793 y_map[i].x=0.000000;
2794 z_map[i].x=0.701000*(2.00000*(MagickRealType) i-(MagickRealType)
2796 x_map[i].y=(MagickRealType) i;
2797 y_map[i].y=(-0.172068)*(2.00000*(MagickRealType) i-(MagickRealType)
2799 z_map[i].y=0.357068*(2.00000*(MagickRealType) i-(MagickRealType)
2801 x_map[i].z=(MagickRealType) i;
2802 y_map[i].z=0.88600*(2.00000*(MagickRealType) i-(MagickRealType)
2811 Initialize YUV tables:
2814 G = Y-0.39380*U-0.58050*V
2817 U and V, normally -0.5 through 0.5, must be normalized to the range 0
2818 through QuantumRange.
2820 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2821 #pragma omp parallel for schedule(static) \
2822 dynamic_number_threads(image,image->columns,1,1)
2824 for (i=0; i <= (ssize_t) MaxMap; i++)
2826 x_map[i].x=(MagickRealType) i;
2828 z_map[i].x=0.56990*(2.0000*(MagickRealType) i-(MagickRealType)
2830 x_map[i].y=(MagickRealType) i;
2831 y_map[i].y=(-0.19690)*(2.00000*(MagickRealType) i-(MagickRealType)
2833 z_map[i].y=(-0.29025)*(2.00000*(MagickRealType) i-(MagickRealType)
2835 x_map[i].z=(MagickRealType) i;
2836 y_map[i].z=1.01395*(2.00000*(MagickRealType) i-(MagickRealType)
2845 Linear conversion tables.
2847 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2848 #pragma omp parallel for schedule(static) \
2849 dynamic_number_threads(image,image->columns,1,1)
2851 for (i=0; i <= (ssize_t) MaxMap; i++)
2853 x_map[i].x=(MagickRealType) i;
2857 y_map[i].y=(MagickRealType) i;
2861 z_map[i].z=(MagickRealType) i;
2869 switch (image->storage_class)
2875 Convert DirectClass image.
2877 image_view=AcquireAuthenticCacheView(image,exception);
2878 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2879 #pragma omp parallel for schedule(static,4) shared(status) \
2880 dynamic_number_threads(image,image->columns,image->rows,1)
2882 for (y=0; y < (ssize_t) image->rows; y++)
2896 if (status == MagickFalse)
2898 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
2900 if (q == (Quantum *) NULL)
2905 for (x=0; x < (ssize_t) image->columns; x++)
2912 red=ScaleQuantumToMap(GetPixelRed(image,q));
2913 green=ScaleQuantumToMap(GetPixelGreen(image,q));
2914 blue=ScaleQuantumToMap(GetPixelBlue(image,q));
2915 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2916 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2917 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2918 if (colorspace == YCCColorspace)
2920 #if !defined(MAGICKCORE_HDRI_SUPPORT)
2921 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2923 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2925 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2929 SetPixelRed(image,ClampToQuantum(QuantumRange*CompandsRGB(
2930 QuantumScale*ScaleMapToQuantum(pixel.red))),q);
2931 SetPixelGreen(image,ClampToQuantum(QuantumRange*CompandsRGB(
2932 QuantumScale*ScaleMapToQuantum(pixel.green))),q);
2933 SetPixelBlue(image,ClampToQuantum(QuantumRange*CompandsRGB(
2934 QuantumScale*ScaleMapToQuantum(pixel.blue))),q);
2935 q+=GetPixelChannels(image);
2937 sync=SyncCacheViewAuthenticPixels(image_view,exception);
2938 if (sync == MagickFalse)
2940 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2945 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2946 #pragma omp critical (MagickCore_TransformsRGBImage)
2948 proceed=SetImageProgress(image,TransformsRGBImageTag,progress++,
2950 if (proceed == MagickFalse)
2954 image_view=DestroyCacheView(image_view);
2960 Convert PseudoClass image.
2962 #if defined(MAGICKCORE_OPENMP_SUPPORT)
2963 #pragma omp parallel for schedule(static,4) shared(status) \
2964 dynamic_number_threads(image,image->columns,1,1)
2966 for (i=0; i < (ssize_t) image->colors; i++)
2976 red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
2977 green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
2978 blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
2979 pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
2980 pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
2981 pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
2982 if (colorspace == YCCColorspace)
2984 #if !defined(MAGICKCORE_HDRI_SUPPORT)
2985 pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2987 pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2989 pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*QuantumScale*
2993 image->colormap[i].red=(double) ClampToQuantum(QuantumRange*
2994 CompandsRGB(QuantumScale*ScaleMapToQuantum(pixel.red)));
2995 image->colormap[i].green=(double) ClampToQuantum(QuantumRange*
2996 CompandsRGB(QuantumScale*ScaleMapToQuantum(pixel.green)));
2997 image->colormap[i].blue=(double) ClampToQuantum(QuantumRange*
2998 CompandsRGB(QuantumScale*ScaleMapToQuantum(pixel.blue)));
3000 (void) SyncImage(image,exception);
3005 Relinquish resources.
3007 z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
3008 y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
3009 x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
3010 if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
3011 return(MagickFalse);