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