13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     CCCC   OOO   L       OOO   RRRR   SSSSS  PPPP    AAA    CCCC  EEEEE     %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    C      O   O  L      O   O  R   R  SS     P   P  A   A  C      E         %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    C      O   O  L      O   O  RRRR    SSS   PPPP   AAAAA  C      EEE       %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    C      O   O  L      O   O  R R       SS  P      A   A  C      E         %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     CCCC   OOO   LLLLL   OOO   R  R   SSSSS  P      A   A   CCCC  EEEEE     %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                     MagickCore Image Colorspace Methods                     %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                   Cristy                                    %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 July 1992                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
43ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk#include "MagickCore/attribute.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache-private.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache-view.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/gem.h"
57d1dd6e4fefa0810b9893e6ac9418f79c97c1b39acristy#include "MagickCore/gem-private.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
621d1b10fb44a3606fdaf55e0998d50bee59401c17cristy#include "MagickCore/pixel-private.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantize.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
66ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy#include "MagickCore/resource_.h"
674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string-private.h"
694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _TransformPacket
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
767f500f918f0ff0a50259a35004819a2e9028dd9acristy  MagickRealType
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y,
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    z;
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} TransformPacket;
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
83501c5597e8d10b6102a4566f2740f4166bdd545fcristy  Forward declarations.
84501c5597e8d10b6102a4566f2740f4166bdd545fcristy*/
85501c5597e8d10b6102a4566f2740f4166bdd545fcristystatic MagickBooleanType
86b0de93fdedaac769cb08e15b3ec176d4c9078907cristy  TransformsRGBImage(Image *,ExceptionInfo *);
87501c5597e8d10b6102a4566f2740f4166bdd545fcristy
88501c5597e8d10b6102a4566f2740f4166bdd545fcristy/*
89c404ff637035f3815b1b2907f2b694f7cfa09077cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
93501c5597e8d10b6102a4566f2740f4166bdd545fcristy+     s R G B T r a n s f o r m I m a g e                                     %
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99501c5597e8d10b6102a4566f2740f4166bdd545fcristy%  sRGBTransformImage() converts the reference image from sRGB to an alternate
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  colorspace.  The transformation matrices are not the standard ones: the
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  weights are rescaled to normalized the range of the transformed values to
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  be [0..QuantumRange].
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
104501c5597e8d10b6102a4566f2740f4166bdd545fcristy%  The format of the sRGBTransformImage method is:
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
106501c5597e8d10b6102a4566f2740f4166bdd545fcristy%      MagickBooleanType sRGBTransformImage(Image *image,
10718873883644b381f64ff76a1dffeef1f284c1101cristy%        const ColorspaceType colorspace,EsceptionInfo *exception)
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colorspace: the colorspace to transform the image to.
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11518873883644b381f64ff76a1dffeef1f284c1101cristy%   o exception: return any errors or warnings in this structure.
11618873883644b381f64ff76a1dffeef1f284c1101cristy%
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
119ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristystatic inline void ConvertRGBToCMY(const double red,const double green,
120ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  const double blue,double *cyan,double *magenta,double *yellow)
121ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy{
122ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  *cyan=QuantumScale*(QuantumRange-red);
123ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  *magenta=QuantumScale*(QuantumRange-green);
124ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  *yellow=QuantumScale*(QuantumRange-blue);
125ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy}
126ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy
12709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristystatic inline void ConvertXYZToLMS(const double x,const double y,
12809d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy  const double z,double *L,double *M,double *S)
12909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy{
13058f753736c6261463b4d1a6809678b884e9297bccristy  *L=0.7328*x+0.4296*y-0.1624*z;
13158f753736c6261463b4d1a6809678b884e9297bccristy  *M=(-0.7036*x+1.6975*y+0.0061*z);
13258f753736c6261463b4d1a6809678b884e9297bccristy  *S=0.0030*x+0.0136*y+0.9834*z;
13358f753736c6261463b4d1a6809678b884e9297bccristy}
13458f753736c6261463b4d1a6809678b884e9297bccristy
13558f753736c6261463b4d1a6809678b884e9297bccristystatic void ConvertRGBToLMS(const double red,const double green,
13658f753736c6261463b4d1a6809678b884e9297bccristy  const double blue,double *L,double *M,double *S)
13758f753736c6261463b4d1a6809678b884e9297bccristy{
13858f753736c6261463b4d1a6809678b884e9297bccristy  double
13958f753736c6261463b4d1a6809678b884e9297bccristy    X,
14058f753736c6261463b4d1a6809678b884e9297bccristy    Y,
14158f753736c6261463b4d1a6809678b884e9297bccristy    Z;
14258f753736c6261463b4d1a6809678b884e9297bccristy
14358f753736c6261463b4d1a6809678b884e9297bccristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
14458f753736c6261463b4d1a6809678b884e9297bccristy  ConvertXYZToLMS(X,Y,Z,L,M,S);
14558f753736c6261463b4d1a6809678b884e9297bccristy}
14658f753736c6261463b4d1a6809678b884e9297bccristy
14758f753736c6261463b4d1a6809678b884e9297bccristystatic void ConvertRGBToLab(const double red,const double green,
14858f753736c6261463b4d1a6809678b884e9297bccristy  const double blue,double *L,double *a,double *b)
14958f753736c6261463b4d1a6809678b884e9297bccristy{
15058f753736c6261463b4d1a6809678b884e9297bccristy  double
15158f753736c6261463b4d1a6809678b884e9297bccristy    X,
15258f753736c6261463b4d1a6809678b884e9297bccristy    Y,
15358f753736c6261463b4d1a6809678b884e9297bccristy    Z;
15458f753736c6261463b4d1a6809678b884e9297bccristy
15558f753736c6261463b4d1a6809678b884e9297bccristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
15658f753736c6261463b4d1a6809678b884e9297bccristy  ConvertXYZToLab(X,Y,Z,L,a,b);
15758f753736c6261463b4d1a6809678b884e9297bccristy}
15858f753736c6261463b4d1a6809678b884e9297bccristy
15958f753736c6261463b4d1a6809678b884e9297bccristystatic void ConvertRGBToLuv(const double red,const double green,
16058f753736c6261463b4d1a6809678b884e9297bccristy  const double blue,double *L,double *u,double *v)
16158f753736c6261463b4d1a6809678b884e9297bccristy{
16258f753736c6261463b4d1a6809678b884e9297bccristy  double
16358f753736c6261463b4d1a6809678b884e9297bccristy    X,
16458f753736c6261463b4d1a6809678b884e9297bccristy    Y,
16558f753736c6261463b4d1a6809678b884e9297bccristy    Z;
16658f753736c6261463b4d1a6809678b884e9297bccristy
16758f753736c6261463b4d1a6809678b884e9297bccristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
16858f753736c6261463b4d1a6809678b884e9297bccristy  ConvertXYZToLuv(X,Y,Z,L,u,v);
16958f753736c6261463b4d1a6809678b884e9297bccristy}
17058f753736c6261463b4d1a6809678b884e9297bccristy
1717894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristystatic void ConvertRGBToxyY(const double red,const double green,
1727894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  const double blue,double *low_x,double *low_y,double *cap_Y)
1737894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy{
1747894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  double
1757894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    X,
1767894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    Y,
1777894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    Z;
1787894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy
1797894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
1807894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  *low_x=X/(X+Y+Z);
1817894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  *low_y=Y/(X+Y+Z);
1827894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  *cap_Y=Y;
1837894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy}
1847894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy
185c282d1b30162621c02ffe38060889a920027e870cristystatic void ConvertRGBToYDbDr(const double red,const double green,
186c282d1b30162621c02ffe38060889a920027e870cristy  const double blue,double *Y,double *Db,double *Dr)
187c282d1b30162621c02ffe38060889a920027e870cristy{
188c282d1b30162621c02ffe38060889a920027e870cristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
189fd3395c5ef9e65bae71a304a6c692c241387636dcristy  *Db=QuantumScale*(-0.450*red-0.883*green+1.333*blue)+0.5;
19036fdd0238c0766a69efbd11fa01435074b80c885cristy  *Dr=QuantumScale*(-1.333*red+1.116*green+0.217*blue)+0.5;
191c282d1b30162621c02ffe38060889a920027e870cristy}
192c282d1b30162621c02ffe38060889a920027e870cristy
19358f753736c6261463b4d1a6809678b884e9297bccristystatic void ConvertRGBToYIQ(const double red,const double green,
19458f753736c6261463b4d1a6809678b884e9297bccristy  const double blue,double *Y,double *I,double *Q)
19558f753736c6261463b4d1a6809678b884e9297bccristy{
196313974331a93fe62e84e824f4fe69ee83740502dcristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
197313974331a93fe62e84e824f4fe69ee83740502dcristy  *I=QuantumScale*(0.595716*red-0.274453*green-0.321263*blue)+0.5;
198313974331a93fe62e84e824f4fe69ee83740502dcristy  *Q=QuantumScale*(0.211456*red-0.522591*green+0.311135*blue)+0.5;
19909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy}
20009d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy
201e1ca83966a785a952a4f056f6047a91389ee99a3cristystatic void ConvertRGBToYPbPr(const double red,const double green,
202e1ca83966a785a952a4f056f6047a91389ee99a3cristy  const double blue,double *Y,double *Pb,double *Pr)
203e1ca83966a785a952a4f056f6047a91389ee99a3cristy{
204313974331a93fe62e84e824f4fe69ee83740502dcristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
205313974331a93fe62e84e824f4fe69ee83740502dcristy  *Pb=QuantumScale*((-0.1687367)*red-0.331264*green+0.5*blue)+0.5;
20638e97388bb9ab2d86c7b6b99057c0b0a374dd028cristy  *Pr=QuantumScale*(0.5*red-0.418688*green-0.081312*blue)+0.5;
207e1ca83966a785a952a4f056f6047a91389ee99a3cristy}
208e1ca83966a785a952a4f056f6047a91389ee99a3cristy
209e1ca83966a785a952a4f056f6047a91389ee99a3cristystatic void ConvertRGBToYCbCr(const double red,const double green,
210e1ca83966a785a952a4f056f6047a91389ee99a3cristy  const double blue,double *Y,double *Cb,double *Cr)
211e1ca83966a785a952a4f056f6047a91389ee99a3cristy{
212e1ca83966a785a952a4f056f6047a91389ee99a3cristy  ConvertRGBToYPbPr(red,green,blue,Y,Cb,Cr);
21358f753736c6261463b4d1a6809678b884e9297bccristy}
21458f753736c6261463b4d1a6809678b884e9297bccristy
21558f753736c6261463b4d1a6809678b884e9297bccristystatic void ConvertRGBToYUV(const double red,const double green,
21658f753736c6261463b4d1a6809678b884e9297bccristy  const double blue,double *Y,double *U,double *V)
21758f753736c6261463b4d1a6809678b884e9297bccristy{
218313974331a93fe62e84e824f4fe69ee83740502dcristy  *Y=QuantumScale*(0.298839*red+0.586811*green+0.114350*blue);
219cb549a33b5846085d6b0a6ef41832815e3e188d3cristy  *U=QuantumScale*((-0.147)*red-0.289*green+0.436*blue)+0.5;
220cb549a33b5846085d6b0a6ef41832815e3e188d3cristy  *V=QuantumScale*(0.615*red-0.515*green-0.100*blue)+0.5;
221e1ca83966a785a952a4f056f6047a91389ee99a3cristy}
222e1ca83966a785a952a4f056f6047a91389ee99a3cristy
223501c5597e8d10b6102a4566f2740f4166bdd545fcristystatic MagickBooleanType sRGBTransformImage(Image *image,
22418873883644b381f64ff76a1dffeef1f284c1101cristy  const ColorspaceType colorspace,ExceptionInfo *exception)
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
226501c5597e8d10b6102a4566f2740f4166bdd545fcristy#define sRGBTransformImageTag  "RGBTransform/Image"
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
228c4c8d13c0996fea659ce63c682c803e74c1abc8acristy  CacheView
229c4c8d13c0996fea659ce63c682c803e74c1abc8acristy    *image_view;
230c4c8d13c0996fea659ce63c682c803e74c1abc8acristy
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
232564a56979706a30a3d0f920fd5f538a408efd4f1cristy    status;
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2345f959473f334e196c6bf39b740c12cb4963fceebcristy  MagickOffsetType
2355f959473f334e196c6bf39b740c12cb4963fceebcristy    progress;
2365f959473f334e196c6bf39b740c12cb4963fceebcristy
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  PrimaryInfo
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    primary_info;
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
240bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2435f959473f334e196c6bf39b740c12cb4963fceebcristy  ssize_t
2445f959473f334e196c6bf39b740c12cb4963fceebcristy    y;
2455f959473f334e196c6bf39b740c12cb4963fceebcristy
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  TransformPacket
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *x_map,
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *y_map,
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *z_map;
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
252e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
2550257d3822dae3829690a64b809dbda8adc0214f9cristy  assert(colorspace != sRGBColorspace);
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(colorspace != TransparentColorspace);
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(colorspace != UndefinedColorspace);
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (colorspace)
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case CMYKColorspace:
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2644c08aed51c5899665ade97263692328eea4af106cristy      PixelInfo
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        zero;
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert RGB to CMYK colorspace.
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->storage_class == PseudoClass)
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
272ea1a8aa04a9fe1500104284407c1cc06d20da699cristy          if (SyncImage(image,exception) == MagickFalse)
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return(MagickFalse);
274574cc26500992189f637cd1cdf93d0654e7df7aecristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            return(MagickFalse);
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
277056109f147080d50be6381308725cf46402a0c45cristy      if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
278056109f147080d50be6381308725cf46402a0c45cristy        return(MagickFalse);
2794c08aed51c5899665ade97263692328eea4af106cristy      GetPixelInfo(image,&zero);
28046ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
281b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
282ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy      #pragma omp parallel for schedule(static,4) shared(status) \
2835e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
285bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
287564a56979706a30a3d0f920fd5f538a408efd4f1cristy        MagickBooleanType
288564a56979706a30a3d0f920fd5f538a408efd4f1cristy          sync;
289564a56979706a30a3d0f920fd5f538a408efd4f1cristy
2904c08aed51c5899665ade97263692328eea4af106cristy        PixelInfo
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel;
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
293bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x;
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2964c08aed51c5899665ade97263692328eea4af106cristy        register Quantum
29705d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          exception);
303acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=MagickFalse;
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel=zero;
309bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
311803640d20a6a664315eddfff6f8531d0c5e0871dcristy          GetPixelInfoPixel(image,q,&pixel);
3120a39a5c567fca70403bc431d18890e89fc253eefcristy          ConvertRGBToCMYK(&pixel);
31311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          SetPixelViaPixelInfo(image,&pixel,q);
314ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (sync == MagickFalse)
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_view=DestroyCacheView(image_view);
32117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      image->type=image->alpha_trait == UndefinedPixelTrait ? ColorSeparationType :
322def23e5d7331b1a13ed593b6d6aca516da382328cristy        ColorSeparationAlphaType;
323056109f147080d50be6381308725cf46402a0c45cristy      if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
324056109f147080d50be6381308725cf46402a0c45cristy        return(MagickFalse);
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(status);
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
32706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    case GRAYColorspace:
32806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    {
32906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      /*
33006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        Transform image from sRGB to GRAY.
33106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      */
33206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      if (image->storage_class == PseudoClass)
33306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        {
33406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          if (SyncImage(image,exception) == MagickFalse)
33506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            return(MagickFalse);
33606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
33706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            return(MagickFalse);
33806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        }
33946ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
34006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
34106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      #pragma omp parallel for schedule(static,4) shared(status) \
3425e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
34306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy#endif
34406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      for (y=0; y < (ssize_t) image->rows; y++)
34506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      {
34606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        MagickBooleanType
34706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          sync;
34806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
34906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        register ssize_t
35006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          x;
35106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
35206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        register Quantum
35305d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
35406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
35506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        if (status == MagickFalse)
35606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          continue;
35706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
35806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          exception);
35906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        if (q == (Quantum *) NULL)
36006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          {
36106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            status=MagickFalse;
36206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            continue;
36306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          }
36406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        for (x=0; x < (ssize_t) image->columns; x++)
36506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        {
36653dc799d1d991881bebd525680ff75629ac24703cristy          SetPixelGray(image,ClampToQuantum(GetPixelIntensity(image,q)),q);
36706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          q+=GetPixelChannels(image);
36806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        }
36906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
37006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        if (sync == MagickFalse)
37106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          status=MagickFalse;
37206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      }
37306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      image_view=DestroyCacheView(image_view);
37406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
37506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        return(MagickFalse);
37606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      image->type=GrayscaleType;
37706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      return(status);
37806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    }
379ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy    case CMYColorspace:
380e1ca83966a785a952a4f056f6047a91389ee99a3cristy    case HCLColorspace:
381e1ca83966a785a952a4f056f6047a91389ee99a3cristy    case HCLpColorspace:
382e1ca83966a785a952a4f056f6047a91389ee99a3cristy    case HSBColorspace:
383f147a5236a7d01b17d36afd5e15fd29679f3addfcristy    case HSIColorspace:
384e1ca83966a785a952a4f056f6047a91389ee99a3cristy    case HSLColorspace:
385e1ca83966a785a952a4f056f6047a91389ee99a3cristy    case HSVColorspace:
386e1ca83966a785a952a4f056f6047a91389ee99a3cristy    case HWBColorspace:
38758f753736c6261463b4d1a6809678b884e9297bccristy    case LabColorspace:
38858f753736c6261463b4d1a6809678b884e9297bccristy    case LCHColorspace:
38958f753736c6261463b4d1a6809678b884e9297bccristy    case LCHabColorspace:
39058f753736c6261463b4d1a6809678b884e9297bccristy    case LCHuvColorspace:
39158f753736c6261463b4d1a6809678b884e9297bccristy    case LMSColorspace:
39258f753736c6261463b4d1a6809678b884e9297bccristy    case LuvColorspace:
3937894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    case xyYColorspace:
39458f753736c6261463b4d1a6809678b884e9297bccristy    case XYZColorspace:
39558f753736c6261463b4d1a6809678b884e9297bccristy    case YCbCrColorspace:
396c282d1b30162621c02ffe38060889a920027e870cristy    case YDbDrColorspace:
39758f753736c6261463b4d1a6809678b884e9297bccristy    case YIQColorspace:
39858f753736c6261463b4d1a6809678b884e9297bccristy    case YPbPrColorspace:
39958f753736c6261463b4d1a6809678b884e9297bccristy    case YUVColorspace:
400722fc0cce634eb07588336accc3bb52979738a5ccristy    {
401722fc0cce634eb07588336accc3bb52979738a5ccristy      /*
402f147a5236a7d01b17d36afd5e15fd29679f3addfcristy        Transform image from sRGB to target colorspace.
403722fc0cce634eb07588336accc3bb52979738a5ccristy      */
404722fc0cce634eb07588336accc3bb52979738a5ccristy      if (image->storage_class == PseudoClass)
405722fc0cce634eb07588336accc3bb52979738a5ccristy        {
406722fc0cce634eb07588336accc3bb52979738a5ccristy          if (SyncImage(image,exception) == MagickFalse)
407722fc0cce634eb07588336accc3bb52979738a5ccristy            return(MagickFalse);
408722fc0cce634eb07588336accc3bb52979738a5ccristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
409722fc0cce634eb07588336accc3bb52979738a5ccristy            return(MagickFalse);
410722fc0cce634eb07588336accc3bb52979738a5ccristy        }
41146ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
412722fc0cce634eb07588336accc3bb52979738a5ccristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
413722fc0cce634eb07588336accc3bb52979738a5ccristy      #pragma omp parallel for schedule(static,4) shared(status) \
4145e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
415722fc0cce634eb07588336accc3bb52979738a5ccristy#endif
416722fc0cce634eb07588336accc3bb52979738a5ccristy      for (y=0; y < (ssize_t) image->rows; y++)
417722fc0cce634eb07588336accc3bb52979738a5ccristy      {
418722fc0cce634eb07588336accc3bb52979738a5ccristy        MagickBooleanType
419722fc0cce634eb07588336accc3bb52979738a5ccristy          sync;
420722fc0cce634eb07588336accc3bb52979738a5ccristy
421722fc0cce634eb07588336accc3bb52979738a5ccristy        register ssize_t
422722fc0cce634eb07588336accc3bb52979738a5ccristy          x;
423722fc0cce634eb07588336accc3bb52979738a5ccristy
424722fc0cce634eb07588336accc3bb52979738a5ccristy        register Quantum
42505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
426722fc0cce634eb07588336accc3bb52979738a5ccristy
427722fc0cce634eb07588336accc3bb52979738a5ccristy        if (status == MagickFalse)
428722fc0cce634eb07588336accc3bb52979738a5ccristy          continue;
429722fc0cce634eb07588336accc3bb52979738a5ccristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
430722fc0cce634eb07588336accc3bb52979738a5ccristy          exception);
431722fc0cce634eb07588336accc3bb52979738a5ccristy        if (q == (Quantum *) NULL)
432722fc0cce634eb07588336accc3bb52979738a5ccristy          {
433722fc0cce634eb07588336accc3bb52979738a5ccristy            status=MagickFalse;
434722fc0cce634eb07588336accc3bb52979738a5ccristy            continue;
435722fc0cce634eb07588336accc3bb52979738a5ccristy          }
436722fc0cce634eb07588336accc3bb52979738a5ccristy        for (x=0; x < (ssize_t) image->columns; x++)
437722fc0cce634eb07588336accc3bb52979738a5ccristy        {
438722fc0cce634eb07588336accc3bb52979738a5ccristy          double
439722fc0cce634eb07588336accc3bb52979738a5ccristy            blue,
440722fc0cce634eb07588336accc3bb52979738a5ccristy            green,
441f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            red,
442f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            X,
443f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            Y,
444f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            Z;
445722fc0cce634eb07588336accc3bb52979738a5ccristy
446251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          red=(double) GetPixelRed(image,q);
447251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          green=(double) GetPixelGreen(image,q);
448251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          blue=(double) GetPixelBlue(image,q);
449f147a5236a7d01b17d36afd5e15fd29679f3addfcristy          switch (colorspace)
450f147a5236a7d01b17d36afd5e15fd29679f3addfcristy          {
451ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy            case CMYColorspace:
452ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy            {
453ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy              ConvertRGBToCMY(red,green,blue,&X,&Y,&Z);
454ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy              break;
455ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy            }
45660edad36bc20324fd1ee710ca6362448b1b1d317cristy            case HCLColorspace:
45760edad36bc20324fd1ee710ca6362448b1b1d317cristy            {
45860edad36bc20324fd1ee710ca6362448b1b1d317cristy              ConvertRGBToHCL(red,green,blue,&X,&Y,&Z);
45960edad36bc20324fd1ee710ca6362448b1b1d317cristy              break;
46060edad36bc20324fd1ee710ca6362448b1b1d317cristy            }
46160edad36bc20324fd1ee710ca6362448b1b1d317cristy            case HCLpColorspace:
46260edad36bc20324fd1ee710ca6362448b1b1d317cristy            {
46360edad36bc20324fd1ee710ca6362448b1b1d317cristy              ConvertRGBToHCLp(red,green,blue,&X,&Y,&Z);
46460edad36bc20324fd1ee710ca6362448b1b1d317cristy              break;
46560edad36bc20324fd1ee710ca6362448b1b1d317cristy            }
466e1ca83966a785a952a4f056f6047a91389ee99a3cristy            case HSBColorspace:
467e1ca83966a785a952a4f056f6047a91389ee99a3cristy            {
468e1ca83966a785a952a4f056f6047a91389ee99a3cristy              ConvertRGBToHSB(red,green,blue,&X,&Y,&Z);
469e1ca83966a785a952a4f056f6047a91389ee99a3cristy              break;
470e1ca83966a785a952a4f056f6047a91389ee99a3cristy            }
471f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            case HSIColorspace:
472f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            {
473f147a5236a7d01b17d36afd5e15fd29679f3addfcristy              ConvertRGBToHSI(red,green,blue,&X,&Y,&Z);
474f147a5236a7d01b17d36afd5e15fd29679f3addfcristy              break;
475f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            }
476e1ca83966a785a952a4f056f6047a91389ee99a3cristy            case HSLColorspace:
477e1ca83966a785a952a4f056f6047a91389ee99a3cristy            {
478e1ca83966a785a952a4f056f6047a91389ee99a3cristy              ConvertRGBToHSL(red,green,blue,&X,&Y,&Z);
479e1ca83966a785a952a4f056f6047a91389ee99a3cristy              break;
480e1ca83966a785a952a4f056f6047a91389ee99a3cristy            }
481e1ca83966a785a952a4f056f6047a91389ee99a3cristy            case HSVColorspace:
482e1ca83966a785a952a4f056f6047a91389ee99a3cristy            {
483e1ca83966a785a952a4f056f6047a91389ee99a3cristy              ConvertRGBToHSV(red,green,blue,&X,&Y,&Z);
484e1ca83966a785a952a4f056f6047a91389ee99a3cristy              break;
485e1ca83966a785a952a4f056f6047a91389ee99a3cristy            }
486e1ca83966a785a952a4f056f6047a91389ee99a3cristy            case HWBColorspace:
487e1ca83966a785a952a4f056f6047a91389ee99a3cristy            {
488e1ca83966a785a952a4f056f6047a91389ee99a3cristy              ConvertRGBToHWB(red,green,blue,&X,&Y,&Z);
489e1ca83966a785a952a4f056f6047a91389ee99a3cristy              break;
490e1ca83966a785a952a4f056f6047a91389ee99a3cristy            }
49158f753736c6261463b4d1a6809678b884e9297bccristy            case LabColorspace:
49258f753736c6261463b4d1a6809678b884e9297bccristy            {
49358f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToLab(red,green,blue,&X,&Y,&Z);
49458f753736c6261463b4d1a6809678b884e9297bccristy              break;
49558f753736c6261463b4d1a6809678b884e9297bccristy            }
49658f753736c6261463b4d1a6809678b884e9297bccristy            case LCHColorspace:
49758f753736c6261463b4d1a6809678b884e9297bccristy            case LCHabColorspace:
49858f753736c6261463b4d1a6809678b884e9297bccristy            {
49958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToLCHab(red,green,blue,&X,&Y,&Z);
50058f753736c6261463b4d1a6809678b884e9297bccristy              break;
50158f753736c6261463b4d1a6809678b884e9297bccristy            }
50258f753736c6261463b4d1a6809678b884e9297bccristy            case LCHuvColorspace:
50358f753736c6261463b4d1a6809678b884e9297bccristy            {
50458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToLCHuv(red,green,blue,&X,&Y,&Z);
50558f753736c6261463b4d1a6809678b884e9297bccristy              break;
50658f753736c6261463b4d1a6809678b884e9297bccristy            }
50758f753736c6261463b4d1a6809678b884e9297bccristy            case LMSColorspace:
50858f753736c6261463b4d1a6809678b884e9297bccristy            {
50958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToLMS(red,green,blue,&X,&Y,&Z);
51058f753736c6261463b4d1a6809678b884e9297bccristy              break;
51158f753736c6261463b4d1a6809678b884e9297bccristy            }
51258f753736c6261463b4d1a6809678b884e9297bccristy            case LuvColorspace:
51358f753736c6261463b4d1a6809678b884e9297bccristy            {
51458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToLuv(red,green,blue,&X,&Y,&Z);
51558f753736c6261463b4d1a6809678b884e9297bccristy              break;
51658f753736c6261463b4d1a6809678b884e9297bccristy            }
5177894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy            case xyYColorspace:
5187894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy            {
5197894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy              ConvertRGBToxyY(red,green,blue,&X,&Y,&Z);
5207894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy              break;
5217894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy            }
52258f753736c6261463b4d1a6809678b884e9297bccristy            case XYZColorspace:
52358f753736c6261463b4d1a6809678b884e9297bccristy            {
52458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToXYZ(red,green,blue,&X,&Y,&Z);
52558f753736c6261463b4d1a6809678b884e9297bccristy              break;
52658f753736c6261463b4d1a6809678b884e9297bccristy            }
52758f753736c6261463b4d1a6809678b884e9297bccristy            case YCbCrColorspace:
52858f753736c6261463b4d1a6809678b884e9297bccristy            {
52958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToYCbCr(red,green,blue,&X,&Y,&Z);
53058f753736c6261463b4d1a6809678b884e9297bccristy              break;
53158f753736c6261463b4d1a6809678b884e9297bccristy            }
532c282d1b30162621c02ffe38060889a920027e870cristy            case YDbDrColorspace:
533c282d1b30162621c02ffe38060889a920027e870cristy            {
534c282d1b30162621c02ffe38060889a920027e870cristy              ConvertRGBToYDbDr(red,green,blue,&X,&Y,&Z);
535c282d1b30162621c02ffe38060889a920027e870cristy              break;
536c282d1b30162621c02ffe38060889a920027e870cristy            }
53758f753736c6261463b4d1a6809678b884e9297bccristy            case YIQColorspace:
53858f753736c6261463b4d1a6809678b884e9297bccristy            {
53958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToYIQ(red,green,blue,&X,&Y,&Z);
54058f753736c6261463b4d1a6809678b884e9297bccristy              break;
54158f753736c6261463b4d1a6809678b884e9297bccristy            }
54258f753736c6261463b4d1a6809678b884e9297bccristy            case YPbPrColorspace:
54358f753736c6261463b4d1a6809678b884e9297bccristy            {
54458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToYPbPr(red,green,blue,&X,&Y,&Z);
54558f753736c6261463b4d1a6809678b884e9297bccristy              break;
54658f753736c6261463b4d1a6809678b884e9297bccristy            }
54758f753736c6261463b4d1a6809678b884e9297bccristy            case YUVColorspace:
54858f753736c6261463b4d1a6809678b884e9297bccristy            {
54958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertRGBToYUV(red,green,blue,&X,&Y,&Z);
55058f753736c6261463b4d1a6809678b884e9297bccristy              break;
55158f753736c6261463b4d1a6809678b884e9297bccristy            }
552f147a5236a7d01b17d36afd5e15fd29679f3addfcristy            default:
553924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy            {
554924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy              X=QuantumScale*red;
555924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy              Y=QuantumScale*green;
556924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy              Z=QuantumScale*blue;
557f147a5236a7d01b17d36afd5e15fd29679f3addfcristy              break;
558924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy            }
559f147a5236a7d01b17d36afd5e15fd29679f3addfcristy          }
560f147a5236a7d01b17d36afd5e15fd29679f3addfcristy          SetPixelRed(image,ClampToQuantum(QuantumRange*X),q);
561f147a5236a7d01b17d36afd5e15fd29679f3addfcristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*Y),q);
562f147a5236a7d01b17d36afd5e15fd29679f3addfcristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*Z),q);
563722fc0cce634eb07588336accc3bb52979738a5ccristy          q+=GetPixelChannels(image);
564722fc0cce634eb07588336accc3bb52979738a5ccristy        }
565722fc0cce634eb07588336accc3bb52979738a5ccristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
566722fc0cce634eb07588336accc3bb52979738a5ccristy        if (sync == MagickFalse)
567722fc0cce634eb07588336accc3bb52979738a5ccristy          status=MagickFalse;
568722fc0cce634eb07588336accc3bb52979738a5ccristy      }
569722fc0cce634eb07588336accc3bb52979738a5ccristy      image_view=DestroyCacheView(image_view);
570722fc0cce634eb07588336accc3bb52979738a5ccristy      if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
571722fc0cce634eb07588336accc3bb52979738a5ccristy        return(MagickFalse);
572722fc0cce634eb07588336accc3bb52979738a5ccristy      return(status);
573722fc0cce634eb07588336accc3bb52979738a5ccristy    }
57458f753736c6261463b4d1a6809678b884e9297bccristy    case LogColorspace:
575af64eb219382bdf6243c4b8dc589268b8934304acristy    {
57658f753736c6261463b4d1a6809678b884e9297bccristy#define DisplayGamma  (1.0/1.7)
57758f753736c6261463b4d1a6809678b884e9297bccristy#define FilmGamma  0.6
57858f753736c6261463b4d1a6809678b884e9297bccristy#define ReferenceBlack  95.0
57958f753736c6261463b4d1a6809678b884e9297bccristy#define ReferenceWhite  685.0
580af64eb219382bdf6243c4b8dc589268b8934304acristy
58158f753736c6261463b4d1a6809678b884e9297bccristy      const char
58258f753736c6261463b4d1a6809678b884e9297bccristy        *value;
583af64eb219382bdf6243c4b8dc589268b8934304acristy
58458f753736c6261463b4d1a6809678b884e9297bccristy      double
58558f753736c6261463b4d1a6809678b884e9297bccristy        black,
58658f753736c6261463b4d1a6809678b884e9297bccristy        density,
58758f753736c6261463b4d1a6809678b884e9297bccristy        film_gamma,
58858f753736c6261463b4d1a6809678b884e9297bccristy        gamma,
58958f753736c6261463b4d1a6809678b884e9297bccristy        reference_black,
59058f753736c6261463b4d1a6809678b884e9297bccristy        reference_white;
591af64eb219382bdf6243c4b8dc589268b8934304acristy
59258f753736c6261463b4d1a6809678b884e9297bccristy      Quantum
59358f753736c6261463b4d1a6809678b884e9297bccristy        *logmap;
594af64eb219382bdf6243c4b8dc589268b8934304acristy
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
59658f753736c6261463b4d1a6809678b884e9297bccristy        Transform RGB to Log colorspace.
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
59858f753736c6261463b4d1a6809678b884e9297bccristy      density=DisplayGamma;
59958f753736c6261463b4d1a6809678b884e9297bccristy      gamma=DisplayGamma;
60058f753736c6261463b4d1a6809678b884e9297bccristy      value=GetImageProperty(image,"gamma",exception);
60158f753736c6261463b4d1a6809678b884e9297bccristy      if (value != (const char *) NULL)
60258f753736c6261463b4d1a6809678b884e9297bccristy        gamma=PerceptibleReciprocal(StringToDouble(value,(char **) NULL));
60358f753736c6261463b4d1a6809678b884e9297bccristy      film_gamma=FilmGamma;
60458f753736c6261463b4d1a6809678b884e9297bccristy      value=GetImageProperty(image,"film-gamma",exception);
60558f753736c6261463b4d1a6809678b884e9297bccristy      if (value != (const char *) NULL)
60658f753736c6261463b4d1a6809678b884e9297bccristy        film_gamma=StringToDouble(value,(char **) NULL);
60758f753736c6261463b4d1a6809678b884e9297bccristy      reference_black=ReferenceBlack;
60858f753736c6261463b4d1a6809678b884e9297bccristy      value=GetImageProperty(image,"reference-black",exception);
60958f753736c6261463b4d1a6809678b884e9297bccristy      if (value != (const char *) NULL)
61058f753736c6261463b4d1a6809678b884e9297bccristy        reference_black=StringToDouble(value,(char **) NULL);
61158f753736c6261463b4d1a6809678b884e9297bccristy      reference_white=ReferenceWhite;
61258f753736c6261463b4d1a6809678b884e9297bccristy      value=GetImageProperty(image,"reference-white",exception);
61358f753736c6261463b4d1a6809678b884e9297bccristy      if (value != (const char *) NULL)
61458f753736c6261463b4d1a6809678b884e9297bccristy        reference_white=StringToDouble(value,(char **) NULL);
61558f753736c6261463b4d1a6809678b884e9297bccristy      logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
61658f753736c6261463b4d1a6809678b884e9297bccristy        sizeof(*logmap));
61758f753736c6261463b4d1a6809678b884e9297bccristy      if (logmap == (Quantum *) NULL)
61858f753736c6261463b4d1a6809678b884e9297bccristy        ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
61958f753736c6261463b4d1a6809678b884e9297bccristy          image->filename);
62058f753736c6261463b4d1a6809678b884e9297bccristy      black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002/
62158f753736c6261463b4d1a6809678b884e9297bccristy        film_gamma);
62258f753736c6261463b4d1a6809678b884e9297bccristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
62358f753736c6261463b4d1a6809678b884e9297bccristy      #pragma omp parallel for schedule(static,4) \
62458f753736c6261463b4d1a6809678b884e9297bccristy        magick_threads(image,image,1,1)
62558f753736c6261463b4d1a6809678b884e9297bccristy#endif
62658f753736c6261463b4d1a6809678b884e9297bccristy      for (i=0; i <= (ssize_t) MaxMap; i++)
62758f753736c6261463b4d1a6809678b884e9297bccristy        logmap[i]=ScaleMapToQuantum((double) (MaxMap*(reference_white+
62858f753736c6261463b4d1a6809678b884e9297bccristy          log10(black+(1.0*i/MaxMap)*(1.0-black))/((gamma/density)*0.002/
62958f753736c6261463b4d1a6809678b884e9297bccristy          film_gamma))/1024.0));
63046ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
631b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
632ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy      #pragma omp parallel for schedule(static,4) shared(status) \
6335e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
635bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
637564a56979706a30a3d0f920fd5f538a408efd4f1cristy        MagickBooleanType
638564a56979706a30a3d0f920fd5f538a408efd4f1cristy          sync;
639564a56979706a30a3d0f920fd5f538a408efd4f1cristy
640bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x;
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6434c08aed51c5899665ade97263692328eea4af106cristy        register Quantum
64405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          exception);
650acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=MagickFalse;
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
65558f753736c6261463b4d1a6809678b884e9297bccristy        for (x=(ssize_t) image->columns; x != 0; x--)
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6570a39a5c567fca70403bc431d18890e89fc253eefcristy          double
6580a39a5c567fca70403bc431d18890e89fc253eefcristy            blue,
6590a39a5c567fca70403bc431d18890e89fc253eefcristy            green,
660e1ca83966a785a952a4f056f6047a91389ee99a3cristy            red;
6610a39a5c567fca70403bc431d18890e89fc253eefcristy
662aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy          red=(double) DecodePixelGamma((MagickRealType)
663aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy            GetPixelRed(image,q));
664aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy          green=(double) DecodePixelGamma((MagickRealType)
665aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy            GetPixelGreen(image,q));
666aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy          blue=(double) DecodePixelGamma((MagickRealType)
667aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy            GetPixelBlue(image,q));
66858f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelRed(image,logmap[ScaleQuantumToMap(ClampToQuantum(red))],q);
66958f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelGreen(image,logmap[ScaleQuantumToMap(ClampToQuantum(green))],
67058f753736c6261463b4d1a6809678b884e9297bccristy            q);
67158f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelBlue(image,logmap[ScaleQuantumToMap(ClampToQuantum(blue))],q);
672ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (sync == MagickFalse)
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_view=DestroyCacheView(image_view);
67958f753736c6261463b4d1a6809678b884e9297bccristy      logmap=(Quantum *) RelinquishMagickMemory(logmap);
680056109f147080d50be6381308725cf46402a0c45cristy      if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
681056109f147080d50be6381308725cf46402a0c45cristy        return(MagickFalse);
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(status);
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
68458f753736c6261463b4d1a6809678b884e9297bccristy    case RGBColorspace:
68558f753736c6261463b4d1a6809678b884e9297bccristy    case scRGBColorspace:
686246c3135a833b00ed2e42448c85cc2ea1269b177cristy    {
687246c3135a833b00ed2e42448c85cc2ea1269b177cristy      /*
68858f753736c6261463b4d1a6809678b884e9297bccristy        Transform image from sRGB to linear RGB.
689246c3135a833b00ed2e42448c85cc2ea1269b177cristy      */
690246c3135a833b00ed2e42448c85cc2ea1269b177cristy      if (image->storage_class == PseudoClass)
691246c3135a833b00ed2e42448c85cc2ea1269b177cristy        {
692246c3135a833b00ed2e42448c85cc2ea1269b177cristy          if (SyncImage(image,exception) == MagickFalse)
693246c3135a833b00ed2e42448c85cc2ea1269b177cristy            return(MagickFalse);
694246c3135a833b00ed2e42448c85cc2ea1269b177cristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
695246c3135a833b00ed2e42448c85cc2ea1269b177cristy            return(MagickFalse);
696246c3135a833b00ed2e42448c85cc2ea1269b177cristy        }
697246c3135a833b00ed2e42448c85cc2ea1269b177cristy      image_view=AcquireAuthenticCacheView(image,exception);
698246c3135a833b00ed2e42448c85cc2ea1269b177cristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
699246c3135a833b00ed2e42448c85cc2ea1269b177cristy      #pragma omp parallel for schedule(static,4) shared(status) \
700246c3135a833b00ed2e42448c85cc2ea1269b177cristy        magick_threads(image,image,image->rows,1)
701246c3135a833b00ed2e42448c85cc2ea1269b177cristy#endif
702246c3135a833b00ed2e42448c85cc2ea1269b177cristy      for (y=0; y < (ssize_t) image->rows; y++)
703246c3135a833b00ed2e42448c85cc2ea1269b177cristy      {
704246c3135a833b00ed2e42448c85cc2ea1269b177cristy        MagickBooleanType
705246c3135a833b00ed2e42448c85cc2ea1269b177cristy          sync;
706246c3135a833b00ed2e42448c85cc2ea1269b177cristy
707246c3135a833b00ed2e42448c85cc2ea1269b177cristy        register ssize_t
708246c3135a833b00ed2e42448c85cc2ea1269b177cristy          x;
709246c3135a833b00ed2e42448c85cc2ea1269b177cristy
710246c3135a833b00ed2e42448c85cc2ea1269b177cristy        register Quantum
71105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
712246c3135a833b00ed2e42448c85cc2ea1269b177cristy
713246c3135a833b00ed2e42448c85cc2ea1269b177cristy        if (status == MagickFalse)
714246c3135a833b00ed2e42448c85cc2ea1269b177cristy          continue;
715246c3135a833b00ed2e42448c85cc2ea1269b177cristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
716246c3135a833b00ed2e42448c85cc2ea1269b177cristy          exception);
717246c3135a833b00ed2e42448c85cc2ea1269b177cristy        if (q == (Quantum *) NULL)
718246c3135a833b00ed2e42448c85cc2ea1269b177cristy          {
719246c3135a833b00ed2e42448c85cc2ea1269b177cristy            status=MagickFalse;
720246c3135a833b00ed2e42448c85cc2ea1269b177cristy            continue;
721246c3135a833b00ed2e42448c85cc2ea1269b177cristy          }
722246c3135a833b00ed2e42448c85cc2ea1269b177cristy        for (x=0; x < (ssize_t) image->columns; x++)
723246c3135a833b00ed2e42448c85cc2ea1269b177cristy        {
724246c3135a833b00ed2e42448c85cc2ea1269b177cristy          double
725246c3135a833b00ed2e42448c85cc2ea1269b177cristy            blue,
726246c3135a833b00ed2e42448c85cc2ea1269b177cristy            green,
727e1ca83966a785a952a4f056f6047a91389ee99a3cristy            red;
728246c3135a833b00ed2e42448c85cc2ea1269b177cristy
72958f753736c6261463b4d1a6809678b884e9297bccristy          red=DecodePixelGamma((MagickRealType) GetPixelRed(image,q));
73058f753736c6261463b4d1a6809678b884e9297bccristy          green=DecodePixelGamma((MagickRealType) GetPixelGreen(image,q));
73158f753736c6261463b4d1a6809678b884e9297bccristy          blue=DecodePixelGamma((MagickRealType) GetPixelBlue(image,q));
73258f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelRed(image,ClampToQuantum(red),q);
73358f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelGreen(image,ClampToQuantum(green),q);
73458f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelBlue(image,ClampToQuantum(blue),q);
735246c3135a833b00ed2e42448c85cc2ea1269b177cristy          q+=GetPixelChannels(image);
736246c3135a833b00ed2e42448c85cc2ea1269b177cristy        }
737246c3135a833b00ed2e42448c85cc2ea1269b177cristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
738246c3135a833b00ed2e42448c85cc2ea1269b177cristy        if (sync == MagickFalse)
739246c3135a833b00ed2e42448c85cc2ea1269b177cristy          status=MagickFalse;
740246c3135a833b00ed2e42448c85cc2ea1269b177cristy      }
741246c3135a833b00ed2e42448c85cc2ea1269b177cristy      image_view=DestroyCacheView(image_view);
742246c3135a833b00ed2e42448c85cc2ea1269b177cristy      if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
743246c3135a833b00ed2e42448c85cc2ea1269b177cristy        return(MagickFalse);
744246c3135a833b00ed2e42448c85cc2ea1269b177cristy      return(status);
745246c3135a833b00ed2e42448c85cc2ea1269b177cristy    }
74658f753736c6261463b4d1a6809678b884e9297bccristy    default:
74758f753736c6261463b4d1a6809678b884e9297bccristy      break;
74858f753736c6261463b4d1a6809678b884e9297bccristy  }
74958f753736c6261463b4d1a6809678b884e9297bccristy  /*
75058f753736c6261463b4d1a6809678b884e9297bccristy    Allocate the tables.
75158f753736c6261463b4d1a6809678b884e9297bccristy  */
75258f753736c6261463b4d1a6809678b884e9297bccristy  x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
75358f753736c6261463b4d1a6809678b884e9297bccristy    sizeof(*x_map));
75458f753736c6261463b4d1a6809678b884e9297bccristy  y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
75558f753736c6261463b4d1a6809678b884e9297bccristy    sizeof(*y_map));
75658f753736c6261463b4d1a6809678b884e9297bccristy  z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
75758f753736c6261463b4d1a6809678b884e9297bccristy    sizeof(*z_map));
75858f753736c6261463b4d1a6809678b884e9297bccristy  if ((x_map == (TransformPacket *) NULL) ||
75958f753736c6261463b4d1a6809678b884e9297bccristy      (y_map == (TransformPacket *) NULL) ||
76058f753736c6261463b4d1a6809678b884e9297bccristy      (z_map == (TransformPacket *) NULL))
76158f753736c6261463b4d1a6809678b884e9297bccristy    ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
76258f753736c6261463b4d1a6809678b884e9297bccristy      image->filename);
76358f753736c6261463b4d1a6809678b884e9297bccristy  (void) ResetMagickMemory(&primary_info,0,sizeof(primary_info));
76458f753736c6261463b4d1a6809678b884e9297bccristy  switch (colorspace)
76558f753736c6261463b4d1a6809678b884e9297bccristy  {
76658f753736c6261463b4d1a6809678b884e9297bccristy    case OHTAColorspace:
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
76958f753736c6261463b4d1a6809678b884e9297bccristy        Initialize OHTA tables:
77058f753736c6261463b4d1a6809678b884e9297bccristy
77158f753736c6261463b4d1a6809678b884e9297bccristy          I1 = 0.33333*R+0.33334*G+0.33333*B
77258f753736c6261463b4d1a6809678b884e9297bccristy          I2 = 0.50000*R+0.00000*G-0.50000*B
77358f753736c6261463b4d1a6809678b884e9297bccristy          I3 =-0.25000*R+0.50000*G-0.25000*B
77458f753736c6261463b4d1a6809678b884e9297bccristy
77558f753736c6261463b4d1a6809678b884e9297bccristy        I and Q, normally -0.5 through 0.5, are normalized to the range 0
77658f753736c6261463b4d1a6809678b884e9297bccristy        through QuantumRange.
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
77858f753736c6261463b4d1a6809678b884e9297bccristy      primary_info.y=(double) (MaxMap+1.0)/2.0;
77958f753736c6261463b4d1a6809678b884e9297bccristy      primary_info.z=(double) (MaxMap+1.0)/2.0;
780b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
78158f753736c6261463b4d1a6809678b884e9297bccristy      #pragma omp parallel for schedule(static,4) \
78258f753736c6261463b4d1a6809678b884e9297bccristy        magick_threads(image,image,1,1)
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
78458f753736c6261463b4d1a6809678b884e9297bccristy      for (i=0; i <= (ssize_t) MaxMap; i++)
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
786014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=(MagickRealType) (0.33333*(double) i);
787014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].x=(MagickRealType) (0.33334*(double) i);
788014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].x=(MagickRealType) (0.33333*(double) i);
789014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=(MagickRealType) (0.50000*(double) i);
790014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=(MagickRealType) (0.00000*(double) i);
791014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].y=(MagickRealType) (-0.50000*(double) i);
792014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=(MagickRealType) (-0.25000*(double) i);
793014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].z=(MagickRealType) (0.50000*(double) i);
794014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].z=(MagickRealType) (-0.25000*(double) i);
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case Rec601YCbCrColorspace:
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize YCbCr tables (ITU-R BT.601):
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
80315ec6a6017605cda2b8c9f875c7d4183eb251a4bcristy          Y =  0.2988390*R+0.5868110*G+0.1143500*B
8045e7a882c8ba6f681384a6f930e513d181fe3caa6cristy          Cb= -0.1687367*R-0.3312640*G+0.5000000*B
8055e7a882c8ba6f681384a6f930e513d181fe3caa6cristy          Cr=  0.5000000*R-0.4186880*G-0.0813120*B
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        through QuantumRange.
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
810014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      primary_info.y=(double) (MaxMap+1.0)/2.0;
811014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      primary_info.z=(double) (MaxMap+1.0)/2.0;
81226b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
8139a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
814cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
816bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i <= (ssize_t) MaxMap; i++)
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
818014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=(MagickRealType) (0.298839*(double) i);
819014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].x=(MagickRealType) (0.586811*(double) i);
820014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].x=(MagickRealType) (0.114350*(double) i);
821014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=(MagickRealType) (-0.1687367*(double) i);
822014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=(MagickRealType) (-0.331264*(double) i);
823014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].y=(MagickRealType) (0.500000*(double) i);
824014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=(MagickRealType) (0.500000*(double) i);
825014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].z=(MagickRealType) (-0.418688*(double) i);
826014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].z=(MagickRealType) (-0.081312*(double) i);
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case Rec709YCbCrColorspace:
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize YCbCr tables (ITU-R BT.709):
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8351352acf3bec61a13875a2d020306ad6339686040cristy          Y =  0.212656*R+0.715158*G+0.072186*B
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Cb= -0.114572*R-0.385428*G+0.500000*B
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Cr=  0.500000*R-0.454153*G-0.045847*B
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Cb and Cr, normally -0.5 through 0.5, are normalized to the range 0
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        through QuantumRange.
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
842014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      primary_info.y=(double) (MaxMap+1.0)/2.0;
843014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      primary_info.z=(double) (MaxMap+1.0)/2.0;
84426b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
8459a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
846cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
848bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i <= (ssize_t) MaxMap; i++)
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8501352acf3bec61a13875a2d020306ad6339686040cristy        x_map[i].x=(MagickRealType) (0.212656*(double) i);
8511352acf3bec61a13875a2d020306ad6339686040cristy        y_map[i].x=(MagickRealType) (0.715158*(double) i);
8521352acf3bec61a13875a2d020306ad6339686040cristy        z_map[i].x=(MagickRealType) (0.072186*(double) i);
853014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=(MagickRealType) (-0.114572*(double) i);
854014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=(MagickRealType) (-0.385428*(double) i);
855014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].y=(MagickRealType) (0.500000*(double) i);
856014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=(MagickRealType) (0.500000*(double) i);
857014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].z=(MagickRealType) (-0.454153*(double) i);
858014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].z=(MagickRealType) (-0.045847*(double) i);
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case YCCColorspace:
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize YCC tables:
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
867014ead1df2405e1d18615f2b9fd92e29c812fd31cristy          Y =  0.298839*R+0.586811*G+0.114350*B
868014ead1df2405e1d18615f2b9fd92e29c812fd31cristy          C1= -0.298839*R-0.586811*G+0.88600*B
869014ead1df2405e1d18615f2b9fd92e29c812fd31cristy          C2=  0.70100*R-0.586811*G-0.114350*B
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        YCC is scaled by 1.3584.  C1 zero is 156 and C2 is at 137.
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      primary_info.y=(double) ScaleQuantumToMap(ScaleCharToQuantum(156));
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      primary_info.z=(double) ScaleQuantumToMap(ScaleCharToQuantum(137));
875014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      for (i=0; i <= (ssize_t) (0.018*MaxMap); i++)
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
87758feadf230852d0cdcba6f88e83e95382d116fe8cristy        x_map[i].x=0.003962014134275617*i;
87858feadf230852d0cdcba6f88e83e95382d116fe8cristy        y_map[i].x=0.007778268551236748*i;
87958feadf230852d0cdcba6f88e83e95382d116fe8cristy        z_map[i].x=0.001510600706713781*i;
88058feadf230852d0cdcba6f88e83e95382d116fe8cristy        x_map[i].y=(-0.002426619775463276)*i;
88158feadf230852d0cdcba6f88e83e95382d116fe8cristy        y_map[i].y=(-0.004763965913702149)*i;
88258feadf230852d0cdcba6f88e83e95382d116fe8cristy        z_map[i].y=0.007190585689165425*i;
88358feadf230852d0cdcba6f88e83e95382d116fe8cristy        x_map[i].z=0.006927257754597858*i;
88458feadf230852d0cdcba6f88e83e95382d116fe8cristy        y_map[i].z=(-0.005800713697502058)*i;
88558feadf230852d0cdcba6f88e83e95382d116fe8cristy        z_map[i].z=(-0.0011265440570958)*i;
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
887bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for ( ; i <= (ssize_t) MaxMap; i++)
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
88958feadf230852d0cdcba6f88e83e95382d116fe8cristy        x_map[i].x=0.2201118963486454*(1.099*i-0.099);
89058feadf230852d0cdcba6f88e83e95382d116fe8cristy        y_map[i].x=0.4321260306242638*(1.099*i-0.099);
89158f753736c6261463b4d1a6809678b884e9297bccristy        z_map[i].x=0.08392226148409894*(1.099*i-0.099);
89258f753736c6261463b4d1a6809678b884e9297bccristy        x_map[i].y=(-0.1348122097479598)*(1.099*i-0.099);
89358f753736c6261463b4d1a6809678b884e9297bccristy        y_map[i].y=(-0.2646647729834528)*(1.099*i-0.099);
89458f753736c6261463b4d1a6809678b884e9297bccristy        z_map[i].y=0.3994769827314126*(1.099*i-0.099);
89558f753736c6261463b4d1a6809678b884e9297bccristy        x_map[i].z=0.3848476530332144*(1.099*i-0.099);
89658f753736c6261463b4d1a6809678b884e9297bccristy        y_map[i].z=(-0.3222618720834477)*(1.099*i-0.099);
89758f753736c6261463b4d1a6809678b884e9297bccristy        z_map[i].z=(-0.06258578094976668)*(1.099*i-0.099);
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
901e12425c5ef644a03fa2772e8c053716e2a7c34dacristy    default:
902e12425c5ef644a03fa2772e8c053716e2a7c34dacristy    {
903e12425c5ef644a03fa2772e8c053716e2a7c34dacristy      /*
904e12425c5ef644a03fa2772e8c053716e2a7c34dacristy        Linear conversion tables.
905e12425c5ef644a03fa2772e8c053716e2a7c34dacristy      */
90626b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
9079a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
908cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
909e12425c5ef644a03fa2772e8c053716e2a7c34dacristy#endif
910e12425c5ef644a03fa2772e8c053716e2a7c34dacristy      for (i=0; i <= (ssize_t) MaxMap; i++)
911e12425c5ef644a03fa2772e8c053716e2a7c34dacristy      {
912014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=(MagickRealType) (1.0*(double) i);
913014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].x=(MagickRealType) 0.0;
914014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].x=(MagickRealType) 0.0;
915014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=(MagickRealType) 0.0;
916014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=(MagickRealType) (1.0*(double) i);
917014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].y=(MagickRealType) 0.0;
918014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=(MagickRealType) 0.0;
919014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].z=(MagickRealType) 0.0;
920014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].z=(MagickRealType) (1.0*(double) i);
921e12425c5ef644a03fa2772e8c053716e2a7c34dacristy      }
922e12425c5ef644a03fa2772e8c053716e2a7c34dacristy      break;
923e12425c5ef644a03fa2772e8c053716e2a7c34dacristy    }
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
92606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    Convert from sRGB.
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (image->storage_class)
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case DirectClass:
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert DirectClass image.
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
93646ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
937b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
938ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy      #pragma omp parallel for schedule(static,4) shared(status) \
9395e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
941bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
943564a56979706a30a3d0f920fd5f538a408efd4f1cristy        MagickBooleanType
944564a56979706a30a3d0f920fd5f538a408efd4f1cristy          sync;
945564a56979706a30a3d0f920fd5f538a408efd4f1cristy
9464c08aed51c5899665ade97263692328eea4af106cristy        PixelInfo
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel;
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9494c08aed51c5899665ade97263692328eea4af106cristy        register Quantum
95005d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
952751f8d7a6176ee931b122b84a6b1274d29cdce99cristy        register ssize_t
953751f8d7a6176ee931b122b84a6b1274d29cdce99cristy          x;
954751f8d7a6176ee931b122b84a6b1274d29cdce99cristy
955410e892ae33154fbc3f1607e5ae6574b66013ed6cristy        register unsigned int
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          blue,
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          green,
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          red;
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          exception);
964acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=MagickFalse;
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
969bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
971251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          red=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
97258f753736c6261463b4d1a6809678b884e9297bccristy            GetPixelRed(image,q)));
973251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          green=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
974251743b0a8fc495a0b32a953667f0e4f257f0c45cristy            GetPixelGreen(image,q)));
975251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          blue=ScaleQuantumToMap(ClampToQuantum((MagickRealType)
976251743b0a8fc495a0b32a953667f0e4f257f0c45cristy            GetPixelBlue(image,q)));
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel.red=(x_map[red].x+y_map[green].x+z_map[blue].x)+
978c22b76bc232ab9faacee021b662b9d306dd0c344cristy            primary_info.x;
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel.green=(x_map[red].y+y_map[green].y+z_map[blue].y)+
980c22b76bc232ab9faacee021b662b9d306dd0c344cristy            primary_info.y;
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel.blue=(x_map[red].z+y_map[green].z+z_map[blue].z)+
982c22b76bc232ab9faacee021b662b9d306dd0c344cristy            primary_info.z;
9834c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(image,ScaleMapToQuantum(pixel.red),q);
9844c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(image,ScaleMapToQuantum(pixel.green),q);
9854c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(image,ScaleMapToQuantum(pixel.blue),q);
986ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (sync == MagickFalse)
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->progress_monitor != (MagickProgressMonitor) NULL)
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            MagickBooleanType
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              proceed;
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
996b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
997501c5597e8d10b6102a4566f2740f4166bdd545fcristy            #pragma omp critical (MagickCore_sRGBTransformImage)
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
999501c5597e8d10b6102a4566f2740f4166bdd545fcristy            proceed=SetImageProgress(image,sRGBTransformImageTag,progress++,
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (proceed == MagickFalse)
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              status=MagickFalse;
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_view=DestroyCacheView(image_view);
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PseudoClass:
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1010a56a3b56f35752cb18be41109fbfc4e032a8ffeccristy      register unsigned int
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        blue,
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        green,
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        red;
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoClass image.
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1018bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10204c08aed51c5899665ade97263692328eea4af106cristy        PixelInfo
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel;
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1023251743b0a8fc495a0b32a953667f0e4f257f0c45cristy        red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
1024251743b0a8fc495a0b32a953667f0e4f257f0c45cristy        green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
1025251743b0a8fc495a0b32a953667f0e4f257f0c45cristy        blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x+primary_info.x;
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y+primary_info.y;
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z+primary_info.z;
1029564a56979706a30a3d0f920fd5f538a408efd4f1cristy        image->colormap[i].red=(double) ScaleMapToQuantum(pixel.red);
1030564a56979706a30a3d0f920fd5f538a408efd4f1cristy        image->colormap[i].green=(double) ScaleMapToQuantum(pixel.green);
1031564a56979706a30a3d0f920fd5f538a408efd4f1cristy        image->colormap[i].blue=(double) ScaleMapToQuantum(pixel.blue);
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1033ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Relinquish resources.
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
104363240888c3975789a09c2494a4654b523931df96cristy  if (SetImageColorspace(image,colorspace,exception) == MagickFalse)
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t I m a g e C o l o r s p a c e                                       %
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetImageColorspace() sets the colorspace member of the Image structure.
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetImageColorspace method is:
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType SetImageColorspace(Image *image,
106463240888c3975789a09c2494a4654b523931df96cristy%        const ColorspaceType colorspace,ExceptiionInfo *exception)
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colorspace: the colorspace.
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
107263240888c3975789a09c2494a4654b523931df96cristy%   o exception: return any errors or warnings in this structure.
107363240888c3975789a09c2494a4654b523931df96cristy%
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType SetImageColorspace(Image *image,
107663240888c3975789a09c2494a4654b523931df96cristy  const ColorspaceType colorspace,ExceptionInfo *exception)
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10787c93b6e6750886590d097a0af2a65435b5228e38cristy  ImageType
10797c93b6e6750886590d097a0af2a65435b5228e38cristy    type;
10807c93b6e6750886590d097a0af2a65435b5228e38cristy
10817c93b6e6750886590d097a0af2a65435b5228e38cristy  MagickBooleanType
10827c93b6e6750886590d097a0af2a65435b5228e38cristy    status;
10837c93b6e6750886590d097a0af2a65435b5228e38cristy
1084c3e2776758fc670833ed797cdaef2ea256f7d7eccristy  if (image->colorspace == colorspace)
1085c3e2776758fc670833ed797cdaef2ea256f7d7eccristy    return(MagickTrue);
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colorspace=colorspace;
1087e2c4f18a7274c0c5c6231a2f3d73741a87d583facristy  image->rendering_intent=UndefinedIntent;
1088ca9ccb9cb4b17a7fcdb2b5aa6d29b7c18ae4cfdbcristy  image->gamma=1.000/2.200;
10896b758b46685e1896ac8655597d8622b7662dded8cristy  (void) ResetMagickMemory(&image->chromaticity,0,sizeof(image->chromaticity));
10907c93b6e6750886590d097a0af2a65435b5228e38cristy  type=image->type;
10915836c745cb2a19e3ee34905292f7c08dac74ffc6cristy  if (IsGrayColorspace(colorspace) != MagickFalse)
10925836c745cb2a19e3ee34905292f7c08dac74ffc6cristy    {
1093ca9ccb9cb4b17a7fcdb2b5aa6d29b7c18ae4cfdbcristy      if ((image->intensity == Rec601LuminancePixelIntensityMethod) ||
1094ca9ccb9cb4b17a7fcdb2b5aa6d29b7c18ae4cfdbcristy          (image->intensity == Rec709LuminancePixelIntensityMethod))
1095ca9ccb9cb4b17a7fcdb2b5aa6d29b7c18ae4cfdbcristy        image->gamma=1.000;
10967c93b6e6750886590d097a0af2a65435b5228e38cristy      type=GrayscaleType;
10975836c745cb2a19e3ee34905292f7c08dac74ffc6cristy    }
10985836c745cb2a19e3ee34905292f7c08dac74ffc6cristy  else
1099e7c9de6f82fce2ad3b6640102ed13c4cc06d5969cristy    if ((IsRGBColorspace(colorspace) != MagickFalse) ||
11007894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy        (colorspace == XYZColorspace) || (colorspace == xyYColorspace))
1101ca9ccb9cb4b17a7fcdb2b5aa6d29b7c18ae4cfdbcristy      image->gamma=1.000;
110223ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy    else
110323ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy      {
110423ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->rendering_intent=PerceptualIntent;
110523ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.red_primary.x=0.6400;
110623ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.red_primary.y=0.3300;
110723ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.red_primary.z=0.0300;
110823ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.green_primary.x=0.3000;
110923ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.green_primary.y=0.6000;
111023ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.green_primary.z=0.1000;
111123ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.blue_primary.x=0.1500;
111223ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.blue_primary.y=0.0600;
111323ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.blue_primary.z=0.7900;
111423ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.white_point.x=0.3127;
111523ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.white_point.y=0.3290;
111623ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy        image->chromaticity.white_point.z=0.3583;
111723ce97f2f4a401b8eb431cf7b9f8d2eb81da6474cristy      }
11187c93b6e6750886590d097a0af2a65435b5228e38cristy  status=SyncImagePixelCache(image,exception);
11197c93b6e6750886590d097a0af2a65435b5228e38cristy  image->type=type;
11207c93b6e6750886590d097a0af2a65435b5228e38cristy  return(status);
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1122ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk
1123ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk/*
1124ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1125ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1126ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1127ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1128ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%     S e t I m a g e G r a y                                                 %
1129ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1130ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1131ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1132ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1133ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1134ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  SetImageGray() returns MagickTrue if all the pixels in the image have the
1135ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  same red, green, and blue intensities and changes the type of the image to
1136ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  bi-level or grayscale.
1137ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1138ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  The format of the SetImageGray method is:
1139ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1140ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%      MagickBooleanType SetImageGray(const Image *image,
1141ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%        ExceptionInfo *exception)
1142ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1143ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  A description of each parameter follows:
1144ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1145ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%    o image: the image.
1146ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1147ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%    o exception: return any errors or warnings in this structure.
1148ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1149ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk*/
1150ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirkMagickExport MagickBooleanType SetImageGray(Image *image,
1151ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  ExceptionInfo *exception)
1152ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk{
1153c307221da137c1c9dd34729878a4a956ef29e038dirk  const char
1154c307221da137c1c9dd34729878a4a956ef29e038dirk    *value;
1155c307221da137c1c9dd34729878a4a956ef29e038dirk
1156ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  ImageType
1157ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    type;
1158ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk
1159ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  assert(image != (Image *) NULL);
1160ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  assert(image->signature == MagickCoreSignature);
1161ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (image->debug != MagickFalse)
1162ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1163ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (IsImageGray(image))
1164ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickTrue);
1165ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1166ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickFalse);
1167c307221da137c1c9dd34729878a4a956ef29e038dirk  value=GetImageProperty(image,"colorspace:auto-grayscale",exception);
1168c307221da137c1c9dd34729878a4a956ef29e038dirk  if (IsStringFalse(value) != MagickFalse)
1169c307221da137c1c9dd34729878a4a956ef29e038dirk    return(MagickFalse);
1170ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  type=IdentifyImageGray(image,exception);
1171ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (type == UndefinedType)
1172ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickFalse);
1173ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  image->colorspace=GRAYColorspace;
1174ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (SyncImagePixelCache((Image *) image,exception) == MagickFalse)
1175ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickFalse);
1176ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  image->type=type;
1177ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  return(MagickTrue);
1178ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk}
1179ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk
1180ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk/*
1181ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1182ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1183ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1184ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1185ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%   S e t I m a g e M o n o c h r o m e                                       %
1186ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1187ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1188ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%                                                                             %
1189ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1190ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1191ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  SetImageMonochrome() returns MagickTrue if all the pixels in the image have
1192ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  the same red, green, and blue intensities and the intensity is either
1193ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  0 or QuantumRange and changes the type of the image to bi-level.
1194ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1195ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  The format of the SetImageMonochrome method is:
1196ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1197ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%      MagickBooleanType SetImageMonochrome(Image *image,
1198ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%        ExceptionInfo *exception)
1199ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1200ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%  A description of each parameter follows:
1201ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1202ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%    o image: the image.
1203ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1204ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%    o exception: return any errors or warnings in this structure.
1205ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk%
1206ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk*/
1207ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirkMagickExport MagickBooleanType SetImageMonochrome(Image *image,
1208ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  ExceptionInfo *exception)
1209ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk{
1210c307221da137c1c9dd34729878a4a956ef29e038dirk  const char
1211c307221da137c1c9dd34729878a4a956ef29e038dirk    *value;
1212c307221da137c1c9dd34729878a4a956ef29e038dirk
1213ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  assert(image != (Image *) NULL);
1214ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  assert(image->signature == MagickCoreSignature);
1215ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (image->debug != MagickFalse)
1216ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1217ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (image->type == BilevelType)
1218ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickTrue);
1219ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse)
1220ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickFalse);
1221c307221da137c1c9dd34729878a4a956ef29e038dirk  value=GetImageProperty(image,"colorspace:auto-grayscale",exception);
1222c307221da137c1c9dd34729878a4a956ef29e038dirk  if (IsStringFalse(value) != MagickFalse)
1223c307221da137c1c9dd34729878a4a956ef29e038dirk    return(MagickFalse);
1224ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (IdentifyImageMonochrome(image,exception) == MagickFalse)
1225ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickFalse);
1226ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  image->colorspace=GRAYColorspace;
1227ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  if (SyncImagePixelCache((Image *) image,exception) == MagickFalse)
1228ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk    return(MagickFalse);
1229ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  image->type=BilevelType;
1230ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk  return(MagickTrue);
1231ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk}
1232ab4f0bb4e2c2d3e3e61408499755fa710f15e18fdirk
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   T r a n s f o r m I m a g e C o l o r s p a c e                           %
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1244f674cda7a4407d795024d9491896c97802cd29c3anthony%  TransformImageColorspace() transforms an image colorspace, changing the
1245f674cda7a4407d795024d9491896c97802cd29c3anthony%  image data to reflect the new colorspace.
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the TransformImageColorspace method is:
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType TransformImageColorspace(Image *image,
1250e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%        const ColorspaceType colorspace,ExceptionInfo *exception)
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o colorspace: the colorspace.
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1258e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%   o exception: return any errors or warnings in this structure.
1259e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy%
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType TransformImageColorspace(Image *image,
1262e941a75fe8bf344bc5c06a7f74bb5173c87db115cristy  const ColorspaceType colorspace,ExceptionInfo *exception)
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
1268e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1271cfbd89d9bb001dbf3be37d8c08d4f3f8574de526dirk  if (image->colorspace == colorspace)
1272d646b9792d9bb22750ee1c7f3b180c6eb101fdcbcristy    return(SetImageColorspace(image,colorspace,exception));
12731ee04e5da7a176af349f8475423f6c6ebdad6135dirk  if ((image->colorspace == GRAYColorspace) && (image->gamma != 1.0) &&
12741ee04e5da7a176af349f8475423f6c6ebdad6135dirk      (colorspace == sRGBColorspace))
1275d646b9792d9bb22750ee1c7f3b180c6eb101fdcbcristy    return(SetImageColorspace(image,colorspace,exception));
12767f8077501b6b65f12083ca68c571a0876ae8b1f7cristy  if (colorspace == UndefinedColorspace)
12777f8077501b6b65f12083ca68c571a0876ae8b1f7cristy    return(SetImageColorspace(image,colorspace,exception));
1278d54fd82b3fc1c0e50569b15d9ffc1c95502a1e18cristy  /*
1279f674cda7a4407d795024d9491896c97802cd29c3anthony    Convert the reference image from an alternate colorspace to sRGB.
1280d54fd82b3fc1c0e50569b15d9ffc1c95502a1e18cristy  */
128168b0159512835bf021752697e1fff1ece99de592cristy  (void) DeleteImageProfile(image,"icc");
128268b0159512835bf021752697e1fff1ece99de592cristy  (void) DeleteImageProfile(image,"icm");
1283e2c4f18a7274c0c5c6231a2f3d73741a87d583facristy  if (IssRGBColorspace(colorspace) != MagickFalse)
1284b0de93fdedaac769cb08e15b3ec176d4c9078907cristy    return(TransformsRGBImage(image,exception));
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
1286501c5597e8d10b6102a4566f2740f4166bdd545fcristy  if (IssRGBColorspace(image->colorspace) == MagickFalse)
1287b0de93fdedaac769cb08e15b3ec176d4c9078907cristy    status=TransformsRGBImage(image,exception);
128879b6cd921d1222325b32aec8dcf5f166fdc9655ecristy  if (status == MagickFalse)
128979b6cd921d1222325b32aec8dcf5f166fdc9655ecristy    return(status);
1290d54fd82b3fc1c0e50569b15d9ffc1c95502a1e18cristy  /*
1291f674cda7a4407d795024d9491896c97802cd29c3anthony    Convert the reference image from sRGB to an alternate colorspace.
1292d54fd82b3fc1c0e50569b15d9ffc1c95502a1e18cristy  */
1293501c5597e8d10b6102a4566f2740f4166bdd545fcristy  if (sRGBTransformImage(image,colorspace,exception) == MagickFalse)
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=MagickFalse;
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1303501c5597e8d10b6102a4566f2740f4166bdd545fcristy+     T r a n s f o r m s R G B I m a g e                                     %
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1309501c5597e8d10b6102a4566f2740f4166bdd545fcristy%  TransformsRGBImage() converts the reference image from an alternate
1310e540eb40f06c3d227c496426c8b7d5f190230146cristy%  colorspace to sRGB.  The transformation matrices are not the standard ones:
1311f674cda7a4407d795024d9491896c97802cd29c3anthony%  the weights are rescaled to normalize the range of the transformed values
1312f674cda7a4407d795024d9491896c97802cd29c3anthony%  to be [0..QuantumRange].
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1314501c5597e8d10b6102a4566f2740f4166bdd545fcristy%  The format of the TransformsRGBImage method is:
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1316501c5597e8d10b6102a4566f2740f4166bdd545fcristy%      MagickBooleanType TransformsRGBImage(Image *image,
1317b0de93fdedaac769cb08e15b3ec176d4c9078907cristy%        ExceptionInfo *exception)
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
132318873883644b381f64ff76a1dffeef1f284c1101cristy%   o exception: return any errors or warnings in this structure.
132418873883644b381f64ff76a1dffeef1f284c1101cristy%
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1327ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristystatic inline void ConvertCMYToRGB(const double cyan,const double magenta,
1328ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  const double yellow,double *red,double *green,double *blue)
1329ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy{
1330ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  *red=QuantumRange*(1.0-cyan);
1331ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  *green=QuantumRange*(1.0-magenta);
1332ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy  *blue=QuantumRange*(1.0-yellow);
1333ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy}
1334ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy
133509d746f0cc2c7c9cb04a9a8984945cefe269d59bcristystatic inline void ConvertLMSToXYZ(const double L,const double M,const double S,
133609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy  double *X,double *Y,double *Z)
133709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy{
133858f753736c6261463b4d1a6809678b884e9297bccristy  *X=1.096123820835514*L-0.278869000218287*M+0.182745179382773*S;
133958f753736c6261463b4d1a6809678b884e9297bccristy  *Y=0.454369041975359*L+0.473533154307412*M+0.072097803717229*S;
134058f753736c6261463b4d1a6809678b884e9297bccristy  *Z=(-0.009627608738429)*L-0.005698031216113*M+1.015325639954543*S;
134158f753736c6261463b4d1a6809678b884e9297bccristy}
134258f753736c6261463b4d1a6809678b884e9297bccristy
134358f753736c6261463b4d1a6809678b884e9297bccristystatic inline void ConvertLMSToRGB(const double L,const double M,
134458f753736c6261463b4d1a6809678b884e9297bccristy  const double S,double *red,double *green,double *blue)
134558f753736c6261463b4d1a6809678b884e9297bccristy{
134658f753736c6261463b4d1a6809678b884e9297bccristy  double
134758f753736c6261463b4d1a6809678b884e9297bccristy    X,
134858f753736c6261463b4d1a6809678b884e9297bccristy    Y,
134958f753736c6261463b4d1a6809678b884e9297bccristy    Z;
135058f753736c6261463b4d1a6809678b884e9297bccristy
135158f753736c6261463b4d1a6809678b884e9297bccristy  ConvertLMSToXYZ(L,M,S,&X,&Y,&Z);
135258f753736c6261463b4d1a6809678b884e9297bccristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
135358f753736c6261463b4d1a6809678b884e9297bccristy}
135458f753736c6261463b4d1a6809678b884e9297bccristy
135558f753736c6261463b4d1a6809678b884e9297bccristystatic inline void ConvertLuvToRGB(const double L,const double u,
135658f753736c6261463b4d1a6809678b884e9297bccristy  const double v,double *red,double *green,double *blue)
135758f753736c6261463b4d1a6809678b884e9297bccristy{
135858f753736c6261463b4d1a6809678b884e9297bccristy  double
135958f753736c6261463b4d1a6809678b884e9297bccristy    X,
136058f753736c6261463b4d1a6809678b884e9297bccristy    Y,
136158f753736c6261463b4d1a6809678b884e9297bccristy    Z;
136258f753736c6261463b4d1a6809678b884e9297bccristy
1363a92718187e06ec4d4ccfd9a9c641da959d251b8acristy  ConvertLuvToXYZ(100.0*L,354.0*u-134.0,262.0*v-140.0,&X,&Y,&Z);
136458f753736c6261463b4d1a6809678b884e9297bccristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
136509d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy}
136609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy
1367a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristystatic inline ssize_t RoundToYCC(const double value)
13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1369014ead1df2405e1d18615f2b9fd92e29c812fd31cristy  if (value <= 0.0)
13700ea377fc725c8356a13225f1eb0d4396c99988a0cristy    return(0);
1371014ead1df2405e1d18615f2b9fd92e29c812fd31cristy  if (value >= 1388.0)
13720ea377fc725c8356a13225f1eb0d4396c99988a0cristy    return(1388);
1373014ead1df2405e1d18615f2b9fd92e29c812fd31cristy  return((ssize_t) (value+0.5));
13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
137658f753736c6261463b4d1a6809678b884e9297bccristystatic inline void ConvertLabToRGB(const double L,const double a,
137758f753736c6261463b4d1a6809678b884e9297bccristy  const double b,double *red,double *green,double *blue)
137858f753736c6261463b4d1a6809678b884e9297bccristy{
137958f753736c6261463b4d1a6809678b884e9297bccristy  double
138058f753736c6261463b4d1a6809678b884e9297bccristy    X,
138158f753736c6261463b4d1a6809678b884e9297bccristy    Y,
138258f753736c6261463b4d1a6809678b884e9297bccristy    Z;
138358f753736c6261463b4d1a6809678b884e9297bccristy
138435605e9ee687899cf1c79cf27572fba678ce636ecristy  ConvertLabToXYZ(100.0*L,255.0*(a-0.5),255.0*(b-0.5),&X,&Y,&Z);
138558f753736c6261463b4d1a6809678b884e9297bccristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
138658f753736c6261463b4d1a6809678b884e9297bccristy}
138758f753736c6261463b4d1a6809678b884e9297bccristy
13887894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristystatic inline void ConvertxyYToRGB(const double low_x,const double low_y,
13897894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  const double cap_Y,double *red,double *green,double *blue)
13907894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy{
13917894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  double
13927894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    X,
13937894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    Y,
13947894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    Z;
13957894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy
13967894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  X=cap_Y/low_y*low_x;
13977894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  Y=cap_Y;
13987894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  Z=cap_Y/low_y*(1.0-low_x-low_y);
13997894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy  ConvertXYZToRGB(X,Y,Z,red,green,blue);
14007894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy}
14017894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy
1402e1ca83966a785a952a4f056f6047a91389ee99a3cristystatic void ConvertYPbPrToRGB(const double Y,const double Pb,const double Pr,
1403e1ca83966a785a952a4f056f6047a91389ee99a3cristy  double *red,double *green,double *blue)
1404e1ca83966a785a952a4f056f6047a91389ee99a3cristy{
140558f753736c6261463b4d1a6809678b884e9297bccristy  *red=QuantumRange*(0.99999999999914679361*Y-1.2188941887145875e-06*(Pb-0.5)+
140658f753736c6261463b4d1a6809678b884e9297bccristy    1.4019995886561440468*(Pr-0.5));
140758f753736c6261463b4d1a6809678b884e9297bccristy  *green=QuantumRange*(0.99999975910502514331*Y-0.34413567816504303521*(Pb-0.5)-
140858f753736c6261463b4d1a6809678b884e9297bccristy    0.71413649331646789076*(Pr-0.5));
140958f753736c6261463b4d1a6809678b884e9297bccristy  *blue=QuantumRange*(1.00000124040004623180*Y+1.77200006607230409200*(Pb-0.5)+
141058f753736c6261463b4d1a6809678b884e9297bccristy    2.1453384174593273e-06*(Pr-0.5));
1411e1ca83966a785a952a4f056f6047a91389ee99a3cristy}
1412e1ca83966a785a952a4f056f6047a91389ee99a3cristy
1413e1ca83966a785a952a4f056f6047a91389ee99a3cristystatic void ConvertYCbCrToRGB(const double Y,const double Cb,
1414e1ca83966a785a952a4f056f6047a91389ee99a3cristy  const double Cr,double *red,double *green,double *blue)
1415e1ca83966a785a952a4f056f6047a91389ee99a3cristy{
141658f753736c6261463b4d1a6809678b884e9297bccristy  ConvertYPbPrToRGB(Y,Cb,Cr,red,green,blue);
141758f753736c6261463b4d1a6809678b884e9297bccristy}
141858f753736c6261463b4d1a6809678b884e9297bccristy
141958f753736c6261463b4d1a6809678b884e9297bccristystatic void ConvertYIQToRGB(const double Y,const double I,const double Q,
142058f753736c6261463b4d1a6809678b884e9297bccristy  double *red,double *green,double *blue)
142158f753736c6261463b4d1a6809678b884e9297bccristy{
1422313974331a93fe62e84e824f4fe69ee83740502dcristy  *red=QuantumRange*(Y+0.9562957197589482261*(I-0.5)+0.6210244164652610754*
1423313974331a93fe62e84e824f4fe69ee83740502dcristy    (Q-0.5));
1424313974331a93fe62e84e824f4fe69ee83740502dcristy  *green=QuantumRange*(Y-0.2721220993185104464*(I-0.5)-0.6473805968256950427*
1425313974331a93fe62e84e824f4fe69ee83740502dcristy    (Q-0.5));
1426313974331a93fe62e84e824f4fe69ee83740502dcristy  *blue=QuantumRange*(Y-1.1069890167364901945*(I-0.5)+1.7046149983646481374*
1427313974331a93fe62e84e824f4fe69ee83740502dcristy    (Q-0.5));
142858f753736c6261463b4d1a6809678b884e9297bccristy}
142958f753736c6261463b4d1a6809678b884e9297bccristy
1430c282d1b30162621c02ffe38060889a920027e870cristystatic void ConvertYDbDrToRGB(const double Y,const double Db,const double Dr,
1431c282d1b30162621c02ffe38060889a920027e870cristy  double *red,double *green,double *blue)
1432c282d1b30162621c02ffe38060889a920027e870cristy{
14339b25da9704beee75ff1602bca2dc3628bff177fdcristy  *red=QuantumRange*(Y+9.2303716147657e-05*(Db-0.5)-
1434c282d1b30162621c02ffe38060889a920027e870cristy    0.52591263066186533*(Dr-0.5));
14359b25da9704beee75ff1602bca2dc3628bff177fdcristy  *green=QuantumRange*(Y-0.12913289889050927*(Db-0.5)+
1436c282d1b30162621c02ffe38060889a920027e870cristy    0.26789932820759876*(Dr-0.5));
14379b25da9704beee75ff1602bca2dc3628bff177fdcristy  *blue=QuantumRange*(Y+0.66467905997895482*(Db-0.5)-
1438c282d1b30162621c02ffe38060889a920027e870cristy    7.9202543533108e-05*(Dr-0.5));
1439c282d1b30162621c02ffe38060889a920027e870cristy}
1440c282d1b30162621c02ffe38060889a920027e870cristy
144158f753736c6261463b4d1a6809678b884e9297bccristystatic void ConvertYUVToRGB(const double Y,const double U,const double V,
144258f753736c6261463b4d1a6809678b884e9297bccristy  double *red,double *green,double *blue)
144358f753736c6261463b4d1a6809678b884e9297bccristy{
1444313974331a93fe62e84e824f4fe69ee83740502dcristy  *red=QuantumRange*(Y-3.945707070708279e-05*(U-0.5)+1.1398279671717170825*
1445313974331a93fe62e84e824f4fe69ee83740502dcristy    (V-0.5));
1446313974331a93fe62e84e824f4fe69ee83740502dcristy  *green=QuantumRange*(Y-0.3946101641414141437*(U-0.5)-0.5805003156565656797*
1447313974331a93fe62e84e824f4fe69ee83740502dcristy    (V-0.5));
1448313974331a93fe62e84e824f4fe69ee83740502dcristy  *blue=QuantumRange*(Y+2.0319996843434342537*(U-0.5)-4.813762626262513e-04*
1449313974331a93fe62e84e824f4fe69ee83740502dcristy    (V-0.5));
14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1452501c5597e8d10b6102a4566f2740f4166bdd545fcristystatic MagickBooleanType TransformsRGBImage(Image *image,
1453b0de93fdedaac769cb08e15b3ec176d4c9078907cristy  ExceptionInfo *exception)
14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1455501c5597e8d10b6102a4566f2740f4166bdd545fcristy#define TransformsRGBImageTag  "Transform/Image"
14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
14570ea377fc725c8356a13225f1eb0d4396c99988a0cristy  static const float
14580ea377fc725c8356a13225f1eb0d4396c99988a0cristy    YCCMap[1389] =
14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
14600ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.000000f, 0.000720f, 0.001441f, 0.002161f, 0.002882f, 0.003602f,
14610ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.004323f, 0.005043f, 0.005764f, 0.006484f, 0.007205f, 0.007925f,
14620ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.008646f, 0.009366f, 0.010086f, 0.010807f, 0.011527f, 0.012248f,
14630ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.012968f, 0.013689f, 0.014409f, 0.015130f, 0.015850f, 0.016571f,
14640ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.017291f, 0.018012f, 0.018732f, 0.019452f, 0.020173f, 0.020893f,
14650ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.021614f, 0.022334f, 0.023055f, 0.023775f, 0.024496f, 0.025216f,
14660ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.025937f, 0.026657f, 0.027378f, 0.028098f, 0.028818f, 0.029539f,
14670ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.030259f, 0.030980f, 0.031700f, 0.032421f, 0.033141f, 0.033862f,
14680ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.034582f, 0.035303f, 0.036023f, 0.036744f, 0.037464f, 0.038184f,
14690ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.038905f, 0.039625f, 0.040346f, 0.041066f, 0.041787f, 0.042507f,
14700ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.043228f, 0.043948f, 0.044669f, 0.045389f, 0.046110f, 0.046830f,
14710ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.047550f, 0.048271f, 0.048991f, 0.049712f, 0.050432f, 0.051153f,
14720ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.051873f, 0.052594f, 0.053314f, 0.054035f, 0.054755f, 0.055476f,
14730ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.056196f, 0.056916f, 0.057637f, 0.058357f, 0.059078f, 0.059798f,
14740ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.060519f, 0.061239f, 0.061960f, 0.062680f, 0.063401f, 0.064121f,
14750ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.064842f, 0.065562f, 0.066282f, 0.067003f, 0.067723f, 0.068444f,
14760ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.069164f, 0.069885f, 0.070605f, 0.071326f, 0.072046f, 0.072767f,
14770ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.073487f, 0.074207f, 0.074928f, 0.075648f, 0.076369f, 0.077089f,
14780ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.077810f, 0.078530f, 0.079251f, 0.079971f, 0.080692f, 0.081412f,
14790ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.082133f, 0.082853f, 0.083573f, 0.084294f, 0.085014f, 0.085735f,
14800ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.086455f, 0.087176f, 0.087896f, 0.088617f, 0.089337f, 0.090058f,
14810ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.090778f, 0.091499f, 0.092219f, 0.092939f, 0.093660f, 0.094380f,
14820ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.095101f, 0.095821f, 0.096542f, 0.097262f, 0.097983f, 0.098703f,
14830ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.099424f, 0.100144f, 0.100865f, 0.101585f, 0.102305f, 0.103026f,
14840ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.103746f, 0.104467f, 0.105187f, 0.105908f, 0.106628f, 0.107349f,
14850ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.108069f, 0.108790f, 0.109510f, 0.110231f, 0.110951f, 0.111671f,
14860ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.112392f, 0.113112f, 0.113833f, 0.114553f, 0.115274f, 0.115994f,
14870ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.116715f, 0.117435f, 0.118156f, 0.118876f, 0.119597f, 0.120317f,
14880ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.121037f, 0.121758f, 0.122478f, 0.123199f, 0.123919f, 0.124640f,
14890ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.125360f, 0.126081f, 0.126801f, 0.127522f, 0.128242f, 0.128963f,
14900ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.129683f, 0.130403f, 0.131124f, 0.131844f, 0.132565f, 0.133285f,
14910ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.134006f, 0.134726f, 0.135447f, 0.136167f, 0.136888f, 0.137608f,
14920ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.138329f, 0.139049f, 0.139769f, 0.140490f, 0.141210f, 0.141931f,
14930ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.142651f, 0.143372f, 0.144092f, 0.144813f, 0.145533f, 0.146254f,
14940ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.146974f, 0.147695f, 0.148415f, 0.149135f, 0.149856f, 0.150576f,
14950ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.151297f, 0.152017f, 0.152738f, 0.153458f, 0.154179f, 0.154899f,
14960ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.155620f, 0.156340f, 0.157061f, 0.157781f, 0.158501f, 0.159222f,
14970ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.159942f, 0.160663f, 0.161383f, 0.162104f, 0.162824f, 0.163545f,
14980ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.164265f, 0.164986f, 0.165706f, 0.166427f, 0.167147f, 0.167867f,
14990ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.168588f, 0.169308f, 0.170029f, 0.170749f, 0.171470f, 0.172190f,
15000ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.172911f, 0.173631f, 0.174352f, 0.175072f, 0.175793f, 0.176513f,
15010ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.177233f, 0.177954f, 0.178674f, 0.179395f, 0.180115f, 0.180836f,
15020ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.181556f, 0.182277f, 0.182997f, 0.183718f, 0.184438f, 0.185159f,
15030ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.185879f, 0.186599f, 0.187320f, 0.188040f, 0.188761f, 0.189481f,
15040ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.190202f, 0.190922f, 0.191643f, 0.192363f, 0.193084f, 0.193804f,
15050ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.194524f, 0.195245f, 0.195965f, 0.196686f, 0.197406f, 0.198127f,
15060ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.198847f, 0.199568f, 0.200288f, 0.201009f, 0.201729f, 0.202450f,
15070ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.203170f, 0.203890f, 0.204611f, 0.205331f, 0.206052f, 0.206772f,
15080ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.207493f, 0.208213f, 0.208934f, 0.209654f, 0.210375f, 0.211095f,
15090ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.211816f, 0.212536f, 0.213256f, 0.213977f, 0.214697f, 0.215418f,
15100ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.216138f, 0.216859f, 0.217579f, 0.218300f, 0.219020f, 0.219741f,
15110ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.220461f, 0.221182f, 0.221902f, 0.222622f, 0.223343f, 0.224063f,
15120ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.224784f, 0.225504f, 0.226225f, 0.226945f, 0.227666f, 0.228386f,
15130ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.229107f, 0.229827f, 0.230548f, 0.231268f, 0.231988f, 0.232709f,
15140ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.233429f, 0.234150f, 0.234870f, 0.235591f, 0.236311f, 0.237032f,
15150ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.237752f, 0.238473f, 0.239193f, 0.239914f, 0.240634f, 0.241354f,
15160ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.242075f, 0.242795f, 0.243516f, 0.244236f, 0.244957f, 0.245677f,
15170ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.246398f, 0.247118f, 0.247839f, 0.248559f, 0.249280f, 0.250000f,
15180ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.250720f, 0.251441f, 0.252161f, 0.252882f, 0.253602f, 0.254323f,
15190ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.255043f, 0.255764f, 0.256484f, 0.257205f, 0.257925f, 0.258646f,
15200ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.259366f, 0.260086f, 0.260807f, 0.261527f, 0.262248f, 0.262968f,
15210ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.263689f, 0.264409f, 0.265130f, 0.265850f, 0.266571f, 0.267291f,
15220ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.268012f, 0.268732f, 0.269452f, 0.270173f, 0.270893f, 0.271614f,
15230ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.272334f, 0.273055f, 0.273775f, 0.274496f, 0.275216f, 0.275937f,
15240ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.276657f, 0.277378f, 0.278098f, 0.278818f, 0.279539f, 0.280259f,
15250ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.280980f, 0.281700f, 0.282421f, 0.283141f, 0.283862f, 0.284582f,
15260ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.285303f, 0.286023f, 0.286744f, 0.287464f, 0.288184f, 0.288905f,
15270ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.289625f, 0.290346f, 0.291066f, 0.291787f, 0.292507f, 0.293228f,
15280ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.293948f, 0.294669f, 0.295389f, 0.296109f, 0.296830f, 0.297550f,
15290ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.298271f, 0.298991f, 0.299712f, 0.300432f, 0.301153f, 0.301873f,
15300ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.302594f, 0.303314f, 0.304035f, 0.304755f, 0.305476f, 0.306196f,
15310ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.306916f, 0.307637f, 0.308357f, 0.309078f, 0.309798f, 0.310519f,
15320ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.311239f, 0.311960f, 0.312680f, 0.313401f, 0.314121f, 0.314842f,
15330ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.315562f, 0.316282f, 0.317003f, 0.317723f, 0.318444f, 0.319164f,
15340ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.319885f, 0.320605f, 0.321326f, 0.322046f, 0.322767f, 0.323487f,
15350ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.324207f, 0.324928f, 0.325648f, 0.326369f, 0.327089f, 0.327810f,
15360ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.328530f, 0.329251f, 0.329971f, 0.330692f, 0.331412f, 0.332133f,
15370ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.332853f, 0.333573f, 0.334294f, 0.335014f, 0.335735f, 0.336455f,
15380ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.337176f, 0.337896f, 0.338617f, 0.339337f, 0.340058f, 0.340778f,
15390ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.341499f, 0.342219f, 0.342939f, 0.343660f, 0.344380f, 0.345101f,
15400ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.345821f, 0.346542f, 0.347262f, 0.347983f, 0.348703f, 0.349424f,
15410ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.350144f, 0.350865f, 0.351585f, 0.352305f, 0.353026f, 0.353746f,
15420ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.354467f, 0.355187f, 0.355908f, 0.356628f, 0.357349f, 0.358069f,
15430ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.358790f, 0.359510f, 0.360231f, 0.360951f, 0.361671f, 0.362392f,
15440ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.363112f, 0.363833f, 0.364553f, 0.365274f, 0.365994f, 0.366715f,
15450ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.367435f, 0.368156f, 0.368876f, 0.369597f, 0.370317f, 0.371037f,
15460ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.371758f, 0.372478f, 0.373199f, 0.373919f, 0.374640f, 0.375360f,
15470ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.376081f, 0.376801f, 0.377522f, 0.378242f, 0.378963f, 0.379683f,
15480ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.380403f, 0.381124f, 0.381844f, 0.382565f, 0.383285f, 0.384006f,
15490ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.384726f, 0.385447f, 0.386167f, 0.386888f, 0.387608f, 0.388329f,
15500ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.389049f, 0.389769f, 0.390490f, 0.391210f, 0.391931f, 0.392651f,
15510ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.393372f, 0.394092f, 0.394813f, 0.395533f, 0.396254f, 0.396974f,
15520ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.397695f, 0.398415f, 0.399135f, 0.399856f, 0.400576f, 0.401297f,
15530ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.402017f, 0.402738f, 0.403458f, 0.404179f, 0.404899f, 0.405620f,
15540ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.406340f, 0.407061f, 0.407781f, 0.408501f, 0.409222f, 0.409942f,
15550ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.410663f, 0.411383f, 0.412104f, 0.412824f, 0.413545f, 0.414265f,
15560ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.414986f, 0.415706f, 0.416427f, 0.417147f, 0.417867f, 0.418588f,
15570ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.419308f, 0.420029f, 0.420749f, 0.421470f, 0.422190f, 0.422911f,
15580ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.423631f, 0.424352f, 0.425072f, 0.425793f, 0.426513f, 0.427233f,
15590ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.427954f, 0.428674f, 0.429395f, 0.430115f, 0.430836f, 0.431556f,
15600ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.432277f, 0.432997f, 0.433718f, 0.434438f, 0.435158f, 0.435879f,
15610ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.436599f, 0.437320f, 0.438040f, 0.438761f, 0.439481f, 0.440202f,
15620ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.440922f, 0.441643f, 0.442363f, 0.443084f, 0.443804f, 0.444524f,
15630ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.445245f, 0.445965f, 0.446686f, 0.447406f, 0.448127f, 0.448847f,
15640ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.449568f, 0.450288f, 0.451009f, 0.451729f, 0.452450f, 0.453170f,
15650ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.453891f, 0.454611f, 0.455331f, 0.456052f, 0.456772f, 0.457493f,
15660ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.458213f, 0.458934f, 0.459654f, 0.460375f, 0.461095f, 0.461816f,
15670ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.462536f, 0.463256f, 0.463977f, 0.464697f, 0.465418f, 0.466138f,
15680ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.466859f, 0.467579f, 0.468300f, 0.469020f, 0.469741f, 0.470461f,
15690ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.471182f, 0.471902f, 0.472622f, 0.473343f, 0.474063f, 0.474784f,
15700ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.475504f, 0.476225f, 0.476945f, 0.477666f, 0.478386f, 0.479107f,
15710ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.479827f, 0.480548f, 0.481268f, 0.481988f, 0.482709f, 0.483429f,
15720ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.484150f, 0.484870f, 0.485591f, 0.486311f, 0.487032f, 0.487752f,
15730ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.488473f, 0.489193f, 0.489914f, 0.490634f, 0.491354f, 0.492075f,
15740ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.492795f, 0.493516f, 0.494236f, 0.494957f, 0.495677f, 0.496398f,
15750ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.497118f, 0.497839f, 0.498559f, 0.499280f, 0.500000f, 0.500720f,
15760ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.501441f, 0.502161f, 0.502882f, 0.503602f, 0.504323f, 0.505043f,
15770ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.505764f, 0.506484f, 0.507205f, 0.507925f, 0.508646f, 0.509366f,
15780ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.510086f, 0.510807f, 0.511527f, 0.512248f, 0.512968f, 0.513689f,
15790ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.514409f, 0.515130f, 0.515850f, 0.516571f, 0.517291f, 0.518012f,
15800ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.518732f, 0.519452f, 0.520173f, 0.520893f, 0.521614f, 0.522334f,
15810ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.523055f, 0.523775f, 0.524496f, 0.525216f, 0.525937f, 0.526657f,
15820ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.527378f, 0.528098f, 0.528818f, 0.529539f, 0.530259f, 0.530980f,
15830ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.531700f, 0.532421f, 0.533141f, 0.533862f, 0.534582f, 0.535303f,
15840ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.536023f, 0.536744f, 0.537464f, 0.538184f, 0.538905f, 0.539625f,
15850ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.540346f, 0.541066f, 0.541787f, 0.542507f, 0.543228f, 0.543948f,
15860ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.544669f, 0.545389f, 0.546109f, 0.546830f, 0.547550f, 0.548271f,
15870ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.548991f, 0.549712f, 0.550432f, 0.551153f, 0.551873f, 0.552594f,
15880ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.553314f, 0.554035f, 0.554755f, 0.555476f, 0.556196f, 0.556916f,
15890ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.557637f, 0.558357f, 0.559078f, 0.559798f, 0.560519f, 0.561239f,
15900ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.561960f, 0.562680f, 0.563401f, 0.564121f, 0.564842f, 0.565562f,
15910ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.566282f, 0.567003f, 0.567723f, 0.568444f, 0.569164f, 0.569885f,
15920ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.570605f, 0.571326f, 0.572046f, 0.572767f, 0.573487f, 0.574207f,
15930ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.574928f, 0.575648f, 0.576369f, 0.577089f, 0.577810f, 0.578530f,
15940ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.579251f, 0.579971f, 0.580692f, 0.581412f, 0.582133f, 0.582853f,
15950ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.583573f, 0.584294f, 0.585014f, 0.585735f, 0.586455f, 0.587176f,
15960ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.587896f, 0.588617f, 0.589337f, 0.590058f, 0.590778f, 0.591499f,
15970ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.592219f, 0.592939f, 0.593660f, 0.594380f, 0.595101f, 0.595821f,
15980ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.596542f, 0.597262f, 0.597983f, 0.598703f, 0.599424f, 0.600144f,
15990ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.600865f, 0.601585f, 0.602305f, 0.603026f, 0.603746f, 0.604467f,
16000ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.605187f, 0.605908f, 0.606628f, 0.607349f, 0.608069f, 0.608790f,
16010ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.609510f, 0.610231f, 0.610951f, 0.611671f, 0.612392f, 0.613112f,
16020ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.613833f, 0.614553f, 0.615274f, 0.615994f, 0.616715f, 0.617435f,
16030ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.618156f, 0.618876f, 0.619597f, 0.620317f, 0.621037f, 0.621758f,
16040ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.622478f, 0.623199f, 0.623919f, 0.624640f, 0.625360f, 0.626081f,
16050ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.626801f, 0.627522f, 0.628242f, 0.628963f, 0.629683f, 0.630403f,
16060ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.631124f, 0.631844f, 0.632565f, 0.633285f, 0.634006f, 0.634726f,
16070ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.635447f, 0.636167f, 0.636888f, 0.637608f, 0.638329f, 0.639049f,
16080ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.639769f, 0.640490f, 0.641210f, 0.641931f, 0.642651f, 0.643372f,
16090ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.644092f, 0.644813f, 0.645533f, 0.646254f, 0.646974f, 0.647695f,
16100ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.648415f, 0.649135f, 0.649856f, 0.650576f, 0.651297f, 0.652017f,
16110ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.652738f, 0.653458f, 0.654179f, 0.654899f, 0.655620f, 0.656340f,
16120ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.657061f, 0.657781f, 0.658501f, 0.659222f, 0.659942f, 0.660663f,
16130ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.661383f, 0.662104f, 0.662824f, 0.663545f, 0.664265f, 0.664986f,
16140ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.665706f, 0.666427f, 0.667147f, 0.667867f, 0.668588f, 0.669308f,
16150ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.670029f, 0.670749f, 0.671470f, 0.672190f, 0.672911f, 0.673631f,
16160ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.674352f, 0.675072f, 0.675793f, 0.676513f, 0.677233f, 0.677954f,
16170ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.678674f, 0.679395f, 0.680115f, 0.680836f, 0.681556f, 0.682277f,
16180ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.682997f, 0.683718f, 0.684438f, 0.685158f, 0.685879f, 0.686599f,
16190ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.687320f, 0.688040f, 0.688761f, 0.689481f, 0.690202f, 0.690922f,
16200ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.691643f, 0.692363f, 0.693084f, 0.693804f, 0.694524f, 0.695245f,
16210ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.695965f, 0.696686f, 0.697406f, 0.698127f, 0.698847f, 0.699568f,
16220ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.700288f, 0.701009f, 0.701729f, 0.702450f, 0.703170f, 0.703891f,
16230ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.704611f, 0.705331f, 0.706052f, 0.706772f, 0.707493f, 0.708213f,
16240ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.708934f, 0.709654f, 0.710375f, 0.711095f, 0.711816f, 0.712536f,
16250ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.713256f, 0.713977f, 0.714697f, 0.715418f, 0.716138f, 0.716859f,
16260ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.717579f, 0.718300f, 0.719020f, 0.719741f, 0.720461f, 0.721182f,
16270ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.721902f, 0.722622f, 0.723343f, 0.724063f, 0.724784f, 0.725504f,
16280ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.726225f, 0.726945f, 0.727666f, 0.728386f, 0.729107f, 0.729827f,
16290ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.730548f, 0.731268f, 0.731988f, 0.732709f, 0.733429f, 0.734150f,
16300ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.734870f, 0.735591f, 0.736311f, 0.737032f, 0.737752f, 0.738473f,
16310ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.739193f, 0.739914f, 0.740634f, 0.741354f, 0.742075f, 0.742795f,
16320ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.743516f, 0.744236f, 0.744957f, 0.745677f, 0.746398f, 0.747118f,
16330ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.747839f, 0.748559f, 0.749280f, 0.750000f, 0.750720f, 0.751441f,
16340ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.752161f, 0.752882f, 0.753602f, 0.754323f, 0.755043f, 0.755764f,
16350ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.756484f, 0.757205f, 0.757925f, 0.758646f, 0.759366f, 0.760086f,
16360ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.760807f, 0.761527f, 0.762248f, 0.762968f, 0.763689f, 0.764409f,
16370ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.765130f, 0.765850f, 0.766571f, 0.767291f, 0.768012f, 0.768732f,
16380ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.769452f, 0.770173f, 0.770893f, 0.771614f, 0.772334f, 0.773055f,
16390ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.773775f, 0.774496f, 0.775216f, 0.775937f, 0.776657f, 0.777378f,
16400ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.778098f, 0.778818f, 0.779539f, 0.780259f, 0.780980f, 0.781700f,
16410ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.782421f, 0.783141f, 0.783862f, 0.784582f, 0.785303f, 0.786023f,
16420ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.786744f, 0.787464f, 0.788184f, 0.788905f, 0.789625f, 0.790346f,
16430ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.791066f, 0.791787f, 0.792507f, 0.793228f, 0.793948f, 0.794669f,
16440ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.795389f, 0.796109f, 0.796830f, 0.797550f, 0.798271f, 0.798991f,
16450ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.799712f, 0.800432f, 0.801153f, 0.801873f, 0.802594f, 0.803314f,
16460ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.804035f, 0.804755f, 0.805476f, 0.806196f, 0.806916f, 0.807637f,
16470ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.808357f, 0.809078f, 0.809798f, 0.810519f, 0.811239f, 0.811960f,
16480ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.812680f, 0.813401f, 0.814121f, 0.814842f, 0.815562f, 0.816282f,
16490ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.817003f, 0.817723f, 0.818444f, 0.819164f, 0.819885f, 0.820605f,
16500ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.821326f, 0.822046f, 0.822767f, 0.823487f, 0.824207f, 0.824928f,
16510ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.825648f, 0.826369f, 0.827089f, 0.827810f, 0.828530f, 0.829251f,
16520ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.829971f, 0.830692f, 0.831412f, 0.832133f, 0.832853f, 0.833573f,
16530ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.834294f, 0.835014f, 0.835735f, 0.836455f, 0.837176f, 0.837896f,
16540ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.838617f, 0.839337f, 0.840058f, 0.840778f, 0.841499f, 0.842219f,
16550ea377fc725c8356a13225f1eb0d4396c99988a0cristy      0.842939f, 0.843660f, 0.844380f, 0.845101f, 0.845821f, 0.846542f,
165658f753736c6261463b4d1a6809678b884e9297bccristy      0.847262f, 0.847983f, 0.848703f, 0.849424f, 0.850144f, 0.850865f,
165758f753736c6261463b4d1a6809678b884e9297bccristy      0.851585f, 0.852305f, 0.853026f, 0.853746f, 0.854467f, 0.855187f,
165858f753736c6261463b4d1a6809678b884e9297bccristy      0.855908f, 0.856628f, 0.857349f, 0.858069f, 0.858790f, 0.859510f,
165958f753736c6261463b4d1a6809678b884e9297bccristy      0.860231f, 0.860951f, 0.861671f, 0.862392f, 0.863112f, 0.863833f,
166058f753736c6261463b4d1a6809678b884e9297bccristy      0.864553f, 0.865274f, 0.865994f, 0.866715f, 0.867435f, 0.868156f,
166158f753736c6261463b4d1a6809678b884e9297bccristy      0.868876f, 0.869597f, 0.870317f, 0.871037f, 0.871758f, 0.872478f,
166258f753736c6261463b4d1a6809678b884e9297bccristy      0.873199f, 0.873919f, 0.874640f, 0.875360f, 0.876081f, 0.876801f,
166358f753736c6261463b4d1a6809678b884e9297bccristy      0.877522f, 0.878242f, 0.878963f, 0.879683f, 0.880403f, 0.881124f,
166458f753736c6261463b4d1a6809678b884e9297bccristy      0.881844f, 0.882565f, 0.883285f, 0.884006f, 0.884726f, 0.885447f,
166558f753736c6261463b4d1a6809678b884e9297bccristy      0.886167f, 0.886888f, 0.887608f, 0.888329f, 0.889049f, 0.889769f,
166658f753736c6261463b4d1a6809678b884e9297bccristy      0.890490f, 0.891210f, 0.891931f, 0.892651f, 0.893372f, 0.894092f,
166758f753736c6261463b4d1a6809678b884e9297bccristy      0.894813f, 0.895533f, 0.896254f, 0.896974f, 0.897695f, 0.898415f,
166858f753736c6261463b4d1a6809678b884e9297bccristy      0.899135f, 0.899856f, 0.900576f, 0.901297f, 0.902017f, 0.902738f,
166958f753736c6261463b4d1a6809678b884e9297bccristy      0.903458f, 0.904179f, 0.904899f, 0.905620f, 0.906340f, 0.907061f,
167058f753736c6261463b4d1a6809678b884e9297bccristy      0.907781f, 0.908501f, 0.909222f, 0.909942f, 0.910663f, 0.911383f,
167158f753736c6261463b4d1a6809678b884e9297bccristy      0.912104f, 0.912824f, 0.913545f, 0.914265f, 0.914986f, 0.915706f,
167258f753736c6261463b4d1a6809678b884e9297bccristy      0.916427f, 0.917147f, 0.917867f, 0.918588f, 0.919308f, 0.920029f,
167358f753736c6261463b4d1a6809678b884e9297bccristy      0.920749f, 0.921470f, 0.922190f, 0.922911f, 0.923631f, 0.924352f,
167458f753736c6261463b4d1a6809678b884e9297bccristy      0.925072f, 0.925793f, 0.926513f, 0.927233f, 0.927954f, 0.928674f,
167558f753736c6261463b4d1a6809678b884e9297bccristy      0.929395f, 0.930115f, 0.930836f, 0.931556f, 0.932277f, 0.932997f,
167658f753736c6261463b4d1a6809678b884e9297bccristy      0.933718f, 0.934438f, 0.935158f, 0.935879f, 0.936599f, 0.937320f,
167758f753736c6261463b4d1a6809678b884e9297bccristy      0.938040f, 0.938761f, 0.939481f, 0.940202f, 0.940922f, 0.941643f,
167858f753736c6261463b4d1a6809678b884e9297bccristy      0.942363f, 0.943084f, 0.943804f, 0.944524f, 0.945245f, 0.945965f,
167958f753736c6261463b4d1a6809678b884e9297bccristy      0.946686f, 0.947406f, 0.948127f, 0.948847f, 0.949568f, 0.950288f,
168058f753736c6261463b4d1a6809678b884e9297bccristy      0.951009f, 0.951729f, 0.952450f, 0.953170f, 0.953891f, 0.954611f,
168158f753736c6261463b4d1a6809678b884e9297bccristy      0.955331f, 0.956052f, 0.956772f, 0.957493f, 0.958213f, 0.958934f,
168258f753736c6261463b4d1a6809678b884e9297bccristy      0.959654f, 0.960375f, 0.961095f, 0.961816f, 0.962536f, 0.963256f,
168358f753736c6261463b4d1a6809678b884e9297bccristy      0.963977f, 0.964697f, 0.965418f, 0.966138f, 0.966859f, 0.967579f,
168458f753736c6261463b4d1a6809678b884e9297bccristy      0.968300f, 0.969020f, 0.969741f, 0.970461f, 0.971182f, 0.971902f,
168558f753736c6261463b4d1a6809678b884e9297bccristy      0.972622f, 0.973343f, 0.974063f, 0.974784f, 0.975504f, 0.976225f,
168658f753736c6261463b4d1a6809678b884e9297bccristy      0.976945f, 0.977666f, 0.978386f, 0.979107f, 0.979827f, 0.980548f,
168758f753736c6261463b4d1a6809678b884e9297bccristy      0.981268f, 0.981988f, 0.982709f, 0.983429f, 0.984150f, 0.984870f,
168858f753736c6261463b4d1a6809678b884e9297bccristy      0.985591f, 0.986311f, 0.987032f, 0.987752f, 0.988473f, 0.989193f,
168958f753736c6261463b4d1a6809678b884e9297bccristy      0.989914f, 0.990634f, 0.991354f, 0.992075f, 0.992795f, 0.993516f,
169058f753736c6261463b4d1a6809678b884e9297bccristy      0.994236f, 0.994957f, 0.995677f, 0.996398f, 0.997118f, 0.997839f,
169158f753736c6261463b4d1a6809678b884e9297bccristy      0.998559f, 0.999280f, 1.000000f
169258f753736c6261463b4d1a6809678b884e9297bccristy    };
169306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
169458f753736c6261463b4d1a6809678b884e9297bccristy  CacheView
169558f753736c6261463b4d1a6809678b884e9297bccristy    *image_view;
169606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
169758f753736c6261463b4d1a6809678b884e9297bccristy  MagickBooleanType
169858f753736c6261463b4d1a6809678b884e9297bccristy    status;
169906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
170058f753736c6261463b4d1a6809678b884e9297bccristy  MagickOffsetType
170158f753736c6261463b4d1a6809678b884e9297bccristy    progress;
1702722fc0cce634eb07588336accc3bb52979738a5ccristy
170358f753736c6261463b4d1a6809678b884e9297bccristy  register ssize_t
170458f753736c6261463b4d1a6809678b884e9297bccristy    i;
1705722fc0cce634eb07588336accc3bb52979738a5ccristy
170658f753736c6261463b4d1a6809678b884e9297bccristy  ssize_t
170758f753736c6261463b4d1a6809678b884e9297bccristy    y;
1708722fc0cce634eb07588336accc3bb52979738a5ccristy
170958f753736c6261463b4d1a6809678b884e9297bccristy  TransformPacket
171058f753736c6261463b4d1a6809678b884e9297bccristy    *y_map,
171158f753736c6261463b4d1a6809678b884e9297bccristy    *x_map,
171258f753736c6261463b4d1a6809678b884e9297bccristy    *z_map;
1713722fc0cce634eb07588336accc3bb52979738a5ccristy
171458f753736c6261463b4d1a6809678b884e9297bccristy  assert(image != (Image *) NULL);
1715e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
171658f753736c6261463b4d1a6809678b884e9297bccristy  if (image->debug != MagickFalse)
171758f753736c6261463b4d1a6809678b884e9297bccristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
171858f753736c6261463b4d1a6809678b884e9297bccristy  status=MagickTrue;
171958f753736c6261463b4d1a6809678b884e9297bccristy  progress=0;
172058f753736c6261463b4d1a6809678b884e9297bccristy  switch (image->colorspace)
172158f753736c6261463b4d1a6809678b884e9297bccristy  {
172258f753736c6261463b4d1a6809678b884e9297bccristy    case CMYKColorspace:
17231f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy    {
172458f753736c6261463b4d1a6809678b884e9297bccristy      PixelInfo
172558f753736c6261463b4d1a6809678b884e9297bccristy        zero;
172658f753736c6261463b4d1a6809678b884e9297bccristy
17271f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy      /*
172858f753736c6261463b4d1a6809678b884e9297bccristy        Transform image from CMYK to sRGB.
17291f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy      */
17301f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy      if (image->storage_class == PseudoClass)
17311f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        {
17321f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          if (SyncImage(image,exception) == MagickFalse)
17331f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy            return(MagickFalse);
17341f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
17351f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy            return(MagickFalse);
17361f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        }
173758f753736c6261463b4d1a6809678b884e9297bccristy      GetPixelInfo(image,&zero);
173846ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
17391f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
17401f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy      #pragma omp parallel for schedule(static,4) shared(status) \
17415e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
17421f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy#endif
17431f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy      for (y=0; y < (ssize_t) image->rows; y++)
17441f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy      {
17451f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        MagickBooleanType
17461f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          sync;
17471f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy
174858f753736c6261463b4d1a6809678b884e9297bccristy        PixelInfo
174958f753736c6261463b4d1a6809678b884e9297bccristy          pixel;
175058f753736c6261463b4d1a6809678b884e9297bccristy
17511f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        register ssize_t
17521f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          x;
17531f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy
17541f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        register Quantum
175505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
17561f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy
17571f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        if (status == MagickFalse)
17581f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          continue;
17591f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
17601f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          exception);
17611f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        if (q == (Quantum *) NULL)
17621f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          {
17631f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy            status=MagickFalse;
17641f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy            continue;
17651f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy          }
176658f753736c6261463b4d1a6809678b884e9297bccristy        pixel=zero;
17671f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        for (x=0; x < (ssize_t) image->columns; x++)
17681f09931ef28c09bca4a5faa2b7e46ee5c496ce76cristy        {
176958f753736c6261463b4d1a6809678b884e9297bccristy          GetPixelInfoPixel(image,q,&pixel);
177058f753736c6261463b4d1a6809678b884e9297bccristy          ConvertCMYKToRGB(&pixel);
177111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          SetPixelViaPixelInfo(image,&pixel,q);
177209d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          q+=GetPixelChannels(image);
177309d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        }
177409d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
177509d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        if (sync == MagickFalse)
177609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          status=MagickFalse;
177709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      }
177809d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      image_view=DestroyCacheView(image_view);
177909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
1780b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        return(MagickFalse);
1781b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      return(status);
1782b7d3c0b84e45607fbef1b3eea1462b0939af68becristy    }
178358f753736c6261463b4d1a6809678b884e9297bccristy    case GRAYColorspace:
1784b7d3c0b84e45607fbef1b3eea1462b0939af68becristy    {
1785b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      /*
178658f753736c6261463b4d1a6809678b884e9297bccristy        Transform linear GRAY to sRGB colorspace.
1787b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      */
1788b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      if (image->storage_class == PseudoClass)
1789b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        {
1790b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          if (SyncImage(image,exception) == MagickFalse)
1791b7d3c0b84e45607fbef1b3eea1462b0939af68becristy            return(MagickFalse);
1792b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
1793b7d3c0b84e45607fbef1b3eea1462b0939af68becristy            return(MagickFalse);
1794b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        }
179558f753736c6261463b4d1a6809678b884e9297bccristy      if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
179658f753736c6261463b4d1a6809678b884e9297bccristy        return(MagickFalse);
1797b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      image_view=AcquireAuthenticCacheView(image,exception);
1798b7d3c0b84e45607fbef1b3eea1462b0939af68becristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
1799b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      #pragma omp parallel for schedule(static,4) shared(status) \
1800b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        magick_threads(image,image,image->rows,1)
1801b7d3c0b84e45607fbef1b3eea1462b0939af68becristy#endif
1802b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      for (y=0; y < (ssize_t) image->rows; y++)
1803b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      {
1804b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        MagickBooleanType
1805b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          sync;
1806b7d3c0b84e45607fbef1b3eea1462b0939af68becristy
1807b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        register ssize_t
1808b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          x;
1809b7d3c0b84e45607fbef1b3eea1462b0939af68becristy
1810b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        register Quantum
181105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
1812b7d3c0b84e45607fbef1b3eea1462b0939af68becristy
1813b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        if (status == MagickFalse)
1814b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          continue;
1815b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
1816b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          exception);
1817b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        if (q == (Quantum *) NULL)
1818b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          {
1819b7d3c0b84e45607fbef1b3eea1462b0939af68becristy            status=MagickFalse;
1820b7d3c0b84e45607fbef1b3eea1462b0939af68becristy            continue;
1821b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          }
182258f753736c6261463b4d1a6809678b884e9297bccristy        for (x=(ssize_t) image->columns; x != 0; x--)
1823b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        {
18242a4115b38588ac9b3559cf13f73befa53eebf014cristy          MagickRealType
182558f753736c6261463b4d1a6809678b884e9297bccristy            gray;
1826b7d3c0b84e45607fbef1b3eea1462b0939af68becristy
18272a4115b38588ac9b3559cf13f73befa53eebf014cristy          gray=(MagickRealType) GetPixelGray(image,q);
18282a4115b38588ac9b3559cf13f73befa53eebf014cristy          if ((image->intensity == Rec601LuminancePixelIntensityMethod) ||
18292a4115b38588ac9b3559cf13f73befa53eebf014cristy              (image->intensity == Rec709LuminancePixelIntensityMethod))
18302a4115b38588ac9b3559cf13f73befa53eebf014cristy            gray=EncodePixelGamma(gray);
183158f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelRed(image,ClampToQuantum(gray),q);
183258f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelGreen(image,ClampToQuantum(gray),q);
183358f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelBlue(image,ClampToQuantum(gray),q);
1834b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          q+=GetPixelChannels(image);
1835b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        }
1836b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
1837b7d3c0b84e45607fbef1b3eea1462b0939af68becristy        if (sync == MagickFalse)
1838b7d3c0b84e45607fbef1b3eea1462b0939af68becristy          status=MagickFalse;
1839b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      }
1840b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      image_view=DestroyCacheView(image_view);
1841b7d3c0b84e45607fbef1b3eea1462b0939af68becristy      if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
184209d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        return(MagickFalse);
184309d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      return(status);
184409d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy    }
1845ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy    case CMYColorspace:
184658f753736c6261463b4d1a6809678b884e9297bccristy    case HCLColorspace:
184758f753736c6261463b4d1a6809678b884e9297bccristy    case HCLpColorspace:
184858f753736c6261463b4d1a6809678b884e9297bccristy    case HSBColorspace:
184958f753736c6261463b4d1a6809678b884e9297bccristy    case HSIColorspace:
185058f753736c6261463b4d1a6809678b884e9297bccristy    case HSLColorspace:
185158f753736c6261463b4d1a6809678b884e9297bccristy    case HSVColorspace:
185258f753736c6261463b4d1a6809678b884e9297bccristy    case HWBColorspace:
185358f753736c6261463b4d1a6809678b884e9297bccristy    case LabColorspace:
185458f753736c6261463b4d1a6809678b884e9297bccristy    case LCHColorspace:
185558f753736c6261463b4d1a6809678b884e9297bccristy    case LCHabColorspace:
185658f753736c6261463b4d1a6809678b884e9297bccristy    case LCHuvColorspace:
185709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy    case LMSColorspace:
185858f753736c6261463b4d1a6809678b884e9297bccristy    case LuvColorspace:
18597894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy    case xyYColorspace:
186058f753736c6261463b4d1a6809678b884e9297bccristy    case XYZColorspace:
186158f753736c6261463b4d1a6809678b884e9297bccristy    case YCbCrColorspace:
1862c282d1b30162621c02ffe38060889a920027e870cristy    case YDbDrColorspace:
186358f753736c6261463b4d1a6809678b884e9297bccristy    case YIQColorspace:
186458f753736c6261463b4d1a6809678b884e9297bccristy    case YPbPrColorspace:
186558f753736c6261463b4d1a6809678b884e9297bccristy    case YUVColorspace:
186609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy    {
186709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      /*
186858f753736c6261463b4d1a6809678b884e9297bccristy        Transform image from source colorspace to sRGB.
186909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      */
187009d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      if (image->storage_class == PseudoClass)
187109d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        {
187209d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          if (SyncImage(image,exception) == MagickFalse)
187309d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            return(MagickFalse);
187409d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
187509d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            return(MagickFalse);
187609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        }
187746ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
187809d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
187909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      #pragma omp parallel for schedule(static,4) shared(status) \
18805e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
188109d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy#endif
188209d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      for (y=0; y < (ssize_t) image->rows; y++)
188309d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy      {
188409d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        MagickBooleanType
188509d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          sync;
188609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy
188709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        register ssize_t
188809d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          x;
188909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy
189009d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        register Quantum
189105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
189209d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy
189309d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        if (status == MagickFalse)
189409d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          continue;
189509d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
189609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          exception);
189709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        if (q == (Quantum *) NULL)
189809d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          {
189909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            status=MagickFalse;
190009d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            continue;
190109d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          }
190209d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        for (x=0; x < (ssize_t) image->columns; x++)
190309d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy        {
190409d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy          double
190509d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            blue,
190609d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            green,
190709d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            red,
190809d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            X,
190909d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            Y,
191009d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy            Z;
191109d746f0cc2c7c9cb04a9a8984945cefe269d59bcristy
191258f753736c6261463b4d1a6809678b884e9297bccristy          X=QuantumScale*GetPixelRed(image,q);
191358f753736c6261463b4d1a6809678b884e9297bccristy          Y=QuantumScale*GetPixelGreen(image,q);
191458f753736c6261463b4d1a6809678b884e9297bccristy          Z=QuantumScale*GetPixelBlue(image,q);
191558f753736c6261463b4d1a6809678b884e9297bccristy          switch (image->colorspace)
191658f753736c6261463b4d1a6809678b884e9297bccristy          {
1917ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy            case CMYColorspace:
1918ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy            {
1919ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy              ConvertCMYToRGB(X,Y,Z,&red,&green,&blue);
1920ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy              break;
1921ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy            }
192258f753736c6261463b4d1a6809678b884e9297bccristy            case HCLColorspace:
192358f753736c6261463b4d1a6809678b884e9297bccristy            {
192458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertHCLToRGB(X,Y,Z,&red,&green,&blue);
192558f753736c6261463b4d1a6809678b884e9297bccristy              break;
192658f753736c6261463b4d1a6809678b884e9297bccristy            }
192758f753736c6261463b4d1a6809678b884e9297bccristy            case HCLpColorspace:
192858f753736c6261463b4d1a6809678b884e9297bccristy            {
192958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertHCLpToRGB(X,Y,Z,&red,&green,&blue);
193058f753736c6261463b4d1a6809678b884e9297bccristy              break;
193158f753736c6261463b4d1a6809678b884e9297bccristy            }
193258f753736c6261463b4d1a6809678b884e9297bccristy            case HSBColorspace:
193358f753736c6261463b4d1a6809678b884e9297bccristy            {
193458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertHSBToRGB(X,Y,Z,&red,&green,&blue);
193558f753736c6261463b4d1a6809678b884e9297bccristy              break;
193658f753736c6261463b4d1a6809678b884e9297bccristy            }
193758f753736c6261463b4d1a6809678b884e9297bccristy            case HSIColorspace:
193858f753736c6261463b4d1a6809678b884e9297bccristy            {
193958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertHSIToRGB(X,Y,Z,&red,&green,&blue);
194058f753736c6261463b4d1a6809678b884e9297bccristy              break;
194158f753736c6261463b4d1a6809678b884e9297bccristy            }
194258f753736c6261463b4d1a6809678b884e9297bccristy            case HSLColorspace:
194358f753736c6261463b4d1a6809678b884e9297bccristy            {
194458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertHSLToRGB(X,Y,Z,&red,&green,&blue);
194558f753736c6261463b4d1a6809678b884e9297bccristy              break;
194658f753736c6261463b4d1a6809678b884e9297bccristy            }
194758f753736c6261463b4d1a6809678b884e9297bccristy            case HSVColorspace:
194858f753736c6261463b4d1a6809678b884e9297bccristy            {
194958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertHSVToRGB(X,Y,Z,&red,&green,&blue);
195058f753736c6261463b4d1a6809678b884e9297bccristy              break;
195158f753736c6261463b4d1a6809678b884e9297bccristy            }
195258f753736c6261463b4d1a6809678b884e9297bccristy            case HWBColorspace:
195358f753736c6261463b4d1a6809678b884e9297bccristy            {
195458f753736c6261463b4d1a6809678b884e9297bccristy              ConvertHWBToRGB(X,Y,Z,&red,&green,&blue);
195558f753736c6261463b4d1a6809678b884e9297bccristy              break;
195658f753736c6261463b4d1a6809678b884e9297bccristy            }
195758f753736c6261463b4d1a6809678b884e9297bccristy            case LabColorspace:
195858f753736c6261463b4d1a6809678b884e9297bccristy            {
195958f753736c6261463b4d1a6809678b884e9297bccristy              ConvertLabToRGB(X,Y,Z,&red,&green,&blue);
196058f753736c6261463b4d1a6809678b884e9297bccristy              break;
196158f753736c6261463b4d1a6809678b884e9297bccristy            }
196258f753736c6261463b4d1a6809678b884e9297bccristy            case LCHColorspace:
196358f753736c6261463b4d1a6809678b884e9297bccristy            case LCHabColorspace:
196458f753736c6261463b4d1a6809678b884e9297bccristy            {
196558f753736c6261463b4d1a6809678b884e9297bccristy              ConvertLCHabToRGB(X,Y,Z,&red,&green,&blue);
196658f753736c6261463b4d1a6809678b884e9297bccristy              break;
196758f753736c6261463b4d1a6809678b884e9297bccristy            }
196858f753736c6261463b4d1a6809678b884e9297bccristy            case LCHuvColorspace:
196958f753736c6261463b4d1a6809678b884e9297bccristy            {
197058f753736c6261463b4d1a6809678b884e9297bccristy              ConvertLCHuvToRGB(X,Y,Z,&red,&green,&blue);
197158f753736c6261463b4d1a6809678b884e9297bccristy              break;
197258f753736c6261463b4d1a6809678b884e9297bccristy            }
197358f753736c6261463b4d1a6809678b884e9297bccristy            case LMSColorspace:
197458f753736c6261463b4d1a6809678b884e9297bccristy            {
197558f753736c6261463b4d1a6809678b884e9297bccristy              ConvertLMSToRGB(X,Y,Z,&red,&green,&blue);
197658f753736c6261463b4d1a6809678b884e9297bccristy              break;
197758f753736c6261463b4d1a6809678b884e9297bccristy            }
197858f753736c6261463b4d1a6809678b884e9297bccristy            case LuvColorspace:
197958f753736c6261463b4d1a6809678b884e9297bccristy            {
198058f753736c6261463b4d1a6809678b884e9297bccristy              ConvertLuvToRGB(X,Y,Z,&red,&green,&blue);
198158f753736c6261463b4d1a6809678b884e9297bccristy              break;
198258f753736c6261463b4d1a6809678b884e9297bccristy            }
19837894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy            case xyYColorspace:
19847894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy            {
19857894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy              ConvertxyYToRGB(X,Y,Z,&red,&green,&blue);
19867894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy              break;
19877894d4a8920a7ee8f292b9c9b4bfc7b722bfcb83cristy            }
198858f753736c6261463b4d1a6809678b884e9297bccristy            case XYZColorspace:
198958f753736c6261463b4d1a6809678b884e9297bccristy            {
199058f753736c6261463b4d1a6809678b884e9297bccristy              ConvertXYZToRGB(X,Y,Z,&red,&green,&blue);
199158f753736c6261463b4d1a6809678b884e9297bccristy              break;
199258f753736c6261463b4d1a6809678b884e9297bccristy            }
199358f753736c6261463b4d1a6809678b884e9297bccristy            case YCbCrColorspace:
199458f753736c6261463b4d1a6809678b884e9297bccristy            {
199558f753736c6261463b4d1a6809678b884e9297bccristy              ConvertYCbCrToRGB(X,Y,Z,&red,&green,&blue);
199658f753736c6261463b4d1a6809678b884e9297bccristy              break;
199758f753736c6261463b4d1a6809678b884e9297bccristy            }
1998c282d1b30162621c02ffe38060889a920027e870cristy            case YDbDrColorspace:
1999c282d1b30162621c02ffe38060889a920027e870cristy            {
2000c282d1b30162621c02ffe38060889a920027e870cristy              ConvertYDbDrToRGB(X,Y,Z,&red,&green,&blue);
2001c282d1b30162621c02ffe38060889a920027e870cristy              break;
2002c282d1b30162621c02ffe38060889a920027e870cristy            }
200358f753736c6261463b4d1a6809678b884e9297bccristy            case YIQColorspace:
200458f753736c6261463b4d1a6809678b884e9297bccristy            {
200558f753736c6261463b4d1a6809678b884e9297bccristy              ConvertYIQToRGB(X,Y,Z,&red,&green,&blue);
200658f753736c6261463b4d1a6809678b884e9297bccristy              break;
200758f753736c6261463b4d1a6809678b884e9297bccristy            }
200858f753736c6261463b4d1a6809678b884e9297bccristy            case YPbPrColorspace:
200958f753736c6261463b4d1a6809678b884e9297bccristy            {
201058f753736c6261463b4d1a6809678b884e9297bccristy              ConvertYPbPrToRGB(X,Y,Z,&red,&green,&blue);
201158f753736c6261463b4d1a6809678b884e9297bccristy              break;
201258f753736c6261463b4d1a6809678b884e9297bccristy            }
201358f753736c6261463b4d1a6809678b884e9297bccristy            case YUVColorspace:
201458f753736c6261463b4d1a6809678b884e9297bccristy            {
201558f753736c6261463b4d1a6809678b884e9297bccristy              ConvertYUVToRGB(X,Y,Z,&red,&green,&blue);
201658f753736c6261463b4d1a6809678b884e9297bccristy              break;
201758f753736c6261463b4d1a6809678b884e9297bccristy            }
201858f753736c6261463b4d1a6809678b884e9297bccristy            default:
2019924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy            {
2020924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy              red=QuantumRange*X;
2021924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy              green=QuantumRange*Y;
2022924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy              blue=QuantumRange*Z;
202358f753736c6261463b4d1a6809678b884e9297bccristy              break;
2024924a10151a799e6bafc2cb7bcb9d28fef6c7bc1acristy            }
202558f753736c6261463b4d1a6809678b884e9297bccristy          }
202658f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelRed(image,ClampToQuantum(red),q);
202758f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelGreen(image,ClampToQuantum(green),q);
202858f753736c6261463b4d1a6809678b884e9297bccristy          SetPixelBlue(image,ClampToQuantum(blue),q);
2029ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (sync == MagickFalse)
20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_view=DestroyCacheView(image_view);
2036ddb319d5ba1f2adeedc7d63b00725c79b421e65acristy      if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(status);
20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case LogColorspace:
20413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      const char
20433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *value;
20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      double
20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        black,
20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        density,
2048a45da3bf94c4b3b3e02b6e2252215dcd841d440bcristy        film_gamma,
20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        gamma,
20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_black,
20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        reference_white;
20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Quantum
20543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *logmap;
20553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
20563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
205706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        Transform Log to sRGB colorspace.
20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2059ef83e05be164e5128919501b2a61c3c03c7a37e2cristy      density=DisplayGamma;
20603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      gamma=DisplayGamma;
2061d15e65928aec551b7388c2863de3e3e628e2e0ddcristy      value=GetImageProperty(image,"gamma",exception);
20623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (value != (const char *) NULL)
20633e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        gamma=PerceptibleReciprocal(StringToDouble(value,(char **) NULL));
2064a45da3bf94c4b3b3e02b6e2252215dcd841d440bcristy      film_gamma=FilmGamma;
2065d15e65928aec551b7388c2863de3e3e628e2e0ddcristy      value=GetImageProperty(image,"film-gamma",exception);
2066a45da3bf94c4b3b3e02b6e2252215dcd841d440bcristy      if (value != (const char *) NULL)
2067dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy        film_gamma=StringToDouble(value,(char **) NULL);
20683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_black=ReferenceBlack;
2069d15e65928aec551b7388c2863de3e3e628e2e0ddcristy      value=GetImageProperty(image,"reference-black",exception);
20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (value != (const char *) NULL)
2071dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy        reference_black=StringToDouble(value,(char **) NULL);
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      reference_white=ReferenceWhite;
2073d15e65928aec551b7388c2863de3e3e628e2e0ddcristy      value=GetImageProperty(image,"reference-white",exception);
20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (value != (const char *) NULL)
2075dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy        reference_white=StringToDouble(value,(char **) NULL);
20763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      logmap=(Quantum *) AcquireQuantumMemory((size_t) MaxMap+1UL,
20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*logmap));
20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (logmap == (Quantum *) NULL)
20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->filename);
2081014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      black=pow(10.0,(reference_black-reference_white)*(gamma/density)*0.002/
208214f729997de7b80becd54eb3a6b59358417828c3cristy        film_gamma);
2083014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      for (i=0; i <= (ssize_t) (reference_black*MaxMap/1024.0); i++)
20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        logmap[i]=(Quantum) 0;
2085014ead1df2405e1d18615f2b9fd92e29c812fd31cristy      for ( ; i < (ssize_t) (reference_white*MaxMap/1024.0); i++)
2086014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        logmap[i]=ClampToQuantum(QuantumRange/(1.0-black)*
2087014ead1df2405e1d18615f2b9fd92e29c812fd31cristy          (pow(10.0,(1024.0*i/MaxMap-reference_white)*(gamma/density)*0.002/
208814f729997de7b80becd54eb3a6b59358417828c3cristy          film_gamma)-black));
2089bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for ( ; i <= (ssize_t) MaxMap; i++)
20906e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy        logmap[i]=QuantumRange;
209106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      if (image->storage_class == PseudoClass)
209206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        {
209306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          if (SyncImage(image,exception) == MagickFalse)
209406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            return(MagickFalse);
209506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
209606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            return(MagickFalse);
209706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        }
209846ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
2099b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
2100ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy      #pragma omp parallel for schedule(static,4) shared(status) \
21015e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2103bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          sync;
21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2108bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x;
21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21114c08aed51c5899665ade97263692328eea4af106cristy        register Quantum
211205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          exception);
2118acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
21203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=MagickFalse;
21213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
21223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2123bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=(ssize_t) image->columns; x != 0; x--)
21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
21259186d7e2f120719143bb85a3225f94110dc39d7ccristy          double
21269186d7e2f120719143bb85a3225f94110dc39d7ccristy            blue,
21279186d7e2f120719143bb85a3225f94110dc39d7ccristy            green,
21289186d7e2f120719143bb85a3225f94110dc39d7ccristy            red;
21299186d7e2f120719143bb85a3225f94110dc39d7ccristy
2130251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          red=(double) logmap[ScaleQuantumToMap(GetPixelRed(image,q))];
2131251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          green=(double) logmap[ScaleQuantumToMap(GetPixelGreen(image,q))];
2132251743b0a8fc495a0b32a953667f0e4f257f0c45cristy          blue=(double) logmap[ScaleQuantumToMap(GetPixelBlue(image,q))];
2133aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy          SetPixelRed(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2134aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy            red)),q);
2135aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy          SetPixelGreen(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2136aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy            green)),q);
2137aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy          SetPixelBlue(image,ClampToQuantum(EncodePixelGamma((MagickRealType)
2138aa60eaa3ea0ca8998c902daa6e3a4c44e24de873cristy            blue)),q);
2139ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (sync == MagickFalse)
21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
21443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_view=DestroyCacheView(image_view);
21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      logmap=(Quantum *) RelinquishMagickMemory(logmap);
2147bff574ef9db03a0553866d7ea533cc8536b93b19cristy      if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(MagickFalse);
21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(status);
21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
215106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    case RGBColorspace:
215211d449411057c5a71c450e95121426fce5af8854cristy    case scRGBColorspace:
215306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    {
215406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      /*
215506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        Transform linear RGB to sRGB colorspace.
215606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      */
215706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      if (image->storage_class == PseudoClass)
215806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        {
215906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          if (SyncImage(image,exception) == MagickFalse)
216006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            return(MagickFalse);
216106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
216206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            return(MagickFalse);
216306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        }
216446ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
216506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
216606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      #pragma omp parallel for schedule(static,4) shared(status) \
21675e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
216806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy#endif
216906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      for (y=0; y < (ssize_t) image->rows; y++)
217006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      {
217106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        MagickBooleanType
217206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          sync;
217306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
217406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        register ssize_t
217506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          x;
217606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
217706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        register Quantum
217805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
217906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
218006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        if (status == MagickFalse)
218106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          continue;
218206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
218306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          exception);
218406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        if (q == (Quantum *) NULL)
218506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          {
218606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            status=MagickFalse;
218706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            continue;
218806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          }
218906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        for (x=(ssize_t) image->columns; x != 0; x--)
219006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        {
219106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          double
219206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            blue,
219306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            green,
219406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy            red;
219506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy
2196c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy          red=EncodePixelGamma((MagickRealType) GetPixelRed(image,q));
2197c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy          green=EncodePixelGamma((MagickRealType) GetPixelGreen(image,q));
2198c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy          blue=EncodePixelGamma((MagickRealType) GetPixelBlue(image,q));
219906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          SetPixelRed(image,ClampToQuantum(red),q);
220006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          SetPixelGreen(image,ClampToQuantum(green),q);
220106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          SetPixelBlue(image,ClampToQuantum(blue),q);
220206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          q+=GetPixelChannels(image);
220306f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        }
220406f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
220506f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        if (sync == MagickFalse)
220606f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy          status=MagickFalse;
220706f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      }
220806f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      image_view=DestroyCacheView(image_view);
220906f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
221006f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy        return(MagickFalse);
221106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy      return(status);
221206f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    }
22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
22173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate the tables.
22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*x_map));
22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*y_map));
22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  z_map=(TransformPacket *) AcquireQuantumMemory((size_t) MaxMap+1UL,
22243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*z_map));
22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((x_map == (TransformPacket *) NULL) ||
22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (y_map == (TransformPacket *) NULL) ||
22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (z_map == (TransformPacket *) NULL))
22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (z_map != (TransformPacket *) NULL)
22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (y_map != (TransformPacket *) NULL)
22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (x_map != (TransformPacket *) NULL)
22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2238c404ff637035f3815b1b2907f2b694f7cfa09077cristy  switch (image->colorspace)
22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case OHTAColorspace:
22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
22433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize OHTA tables:
22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2245ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy          I1 = 0.33333*R+0.33334*G+0.33333*B
2246ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy          I2 = 0.50000*R+0.00000*G-0.50000*B
2247ecda7fd3fee4dc80d539ddfe5406413f1aa5bb38cristy          I3 =-0.25000*R+0.50000*G-0.25000*B
22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          R = I1+1.00000*I2-0.66668*I3
22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          G = I1+0.00000*I2+1.33333*I3
22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          B = I1-1.00000*I2-0.66668*I3
22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        I and Q, normally -0.5 through 0.5, must be normalized to the range 0
22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        through QuantumRange.
22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
225526b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
22569a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
2257cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2259bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i <= (ssize_t) MaxMap; i++)
22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2261014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=(MagickRealType) (1.0*(double) i);
22621aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        y_map[i].x=(MagickRealType) (0.5*1.00000*(2.0*(double) i-MaxMap));
22631aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        z_map[i].x=(MagickRealType) (-0.5*0.66668*(2.0*(double) i-MaxMap));
2264014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=(MagickRealType) (1.0*(double) i);
22651aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        y_map[i].y=(MagickRealType) (0.5*0.00000*(2.0*(double) i-MaxMap));
22661aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        z_map[i].y=(MagickRealType) (0.5*1.33333*(2.0*(double) i-MaxMap));
2267014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=(MagickRealType) (1.0*(double) i);
22681aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        y_map[i].z=(MagickRealType) (-0.5*1.00000*(2.0*(double) i-MaxMap));
22691aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        z_map[i].z=(MagickRealType) (-0.5*0.66668*(2.0*(double) i-MaxMap));
22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case Rec601YCbCrColorspace:
22743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize YCbCr tables:
22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          R = Y            +1.402000*Cr
22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          G = Y-0.344136*Cb-0.714136*Cr
22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          B = Y+1.772000*Cb
22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        through QuantumRange.
22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
228526b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
22869a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
2287cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2289bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i <= (ssize_t) MaxMap; i++)
22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2291014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=0.99999999999914679361*(double) i;
2292bf4ee61102f8ec6c439d7a84c69c32302697cafdanthony        y_map[i].x=0.5*(-1.2188941887145875e-06)*(2.00*(double) i-MaxMap);
2293014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].x=0.5*1.4019995886561440468*(2.00*(double) i-MaxMap);
2294014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=0.99999975910502514331*(double) i;
2295014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=0.5*(-0.34413567816504303521)*(2.00*(double) i-MaxMap);
2296014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].y=0.5*(-0.71413649331646789076)*(2.00*(double) i-MaxMap);
2297014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=1.00000124040004623180*(double) i;
2298014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].z=0.5*1.77200006607230409200*(2.00*(double) i-MaxMap);
22991aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        z_map[i].z=0.5*2.1453384174593273e-06*(2.00*(double) i-MaxMap);
23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case Rec709YCbCrColorspace:
23043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize YCbCr tables:
23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          R = Y            +1.574800*Cr
23093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          G = Y-0.187324*Cb-0.468124*Cr
23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          B = Y+1.855600*Cb
23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Cb and Cr, normally -0.5 through 0.5, must be normalized to the range 0
23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        through QuantumRange.
23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
231526b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
23169a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
2317cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2319bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i <= (ssize_t) MaxMap; i++)
23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2321014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=(MagickRealType) (1.0*i);
23221aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        y_map[i].x=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
2323014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].x=(MagickRealType) (0.5*1.574800*(2.0*i-MaxMap));
2324014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=(MagickRealType) (1.0*i);
2325014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=(MagickRealType) (0.5*(-0.187324)*(2.0*i-MaxMap));
2326014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].y=(MagickRealType) (0.5*(-0.468124)*(2.0*i-MaxMap));
2327014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=(MagickRealType) (1.0*i);
2328014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].z=(MagickRealType) (0.5*1.855600*(2.0*i-MaxMap));
23291aa8a8887b80e78d1e7bbc658520bdc198183b68cristy        z_map[i].z=(MagickRealType) (0.5*0.000000*(2.0*i-MaxMap));
23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case YCCColorspace:
23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize YCC tables:
23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          R = Y            +1.340762*C2
23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          G = Y-0.317038*C1-0.682243*C2
23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          B = Y+1.632639*C1
23413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        YCC is scaled by 1.3584.  C1 zero is 156 and C2 is at 137.
23433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
234426b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
23459a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
2346cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2348bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i <= (ssize_t) MaxMap; i++)
23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2350014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=(MagickRealType) (1.3584000*(double) i);
2351014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].x=(MagickRealType) 0.0000000;
2352014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].x=(MagickRealType) (1.8215000*(1.0*(double) i-(double)
235314f729997de7b80becd54eb3a6b59358417828c3cristy          ScaleQuantumToMap(ScaleCharToQuantum(137))));
2354014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].y=(MagickRealType) (1.3584000*(double) i);
2355014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=(MagickRealType) (-0.4302726*(1.0*(double) i-(double)
235614f729997de7b80becd54eb3a6b59358417828c3cristy          ScaleQuantumToMap(ScaleCharToQuantum(156))));
2357014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].y=(MagickRealType) (-0.9271435*(1.0*(double) i-(double)
235814f729997de7b80becd54eb3a6b59358417828c3cristy          ScaleQuantumToMap(ScaleCharToQuantum(137))));
2359014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].z=(MagickRealType) (1.3584000*(double) i);
2360014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].z=(MagickRealType) (2.2179000*(1.0*(double) i-(double)
236114f729997de7b80becd54eb3a6b59358417828c3cristy          ScaleQuantumToMap(ScaleCharToQuantum(156))));
2362014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].z=(MagickRealType) 0.0000000;
23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
23667719b88fb78ce7098766d1844bc74a7628c74291cristy    default:
23677719b88fb78ce7098766d1844bc74a7628c74291cristy    {
23687719b88fb78ce7098766d1844bc74a7628c74291cristy      /*
23697719b88fb78ce7098766d1844bc74a7628c74291cristy        Linear conversion tables.
23707719b88fb78ce7098766d1844bc74a7628c74291cristy      */
237126b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
23729a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy      #pragma omp parallel for schedule(static,4) \
2373cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
23747719b88fb78ce7098766d1844bc74a7628c74291cristy#endif
23757719b88fb78ce7098766d1844bc74a7628c74291cristy      for (i=0; i <= (ssize_t) MaxMap; i++)
23767719b88fb78ce7098766d1844bc74a7628c74291cristy      {
2377014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        x_map[i].x=(MagickRealType) (1.0*(double) i);
237814f729997de7b80becd54eb3a6b59358417828c3cristy        y_map[i].x=(MagickRealType) 0.0;
237914f729997de7b80becd54eb3a6b59358417828c3cristy        z_map[i].x=(MagickRealType) 0.0;
238014f729997de7b80becd54eb3a6b59358417828c3cristy        x_map[i].y=(MagickRealType) 0.0;
2381014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        y_map[i].y=(MagickRealType) (1.0*(double) i);
238214f729997de7b80becd54eb3a6b59358417828c3cristy        z_map[i].y=(MagickRealType) 0.0;
238314f729997de7b80becd54eb3a6b59358417828c3cristy        x_map[i].z=(MagickRealType) 0.0;
238414f729997de7b80becd54eb3a6b59358417828c3cristy        y_map[i].z=(MagickRealType) 0.0;
2385014ead1df2405e1d18615f2b9fd92e29c812fd31cristy        z_map[i].z=(MagickRealType) (1.0*(double) i);
23867719b88fb78ce7098766d1844bc74a7628c74291cristy      }
23877719b88fb78ce7098766d1844bc74a7628c74291cristy      break;
23887719b88fb78ce7098766d1844bc74a7628c74291cristy    }
23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
239106f8077b26077cfb1019a4b3fb3d8cf8e5f58eaacristy    Convert to sRGB.
23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (image->storage_class)
23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case DirectClass:
23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert DirectClass image.
24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
240146ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy      image_view=AcquireAuthenticCacheView(image,exception);
2402b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
2403ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy      #pragma omp parallel for schedule(static,4) shared(status) \
24045e6b259130f9dbe0da4666f734937017babe573acristy        magick_threads(image,image,image->rows,1)
24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2406bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
24073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          sync;
24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24114c08aed51c5899665ade97263692328eea4af106cristy        PixelInfo
24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel;
24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2414bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register ssize_t
24153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          x;
24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24174c08aed51c5899665ade97263692328eea4af106cristy        register Quantum
241805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk          *magick_restrict q;
24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
24213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          continue;
24223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,
24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          exception);
2424acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=MagickFalse;
24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            continue;
24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2429bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2431bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          register size_t
24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            blue,
24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            green,
24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            red;
24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
24364c08aed51c5899665ade97263692328eea4af106cristy          red=ScaleQuantumToMap(GetPixelRed(image,q));
24374c08aed51c5899665ade97263692328eea4af106cristy          green=ScaleQuantumToMap(GetPixelGreen(image,q));
24384c08aed51c5899665ade97263692328eea4af106cristy          blue=ScaleQuantumToMap(GetPixelBlue(image,q));
24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
24426a1f144d38330323d34839ffcc512d73fa46b4decristy          if (image->colorspace == YCCColorspace)
24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
2444014ead1df2405e1d18615f2b9fd92e29c812fd31cristy              pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
244527e753d92bd403fcf40168cfee9cd3cc62ffd836cristy                (double) MaxMap)];
2446014ead1df2405e1d18615f2b9fd92e29c812fd31cristy              pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
244727e753d92bd403fcf40168cfee9cd3cc62ffd836cristy                (double) MaxMap)];
2448014ead1df2405e1d18615f2b9fd92e29c812fd31cristy              pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
244927e753d92bd403fcf40168cfee9cd3cc62ffd836cristy                (double) MaxMap)];
24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
24516a1f144d38330323d34839ffcc512d73fa46b4decristy          else
24526a1f144d38330323d34839ffcc512d73fa46b4decristy            {
2453251743b0a8fc495a0b32a953667f0e4f257f0c45cristy              pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2454251743b0a8fc495a0b32a953667f0e4f257f0c45cristy              pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2455251743b0a8fc495a0b32a953667f0e4f257f0c45cristy              pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
24566a1f144d38330323d34839ffcc512d73fa46b4decristy            }
245727e753d92bd403fcf40168cfee9cd3cc62ffd836cristy          SetPixelRed(image,ClampToQuantum(pixel.red),q);
245827e753d92bd403fcf40168cfee9cd3cc62ffd836cristy          SetPixelGreen(image,ClampToQuantum(pixel.green),q);
245927e753d92bd403fcf40168cfee9cd3cc62ffd836cristy          SetPixelBlue(image,ClampToQuantum(pixel.blue),q);
2460ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sync=SyncCacheViewAuthenticPixels(image_view,exception);
24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (sync == MagickFalse)
24643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->progress_monitor != (MagickProgressMonitor) NULL)
24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
24673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            MagickBooleanType
24683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              proceed;
24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2470b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
2471501c5597e8d10b6102a4566f2740f4166bdd545fcristy            #pragma omp critical (MagickCore_TransformsRGBImage)
24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2473501c5597e8d10b6102a4566f2740f4166bdd545fcristy            proceed=SetImageProgress(image,TransformsRGBImageTag,progress++,
24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (proceed == MagickFalse)
24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              status=MagickFalse;
24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_view=DestroyCacheView(image_view);
24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
24823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PseudoClass:
24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoClass image.
24863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2487b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
2488ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy      #pragma omp parallel for schedule(static,4) shared(status) \
2489cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy        magick_threads(image,image,1,1)
24903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2491bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
24923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
24934c08aed51c5899665ade97263692328eea4af106cristy        PixelInfo
24943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixel;
24953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2496bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        register size_t
24973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          blue,
24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          green,
24993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          red;
25003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2501564a56979706a30a3d0f920fd5f538a408efd4f1cristy        red=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].red));
2502564a56979706a30a3d0f920fd5f538a408efd4f1cristy        green=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].green));
2503564a56979706a30a3d0f920fd5f538a408efd4f1cristy        blue=ScaleQuantumToMap(ClampToQuantum(image->colormap[i].blue));
25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel.red=x_map[red].x+y_map[green].x+z_map[blue].x;
25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel.green=x_map[red].y+y_map[green].y+z_map[blue].y;
25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixel.blue=x_map[red].z+y_map[green].z+z_map[blue].z;
25076a1f144d38330323d34839ffcc512d73fa46b4decristy        if (image->colorspace == YCCColorspace)
25083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2509014ead1df2405e1d18615f2b9fd92e29c812fd31cristy            pixel.red=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.red/
2510541a3c9257a928960520190a883adb2de526a5d5cristy              (double) MaxMap)];
2511014ead1df2405e1d18615f2b9fd92e29c812fd31cristy            pixel.green=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.green/
2512541a3c9257a928960520190a883adb2de526a5d5cristy              (double) MaxMap)];
2513014ead1df2405e1d18615f2b9fd92e29c812fd31cristy            pixel.blue=QuantumRange*YCCMap[RoundToYCC(1024.0*pixel.blue/
2514541a3c9257a928960520190a883adb2de526a5d5cristy              (double) MaxMap)];
25156a1f144d38330323d34839ffcc512d73fa46b4decristy          }
25166a1f144d38330323d34839ffcc512d73fa46b4decristy        else
25176a1f144d38330323d34839ffcc512d73fa46b4decristy          {
2518251743b0a8fc495a0b32a953667f0e4f257f0c45cristy            pixel.red=(MagickRealType) ScaleMapToQuantum(pixel.red);
2519251743b0a8fc495a0b32a953667f0e4f257f0c45cristy            pixel.green=(MagickRealType) ScaleMapToQuantum(pixel.green);
2520251743b0a8fc495a0b32a953667f0e4f257f0c45cristy            pixel.blue=(MagickRealType) ScaleMapToQuantum(pixel.blue);
25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2522541a3c9257a928960520190a883adb2de526a5d5cristy        image->colormap[i].red=(double) ClampToQuantum(pixel.red);
2523541a3c9257a928960520190a883adb2de526a5d5cristy        image->colormap[i].green=(double) ClampToQuantum(pixel.green);
2524541a3c9257a928960520190a883adb2de526a5d5cristy        image->colormap[i].blue=(double) ClampToQuantum(pixel.blue);
25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2526ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Relinquish resources.
25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  z_map=(TransformPacket *) RelinquishMagickMemory(z_map);
25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  y_map=(TransformPacket *) RelinquishMagickMemory(y_map);
25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x_map=(TransformPacket *) RelinquishMagickMemory(x_map);
2536bff574ef9db03a0553866d7ea533cc8536b93b19cristy  if (SetImageColorspace(image,sRGBColorspace,exception) == MagickFalse)
25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2540