pixel.c revision 043a981a1f6b2393520e911594ce29ef5b060ee5
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PPPP IIIII X X EEEEE L % 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% P P I X X E L % 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PPPP I X EEE L % 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% P I X X E L % 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% P IIIII X X EEEEE LLLLL % 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickCore Methods to Import/Export Pixels % 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Software Design % 15de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy% Cristy % 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% October 1998 % 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 19b56bb24a985ca4366713bcd8ffdfacbb48a98a2fcristy% Copyright 1999-2015 ImageMagick Studio LLC, a non-profit organization % 203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% dedicated to making software imaging solutions freely available. % 213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% You may not use this file except in compliance with the License. You may % 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% obtain a copy of the License at % 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% http://www.imagemagick.org/script/license.php % 263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Unless required by applicable law or agreed to in writing, software % 283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% distributed under the License is distributed on an "AS IS" BASIS, % 293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% See the License for the specific language governing permissions and % 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% limitations under the License. % 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include declarations. 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 414c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h" 424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h" 434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h" 444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h" 45322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy#include "MagickCore/cache-private.h" 464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h" 471f07555d1773dac3acebfce4ba017128246923c2cristy#include "MagickCore/colorspace-private.h" 484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/draw.h" 494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h" 504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h" 514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h" 524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/constitute.h" 534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/delegate.h" 544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/geometry.h" 554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h" 564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h" 574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h" 584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h" 594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h" 604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h" 614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel.h" 624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h" 63380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy#include "MagickCore/pixel-private.h" 644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum.h" 654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h" 664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h" 674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h" 684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/statistic.h" 694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/stream.h" 704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h" 714c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/transform.h" 724c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h" 734c08aed51c5899665ade97263692328eea4af106cristy 74146a62b25d7466cceec79975894ce812e11f4625cristy/* 754c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 764c08aed51c5899665ade97263692328eea4af106cristy% % 774c08aed51c5899665ade97263692328eea4af106cristy% % 784c08aed51c5899665ade97263692328eea4af106cristy% % 79ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+ A c q u i r e P i x e l C h a n n e l M a p % 804c08aed51c5899665ade97263692328eea4af106cristy% % 814c08aed51c5899665ade97263692328eea4af106cristy% % 824c08aed51c5899665ade97263692328eea4af106cristy% % 834c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 844c08aed51c5899665ade97263692328eea4af106cristy% 85ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% AcquirePixelChannelMap() acquires a pixel component map. 864c08aed51c5899665ade97263692328eea4af106cristy% 87ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% The format of the AcquirePixelChannelMap() method is: 884c08aed51c5899665ade97263692328eea4af106cristy% 89bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% PixelChannelMap *AcquirePixelChannelMap(void) 904c08aed51c5899665ade97263692328eea4af106cristy% 914c08aed51c5899665ade97263692328eea4af106cristy*/ 92bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *AcquirePixelChannelMap(void) 934c08aed51c5899665ade97263692328eea4af106cristy{ 94ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy PixelChannelMap 95bd5a96cd2b69f218f85a7adc306296a736f91a56cristy *channel_map; 964c08aed51c5899665ade97263692328eea4af106cristy 974c08aed51c5899665ade97263692328eea4af106cristy register ssize_t 984c08aed51c5899665ade97263692328eea4af106cristy i; 994c08aed51c5899665ade97263692328eea4af106cristy 100bd5a96cd2b69f218f85a7adc306296a736f91a56cristy channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels, 101bd5a96cd2b69f218f85a7adc306296a736f91a56cristy sizeof(*channel_map)); 102bd5a96cd2b69f218f85a7adc306296a736f91a56cristy if (channel_map == (PixelChannelMap *) NULL) 1034c08aed51c5899665ade97263692328eea4af106cristy ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 104bd5a96cd2b69f218f85a7adc306296a736f91a56cristy (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map)); 105bd5a96cd2b69f218f85a7adc306296a736f91a56cristy for (i=0; i < MaxPixelChannels; i++) 106bd5a96cd2b69f218f85a7adc306296a736f91a56cristy channel_map[i].channel=(PixelChannel) i; 107ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy return(channel_map); 1084c08aed51c5899665ade97263692328eea4af106cristy} 1094c08aed51c5899665ade97263692328eea4af106cristy 1104c08aed51c5899665ade97263692328eea4af106cristy/* 1114c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1124c08aed51c5899665ade97263692328eea4af106cristy% % 1134c08aed51c5899665ade97263692328eea4af106cristy% % 1144c08aed51c5899665ade97263692328eea4af106cristy% % 115ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+ C l o n e P i x e l C h a n n e l M a p % 1164c08aed51c5899665ade97263692328eea4af106cristy% % 1174c08aed51c5899665ade97263692328eea4af106cristy% % 1184c08aed51c5899665ade97263692328eea4af106cristy% % 1194c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1204c08aed51c5899665ade97263692328eea4af106cristy% 121ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% ClonePixelChannelMap() clones a pixel component map. 1224c08aed51c5899665ade97263692328eea4af106cristy% 123ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% The format of the ClonePixelChannelMap() method is: 1244c08aed51c5899665ade97263692328eea4af106cristy% 125bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map) 1264c08aed51c5899665ade97263692328eea4af106cristy% 1274c08aed51c5899665ade97263692328eea4af106cristy% A description of each parameter follows: 1284c08aed51c5899665ade97263692328eea4af106cristy% 129ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% o channel_map: the pixel component map. 1304c08aed51c5899665ade97263692328eea4af106cristy% 1314c08aed51c5899665ade97263692328eea4af106cristy*/ 132bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map) 1334c08aed51c5899665ade97263692328eea4af106cristy{ 134ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy PixelChannelMap 135bd5a96cd2b69f218f85a7adc306296a736f91a56cristy *clone_map; 1364c08aed51c5899665ade97263692328eea4af106cristy 137bd5a96cd2b69f218f85a7adc306296a736f91a56cristy assert(channel_map != (PixelChannelMap *) NULL); 138ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy clone_map=AcquirePixelChannelMap(); 139bd5a96cd2b69f218f85a7adc306296a736f91a56cristy if (clone_map == (PixelChannelMap *) NULL) 140bd5a96cd2b69f218f85a7adc306296a736f91a56cristy return((PixelChannelMap *) NULL); 141bd5a96cd2b69f218f85a7adc306296a736f91a56cristy (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels* 142bd5a96cd2b69f218f85a7adc306296a736f91a56cristy sizeof(*channel_map)); 1434c08aed51c5899665ade97263692328eea4af106cristy return(clone_map); 1444c08aed51c5899665ade97263692328eea4af106cristy} 1454c08aed51c5899665ade97263692328eea4af106cristy 1464c08aed51c5899665ade97263692328eea4af106cristy/* 1474c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1484c08aed51c5899665ade97263692328eea4af106cristy% % 1494c08aed51c5899665ade97263692328eea4af106cristy% % 1504c08aed51c5899665ade97263692328eea4af106cristy% % 1514c08aed51c5899665ade97263692328eea4af106cristy+ C l o n e P i x e l I n f o % 1524c08aed51c5899665ade97263692328eea4af106cristy% % 1534c08aed51c5899665ade97263692328eea4af106cristy% % 1544c08aed51c5899665ade97263692328eea4af106cristy% % 1554c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1564c08aed51c5899665ade97263692328eea4af106cristy% 1574c08aed51c5899665ade97263692328eea4af106cristy% ClonePixelInfo() makes a duplicate of the given pixel info structure, or if 1584c08aed51c5899665ade97263692328eea4af106cristy% pixel info is NULL, a new one. 1594c08aed51c5899665ade97263692328eea4af106cristy% 1604c08aed51c5899665ade97263692328eea4af106cristy% The format of the ClonePixelInfo method is: 1614c08aed51c5899665ade97263692328eea4af106cristy% 1621f07555d1773dac3acebfce4ba017128246923c2cristy% PixelInfo *ClonePixelInfo(const PixelInfo *pixel) 1634c08aed51c5899665ade97263692328eea4af106cristy% 1644c08aed51c5899665ade97263692328eea4af106cristy% A description of each parameter follows: 1654c08aed51c5899665ade97263692328eea4af106cristy% 1661f07555d1773dac3acebfce4ba017128246923c2cristy% o pixel: the pixel info. 1674c08aed51c5899665ade97263692328eea4af106cristy% 1684c08aed51c5899665ade97263692328eea4af106cristy*/ 1694c08aed51c5899665ade97263692328eea4af106cristyMagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel) 1704c08aed51c5899665ade97263692328eea4af106cristy{ 1714c08aed51c5899665ade97263692328eea4af106cristy PixelInfo 1724c08aed51c5899665ade97263692328eea4af106cristy *pixel_info; 1734c08aed51c5899665ade97263692328eea4af106cristy 174a64b85d7873d5e540fe6e2941aa98ec7653a4e2dcristy pixel_info=(PixelInfo *) AcquireQuantumMemory(1,sizeof(*pixel_info)); 1754c08aed51c5899665ade97263692328eea4af106cristy if (pixel_info == (PixelInfo *) NULL) 1764c08aed51c5899665ade97263692328eea4af106cristy ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 1774c08aed51c5899665ade97263692328eea4af106cristy *pixel_info=(*pixel); 1784c08aed51c5899665ade97263692328eea4af106cristy return(pixel_info); 1794c08aed51c5899665ade97263692328eea4af106cristy} 1804c08aed51c5899665ade97263692328eea4af106cristy 1814c08aed51c5899665ade97263692328eea4af106cristy/* 1824c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1834c08aed51c5899665ade97263692328eea4af106cristy% % 1844c08aed51c5899665ade97263692328eea4af106cristy% % 1854c08aed51c5899665ade97263692328eea4af106cristy% % 1861f07555d1773dac3acebfce4ba017128246923c2cristy+ C o n f o r m P i x e l I n f o % 1871f07555d1773dac3acebfce4ba017128246923c2cristy% % 1881f07555d1773dac3acebfce4ba017128246923c2cristy% % 1891f07555d1773dac3acebfce4ba017128246923c2cristy% % 1901f07555d1773dac3acebfce4ba017128246923c2cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1911f07555d1773dac3acebfce4ba017128246923c2cristy% 1921f07555d1773dac3acebfce4ba017128246923c2cristy% ConformPixelInfo() ensures the pixel conforms with the colorspace and alpha 1931f07555d1773dac3acebfce4ba017128246923c2cristy% attribute of the image. 1941f07555d1773dac3acebfce4ba017128246923c2cristy% 1951f07555d1773dac3acebfce4ba017128246923c2cristy% The format of the ConformPixelInfo method is: 1961f07555d1773dac3acebfce4ba017128246923c2cristy% 19741029e100025ab869690dab8e564c8ee30d0120ccristy% void *ConformPixelInfo((Image *image,const PixelInfo *source, 19841029e100025ab869690dab8e564c8ee30d0120ccristy% PixelInfo *destination,ExceptionInfo *exception) 1991f07555d1773dac3acebfce4ba017128246923c2cristy% 2001f07555d1773dac3acebfce4ba017128246923c2cristy% A description of each parameter follows: 2011f07555d1773dac3acebfce4ba017128246923c2cristy% 2021f07555d1773dac3acebfce4ba017128246923c2cristy% o image: the image. 2031f07555d1773dac3acebfce4ba017128246923c2cristy% 204bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk% o source: the source pixel info. 205bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk% 206bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk% o destination: the destination pixel info. 207bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk% 2081f07555d1773dac3acebfce4ba017128246923c2cristy% o exception: return any errors or warnings in this structure. 2091f07555d1773dac3acebfce4ba017128246923c2cristy% 2101f07555d1773dac3acebfce4ba017128246923c2cristy*/ 211bfdd5bc06830778f14dfa0659b389ff630b7fbfedirkMagickExport void ConformPixelInfo(Image *image,const PixelInfo *source, 212bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk PixelInfo *destination,ExceptionInfo *exception) 2131f07555d1773dac3acebfce4ba017128246923c2cristy{ 2141f07555d1773dac3acebfce4ba017128246923c2cristy assert(image != (Image *) NULL); 2151f07555d1773dac3acebfce4ba017128246923c2cristy assert(image->signature == MagickSignature); 216bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk assert(destination != (const PixelInfo *) NULL); 217bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk *destination=(*source); 2181f07555d1773dac3acebfce4ba017128246923c2cristy if (image->colorspace == CMYKColorspace) 2191f07555d1773dac3acebfce4ba017128246923c2cristy { 220bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk if (IssRGBCompatibleColorspace(destination->colorspace)) 221bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk ConvertRGBToCMYK(destination); 2221f07555d1773dac3acebfce4ba017128246923c2cristy } 2231f07555d1773dac3acebfce4ba017128246923c2cristy else 224bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk if (destination->colorspace == CMYKColorspace) 2251f07555d1773dac3acebfce4ba017128246923c2cristy { 2261f07555d1773dac3acebfce4ba017128246923c2cristy if (IssRGBCompatibleColorspace(image->colorspace)) 227bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk ConvertCMYKToRGB(destination); 2281f07555d1773dac3acebfce4ba017128246923c2cristy } 229bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk if ((IsPixelInfoGray(&image->background_color) == MagickFalse) && 230bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk (IsGrayColorspace(image->colorspace) != MagickFalse)) 231bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk (void) TransformImageColorspace(image,sRGBColorspace,exception); 23217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if ((destination->alpha_trait != UndefinedPixelTrait) && 23317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy (image->alpha_trait == UndefinedPixelTrait)) 2341f07555d1773dac3acebfce4ba017128246923c2cristy (void) SetImageAlpha(image,OpaqueAlpha,exception); 2351f07555d1773dac3acebfce4ba017128246923c2cristy} 2361f07555d1773dac3acebfce4ba017128246923c2cristy 2371f07555d1773dac3acebfce4ba017128246923c2cristy/* 2381f07555d1773dac3acebfce4ba017128246923c2cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2391f07555d1773dac3acebfce4ba017128246923c2cristy% % 2401f07555d1773dac3acebfce4ba017128246923c2cristy% % 2411f07555d1773dac3acebfce4ba017128246923c2cristy% % 242c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% D e c o d e P i x e l G a m m a % 243c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 244c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 245c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 246c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 247c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 248c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% DecodePixelGamma() applies the expansive power-law nonlinearity to the pixel. 249c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 2503506059097340c6cdeff165058b5e18adfc89025cristy% The format of the DecodePixelGamma method is: 251c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 252c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% double DecodePixelGamma(const MagickRealType pixel) 253c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 254c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% A description of each parameter follows: 255c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 256c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% o pixel: the pixel. 257c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 258c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy*/ 259c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 260c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristystatic inline double DecodeGamma(const double x) 261c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy{ 262c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy div_t 263c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient; 264c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 265c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy double 266c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy p, 267c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[9]; 268c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 269c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy int 270c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy exponent; 271c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 272c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy static const double coefficient[] = /* terms for x^(7/5), x=1.5 */ 273c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy { 274c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.7917488588043277509, 275c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 0.82045614371976854984, 276c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 0.027694100686325412819, 277c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy -0.00094244335181762134018, 278c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 0.000064355540911469709545, 279c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy -5.7224404636060757485e-06, 280c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 5.8767669437311184313e-07, 281c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy -6.6139920053589721168e-08, 282c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 7.9323242696227458163e-09 283c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy }; 284c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 285c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy static const double powers_of_two[] = /* (2^x)^(7/5) */ 286c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy { 287c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.0, 288c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 2.6390158215457883983, 289c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 6.9644045063689921093, 290c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.8379173679952558018e+01, 291c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 4.8502930128332728543e+01 292c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy }; 293c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 294c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy /* 295c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy Compute x^2.4 == x*x^(7/5) == pow(x,2.4). 296c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy */ 297c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[0]=1.0; 298c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[1]=4.0*frexp(x,&exponent)-3.0; 299c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[2]=2.0*term[1]*term[1]-term[0]; 300c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[3]=2.0*term[1]*term[2]-term[1]; 301c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[4]=2.0*term[1]*term[3]-term[2]; 302c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[5]=2.0*term[1]*term[4]-term[3]; 303c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[6]=2.0*term[1]*term[5]-term[4]; 304c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[7]=2.0*term[1]*term[6]-term[5]; 305c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[8]=2.0*term[1]*term[7]-term[6]; 306c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy p=coefficient[0]*term[0]+coefficient[1]*term[1]+coefficient[2]*term[2]+ 307c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy coefficient[3]*term[3]+coefficient[4]*term[4]+coefficient[5]*term[5]+ 308c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy coefficient[6]*term[6]+coefficient[7]*term[7]+coefficient[8]*term[8]; 309c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient=div(exponent-1,5); 310c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy if (quotient.rem < 0) 311c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy { 312c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient.quot-=1; 313c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient.rem+=5; 314c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy } 315c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy return(x*ldexp(powers_of_two[quotient.rem]*p,7*quotient.quot)); 316c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy} 317c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 318c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristyMagickExport MagickRealType DecodePixelGamma(const MagickRealType pixel) 319c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy{ 320c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy if (pixel <= (0.0404482362771076*QuantumRange)) 321c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy return(pixel/12.92f); 322c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy return((MagickRealType) (QuantumRange*DecodeGamma((double) (QuantumScale* 323c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy pixel+0.055)/1.055))); 324c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy} 325c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy 326c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy/* 327c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 328c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 329c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 330c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 331ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+ D e s t r o y P i x e l C h a n n e l M a p % 3324c08aed51c5899665ade97263692328eea4af106cristy% % 3334c08aed51c5899665ade97263692328eea4af106cristy% % 3344c08aed51c5899665ade97263692328eea4af106cristy% % 3354c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3364c08aed51c5899665ade97263692328eea4af106cristy% 337ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% DestroyPixelChannelMap() deallocates memory associated with the pixel 338ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% channel map. 3394c08aed51c5899665ade97263692328eea4af106cristy% 340ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% The format of the DestroyPixelChannelMap() method is: 3414c08aed51c5899665ade97263692328eea4af106cristy% 342bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% PixelChannelMap *DestroyPixelChannelMap(PixelChannelMap *channel_map) 3434c08aed51c5899665ade97263692328eea4af106cristy% 3444c08aed51c5899665ade97263692328eea4af106cristy% A description of each parameter follows: 3454c08aed51c5899665ade97263692328eea4af106cristy% 346ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy% o channel_map: the pixel component map. 3474c08aed51c5899665ade97263692328eea4af106cristy% 3484c08aed51c5899665ade97263692328eea4af106cristy*/ 349bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *DestroyPixelChannelMap( 350bd5a96cd2b69f218f85a7adc306296a736f91a56cristy PixelChannelMap *channel_map) 3514c08aed51c5899665ade97263692328eea4af106cristy{ 352bd5a96cd2b69f218f85a7adc306296a736f91a56cristy assert(channel_map != (PixelChannelMap *) NULL); 353bd5a96cd2b69f218f85a7adc306296a736f91a56cristy channel_map=(PixelChannelMap *) RelinquishMagickMemory(channel_map); 354bd5a96cd2b69f218f85a7adc306296a736f91a56cristy return((PixelChannelMap *) RelinquishMagickMemory(channel_map)); 3554c08aed51c5899665ade97263692328eea4af106cristy} 3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 362c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy+ E n c o d e P i x e l G a m m a % 363c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 364c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 365c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 366c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 367c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 368c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% EncodePixelGamma() cancels any nonlinearity in the pixel. 369c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 3703506059097340c6cdeff165058b5e18adfc89025cristy% The format of the EncodePixelGamma method is: 371c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 372c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% MagickRealType EncodePixelGamma(const double MagickRealType) 373c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 374c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% A description of each parameter follows: 375c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 376c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% o pixel: the pixel. 377c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% 378c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy*/ 379c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 380c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristystatic inline double EncodeGamma(const double x) 381c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy{ 382c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy div_t 383c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient; 384c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 385c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy double 386c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy p, 387c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[9]; 388c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 389c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy int 390c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy exponent; 391c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 392c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy static const double coefficient[] = /* Chebychevi poly: x^(5/12), x=1.5 */ 393c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy { 394c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.1758200232996901923, 395c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 0.16665763094889061230, 396c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy -0.0083154894939042125035, 397c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 0.00075187976780420279038, 398c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy -0.000083240178519391795367, 399c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 0.000010229209410070008679, 400c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy -1.3400466409860246e-06, 401c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.8333422241635376682e-07, 402c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy -2.5878596761348859722e-08 403c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy }; 404c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 405c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy static const double powers_of_two[] = /* (2^N)^(5/12) */ 406c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy { 407c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.0, 408c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.3348398541700343678, 409c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.7817974362806785482, 410c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 2.3784142300054420538, 411c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 3.1748021039363991669, 412c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 4.2378523774371812394, 413c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 5.6568542494923805819, 414c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 7.5509945014535482244, 415c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.0079368399158985525e1, 416c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.3454342644059433809e1, 417c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 1.7959392772949968275e1, 418c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 2.3972913230026907883e1 419c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy }; 420c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 421c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy /* 422c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy Compute x^(1/2.4) == x^(5/12) == pow(x,1.0/2.4). 423c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy */ 424c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[0]=1.0; 425c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[1]=4.0*frexp(x,&exponent)-3.0; 426c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[2]=2.0*term[1]*term[1]-term[0]; 427c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[3]=2.0*term[1]*term[2]-term[1]; 428c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[4]=2.0*term[1]*term[3]-term[2]; 429c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[5]=2.0*term[1]*term[4]-term[3]; 430c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[6]=2.0*term[1]*term[5]-term[4]; 431c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[7]=2.0*term[1]*term[6]-term[5]; 432c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy term[8]=2.0*term[1]*term[7]-term[6]; 433c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy p=coefficient[0]*term[0]+coefficient[1]*term[1]+coefficient[2]*term[2]+ 434c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy coefficient[3]*term[3]+coefficient[4]*term[4]+coefficient[5]*term[5]+ 435c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy coefficient[6]*term[6]+coefficient[7]*term[7]+coefficient[8]*term[8]; 436c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient=div(exponent-1,12); 437c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy if (quotient.rem < 0) 438c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy { 439c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient.quot-=1; 440c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy quotient.rem+=12; 441c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy } 442c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy return(ldexp(powers_of_two[quotient.rem]*p,5*quotient.quot)); 443c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy} 444c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy 445c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristyMagickExport MagickRealType EncodePixelGamma(const MagickRealType pixel) 446c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy{ 447c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy if (pixel <= (0.0031306684425005883*QuantumRange)) 448c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy return(12.92f*pixel); 449c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy return((MagickRealType) QuantumRange*(1.055*EncodeGamma((double) QuantumScale* 4502a13aa6938f7e40986908f79a54a32958bf0fc81cristy pixel)-0.055)); 451c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy} 452c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy 453c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy/* 454c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 455c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 456c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 457c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy% % 4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% E x p o r t I m a g e P i x e l s % 4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExportImagePixels() extracts pixel data from an image and returns it to you. 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The method returns MagickTrue on success otherwise MagickFalse if an error is 466b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy% encountered. The data is returned as char, short int, Quantum, unsigned int, 467cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% unsigned long long, float, or double in the order specified by map. 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Suppose you want to extract the first scanline of a 640x480 image as 4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% character data in red-green-blue order: 4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception); 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ExportImagePixels method is: 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 476cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% MagickBooleanType ExportImagePixels(const Image *image,const ssize_t x, 477cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% const ssize_t y,const size_t width,const size_t height, 478cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% const char *map,const StorageType type,void *pixels, 47946f4be29828ab7588745336d46ab11611c847933cristy% ExceptionInfo *exception) 4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: the image. 4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 485cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% o x,y,width,height: These values define the perimeter 4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of a region of pixels you want to extract. 4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o map: This string reflects the expected ordering of the pixel array. 4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% It can be any combination or order of R = red, G = green, B = blue, 4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, 4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Y = yellow, M = magenta, K = black, I = intensity (for grayscale), 4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% P = pad. 4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o type: Define the data type of the pixels. Float and double types are 4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% normalized to [0..1] otherwise [0..QuantumRange]. Choose from these 4966c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy% types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *), 497ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy% LongPixel (unsigned int *), LongLongPixel (unsigned long long *), 4986c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy% QuantumPixel (Quantum *), or ShortPixel (unsigned short *). 4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pixels: This array of values contain the pixel components as defined by 5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% map and type. You must preallocate this array where the expected 5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% length varies depending on the values of width, height, map, and type. 5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 5082dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportCharPixel(Image *image,const RectangleInfo *roi, 50946f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,void *pixels, 51046f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 515bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register unsigned char 5193fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 52214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 52314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 5249d314ff2c17a77996c05413c2013880387e50f0ecristy ssize_t 5259d314ff2c17a77996c05413c2013880387e50f0ecristy y; 5269d314ff2c17a77996c05413c2013880387e50f0ecristy 52746f4be29828ab7588745336d46ab11611c847933cristy q=(unsigned char *) pixels; 528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 530cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 532cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 535cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelBlue(image,p)); 538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelGreen(image,p)); 539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelRed(image,p)); 540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 547cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 549cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 552cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelBlue(image,p)); 555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelGreen(image,p)); 556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelRed(image,p)); 557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelAlpha(image,p)); 558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 565cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 567cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 570cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelBlue(image,p)); 573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelGreen(image,p)); 574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelRed(image,p)); 575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar((Quantum) 0); 576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 583cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 585cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 588cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 59070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q++=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p))); 591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 598cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 600cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 603cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelRed(image,p)); 606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelGreen(image,p)); 607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelBlue(image,p)); 608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 615cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 617cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 620cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelRed(image,p)); 623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelGreen(image,p)); 624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelBlue(image,p)); 625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelAlpha(image,p)); 626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 633cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 635cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 638cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelRed(image,p)); 641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelGreen(image,p)); 642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar(GetPixelBlue(image,p)); 643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToChar((Quantum) 0); 644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 650cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 652cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 655cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToChar(GetPixelRed(image,p)); 669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToChar(GetPixelGreen(image,p)); 675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToChar(GetPixelBlue(image,p)); 681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToChar(GetPixelAlpha(image,p)); 686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToChar(GetPixelAlpha(image,p)); 691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToChar(GetPixelBlack(image,p)); 697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p))); 702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q++; 708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 7142dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportDoublePixel(Image *image,const RectangleInfo *roi, 71546f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,void *pixels, 71646f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register double 7223fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 72714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 72814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 72914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q=(double *) pixels; 734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 736cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 738cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 7394c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 741cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelBlue(image,p)); 744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelGreen(image,p)); 745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelRed(image,p)); 746ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 749e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 753cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 755cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 758cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelBlue(image,p)); 761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelGreen(image,p)); 762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelRed(image,p)); 763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelAlpha(image,p)); 764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 771cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 773cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 7744c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 776cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelBlue(image,p)); 779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelGreen(image,p)); 780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelRed(image,p)); 781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0.0; 782ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 789cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 791cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 794cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelIntensity(image,p)); 797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 804cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 806cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 809cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelRed(image,p)); 812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelGreen(image,p)); 813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelBlue(image,p)); 814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 821cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 823cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 826cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelRed(image,p)); 829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelGreen(image,p)); 830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelBlue(image,p)); 831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelAlpha(image,p)); 832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 839cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 841cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 8424c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 844cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelRed(image,p)); 847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelGreen(image,p)); 848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(double) (QuantumScale*GetPixelBlue(image,p)); 849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0.0; 850ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 85514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 856cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 858cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 861cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 86614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(double) (QuantumScale*GetPixelRed(image,p)); 875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(double) (QuantumScale*GetPixelGreen(image,p)); 881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(double) (QuantumScale*GetPixelBlue(image,p)); 887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(double) (QuantumScale*GetPixelAlpha(image,p)); 892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(double) (QuantumScale*GetPixelAlpha(image,p)); 897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(double) (QuantumScale* 903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy GetPixelBlack(image,p)); 904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(double) (QuantumScale*GetPixelIntensity(image,p)); 909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q++; 915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 9212dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportFloatPixel(Image *image,const RectangleInfo *roi, 92246f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,void *pixels, 92346f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register float 9293fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 93414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 93514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 93614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q=(float *) pixels; 941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 943cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 945cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 9464c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 948cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelBlue(image,p)); 951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelGreen(image,p)); 952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelRed(image,p)); 953ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 960cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 962cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 965cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelBlue(image,p)); 968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelGreen(image,p)); 969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelRed(image,p)); 970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelAlpha(image,p)); 971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 978cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 980cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 9814c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 983cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelBlue(image,p)); 986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelGreen(image,p)); 987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelRed(image,p)); 988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0.0; 989ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 996cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 998cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1001cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelIntensity(image,p)); 1004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 1010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1011cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1013cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1016cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelRed(image,p)); 1019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelGreen(image,p)); 1020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelBlue(image,p)); 1021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 1027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1028cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1030cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1033cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelRed(image,p)); 1036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelGreen(image,p)); 1037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelBlue(image,p)); 1038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelAlpha(image,p)); 1039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 1045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1046cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1048cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 10494c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1051cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelRed(image,p)); 1054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelGreen(image,p)); 1055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(float) (QuantumScale*GetPixelBlue(image,p)); 1056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0.0; 1057ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 106214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 1063cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1065cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1068cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 107314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 1074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 1076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 1079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(float) (QuantumScale*GetPixelRed(image,p)); 1082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 1085e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(float) (QuantumScale*GetPixelGreen(image,p)); 1088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 1091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(float) (QuantumScale*GetPixelBlue(image,p)); 1094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p)))); 1099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1103e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(float) (QuantumScale*GetPixelAlpha(image,p)); 1104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 1109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(float) (QuantumScale* GetPixelBlack(image,p)); 1110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(float) (QuantumScale*GetPixelIntensity(image,p)); 1115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 1118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q++; 1121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 1126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 11272dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportLongPixel(Image *image,const RectangleInfo *roi, 112846f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,void *pixels, 112946f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 1130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 1131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 1132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 1133e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 1136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register unsigned int 11383fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 1139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 114014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 114114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 114214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 1143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 1144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 1145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q=(unsigned int *) pixels; 1147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 1148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1149cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1151cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 11524c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1154cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11566c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelBlue(image,p)); 11576c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelGreen(image,p)); 11586c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelRed(image,p)); 1159ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1166cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1168cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1171cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 11736c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelBlue(image,p)); 11746c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelGreen(image,p)); 11756c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelRed(image,p)); 11766c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelAlpha(image,p)); 1177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 1183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1184cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1186cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1189cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 11916c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelBlue(image,p)); 11926c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelGreen(image,p)); 11936c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelRed(image,p)); 11946c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=0; 1195e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1197e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1199e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 1201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1202cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1203e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1204cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1206e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1207cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 120970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q++=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p))); 1210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1211e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1214e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 1216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1217cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1219cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1222cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1223e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 12246c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelRed(image,p)); 12256c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelGreen(image,p)); 12266c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelBlue(image,p)); 1227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1228e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1229e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1230e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 1233e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1234cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1236cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1238e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1239cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 12416c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelRed(image,p)); 12426c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelGreen(image,p)); 12436c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelBlue(image,p)); 12446c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelAlpha(image,p)); 1245e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1246e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1248e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1249e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1250e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 1251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1252cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1253e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1254cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1256e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1257cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1258e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 12596c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelRed(image,p)); 12606c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelGreen(image,p)); 12616c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=ScaleQuantumToLong(GetPixelBlue(image,p)); 12626c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q++=0; 1263e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1264e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1265e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1266e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1267e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 126814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 1269cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1271cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1273e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1274cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1276e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 1278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 127914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 1280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 1282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 1283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1284e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 1285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 1286e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 12876c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q=ScaleQuantumToLong(GetPixelRed(image,p)); 1288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1289e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1290e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 1291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 1292e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 12936c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q=ScaleQuantumToLong(GetPixelGreen(image,p)); 1294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1295e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 1297e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 1298e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 12996c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q=ScaleQuantumToLong(GetPixelBlue(image,p)); 1300e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1301e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 1303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 13046c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q=ScaleQuantumToLong(GetPixelAlpha(image,p)); 1305e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1306e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 1308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 13096c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q=ScaleQuantumToLong(GetPixelAlpha(image,p)); 1310e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1311e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 1313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 13156c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy *q=ScaleQuantumToLong(GetPixelBlack(image,p)); 1316e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1317e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1318e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 1319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 132070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p))); 1321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 13246c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy break; 1325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1326e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q++; 1327e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 1332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 13332dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportLongLongPixel(Image *image,const RectangleInfo *roi, 133446f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,void *pixels, 133546f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 1336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 1337e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 1338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 1339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 1342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1343b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy register MagickSizeType 13443fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 1345e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 134614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 134714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 134814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 1349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 1350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 1351e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1352b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy q=(MagickSizeType *) pixels; 1353e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 1354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1355cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1356e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1357cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1360cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1362b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p)); 1363b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p)); 1364b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelRed(image,p)); 1365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1366e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1368e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 1371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1372cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1373e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1374cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1375e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1376e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1377cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1379b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p)); 1380b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p)); 1381b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelRed(image,p)); 1382b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p)); 1383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 1389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1390cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1392cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1393e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1394e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1395cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1397b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p)); 1398b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p)); 1399b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelRed(image,p)); 1400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0; 1401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 1407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1408cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1410cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1412e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1413cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 141570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q++=ScaleQuantumToLongLong(ClampToQuantum(GetPixelIntensity(image,p))); 1416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 1422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1423cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1425cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1428cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1430b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelRed(image,p)); 1431b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p)); 1432b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p)); 1433e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 1439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1440cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1442cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1445cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1447b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelRed(image,p)); 1448b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p)); 1449b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p)); 1450b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p)); 1451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1452e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1453e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 1457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1458cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1460cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1463cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1465b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelRed(image,p)); 1466b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p)); 1467b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p)); 1468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0; 1469e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1472e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 147414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 1475cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1477cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1480cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 1484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 148514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 1486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 1488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 1489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 1491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 1492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1493b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q=ScaleQuantumToLongLong(GetPixelRed(image,p)); 1494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 1497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 1498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1499b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q=ScaleQuantumToLongLong(GetPixelGreen(image,p)); 1500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 1503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 1504e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1505b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q=ScaleQuantumToLongLong(GetPixelBlue(image,p)); 1506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 1509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1510b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p)); 1511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 1514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1515b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p)); 1516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 1519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 1521b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy *q=ScaleQuantumToLongLong(GetPixelBlack(image,p)); 1522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 1525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 152658ee5018960b42b80b54398eacabe9ae5da89149cristy *q=ScaleQuantumToLongLong(ClampToQuantum( 152758ee5018960b42b80b54398eacabe9ae5da89149cristy GetPixelIntensity(image,p))); 1528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 1531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q++; 1534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 1539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 15402dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportQuantumPixel(Image *image,const RectangleInfo *roi, 154146f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,void *pixels, 154246f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 1543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 1544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 1545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 1546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register Quantum 15483fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 1549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 1552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 155314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 155414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 155514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 1556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 1557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 1558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q=(Quantum *) pixels; 1560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 1561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1562cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1564cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1567cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelBlue(image,p); 1570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelGreen(image,p); 1571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelRed(image,p); 1572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 1578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1579cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1581cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1584cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelBlue(image,p); 1587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelGreen(image,p); 1588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelRed(image,p); 1589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(Quantum) (GetPixelAlpha(image,p)); 1590e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 1596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1597cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1599cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1602cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelBlue(image,p); 1605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelGreen(image,p); 1606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelRed(image,p); 1607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(Quantum) 0; 1608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 1614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1615cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1617cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1619e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1620cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 162270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q++=ClampToQuantum(GetPixelIntensity(image,p)); 1623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 1629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1630cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1632cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1635cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelRed(image,p); 1638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelGreen(image,p); 1639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelBlue(image,p); 1640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 1646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1647cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1649cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1652cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelRed(image,p); 1655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelGreen(image,p); 1656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelBlue(image,p); 1657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(Quantum) (GetPixelAlpha(image,p)); 1658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 1664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1665cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1667cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1670cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelRed(image,p); 1673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelGreen(image,p); 1674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=GetPixelBlue(image,p); 1675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=(Quantum) 0; 1676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 168114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 1682cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1684cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1687cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 1691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 169214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 1693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(Quantum) 0; 1695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 1696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 1698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 1699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=GetPixelRed(image,p); 1701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 1704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 1705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=GetPixelGreen(image,p); 1707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 1710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 1711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=GetPixelBlue(image,p); 1713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1714e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 1716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=GetPixelAlpha(image,p); 1718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 1721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=GetPixelAlpha(image,p); 1723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 1726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 1728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=GetPixelBlack(image,p); 1729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 1732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 173370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q=ClampToQuantum(GetPixelIntensity(image,p)); 1734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 1737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=(Quantum) 0; 1739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q++; 1743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 1748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 17492dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportShortPixel(Image *image,const RectangleInfo *roi, 175046f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,void *pixels, 175146f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 1752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 1753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 1754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 1755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 1758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register unsigned short 17603fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 1761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 176214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 176314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 176414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 176514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy ssize_t 176614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy y; 176714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 1768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q=(unsigned short *) pixels; 1769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 1770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1771cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1773cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1776cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelBlue(image,p)); 1779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelGreen(image,p)); 1780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelRed(image,p)); 1781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1786e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 1787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1788cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1790cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1793cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelBlue(image,p)); 1796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelGreen(image,p)); 1797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelRed(image,p)); 1798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelAlpha(image,p)); 1799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 1805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1806cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1808cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1811cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelBlue(image,p)); 1814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelGreen(image,p)); 1815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelRed(image,p)); 1816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0; 1817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 1823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1824cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1826cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1827e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1829cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 183170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q++=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p))); 1832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 1838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1839cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1841cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1844cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelRed(image,p)); 1847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelGreen(image,p)); 1848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelBlue(image,p)); 1849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 1855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1856cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1858cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1861cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelRed(image,p)); 1864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelGreen(image,p)); 1865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelBlue(image,p)); 1866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelAlpha(image,p)); 1867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 1873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1874cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1876cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1879cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelRed(image,p)); 1882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelGreen(image,p)); 1883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=ScaleQuantumToShort(GetPixelBlue(image,p)); 1884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q++=0; 1885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 1889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 189014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 1891cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 1892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1893cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception); 1894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (p == (const Quantum *) NULL) 1895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1896cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 1897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 1900e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 190114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 1902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=0; 1904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 1905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 1907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 1908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToShort(GetPixelRed(image,p)); 1910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 1913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 1914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToShort(GetPixelGreen(image,p)); 1916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 1919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 1920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToShort(GetPixelBlue(image,p)); 1922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 1925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToShort(GetPixelAlpha(image,p)); 1927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 1930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToShort(GetPixelAlpha(image,p)); 1932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 1935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1936e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 1937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *q=ScaleQuantumToShort(GetPixelBlack(image,p)); 1938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 1941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 194270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy *q=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p))); 1943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1945e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 1946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q++; 1949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p+=GetPixelChannels(image); 1951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 1954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 195558ee5018960b42b80b54398eacabe9ae5da89149cristyMagickExport MagickBooleanType ExportImagePixels(Image *image,const ssize_t x, 195658ee5018960b42b80b54398eacabe9ae5da89149cristy const ssize_t y,const size_t width,const size_t height,const char *map, 195758ee5018960b42b80b54398eacabe9ae5da89149cristy const StorageType type,void *pixels,ExceptionInfo *exception) 1958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 1959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy QuantumType 1960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *quantum_map; 1961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 1962cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy RectangleInfo 1963cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi; 1964cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy 1965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 1966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 1967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 196814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 196914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 197014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 1971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy assert(image != (Image *) NULL); 1972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy assert(image->signature == MagickSignature); 1973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->debug != MagickFalse) 1974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 197514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 197614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map)); 1977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (quantum_map == (QuantumType *) NULL) 1978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(), 1980efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename); 1981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 1982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 198314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 1984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (map[i]) 1986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'A': 1988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'a': 1989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=AlphaQuantum; 1991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'B': 1994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'b': 1995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 1996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=BlueQuantum; 1997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 1998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 1999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'C': 2000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'c': 2001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2002e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=CyanQuantum; 2003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 2004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 2006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(),ImageError, 2007efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy "ColorSeparatedImageRequired","`%s'",map); 2008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 2009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'g': 2011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'G': 2012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=GreenQuantum; 2014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'I': 2017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'i': 2018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=IndexQuantum; 2020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'K': 2023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'k': 2024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=BlackQuantum; 2026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 2027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 2029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(),ImageError, 2030efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy "ColorSeparatedImageRequired","`%s'",map); 2031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 2032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'M': 2034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'm': 2035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=MagentaQuantum; 2037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 2038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 2040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(),ImageError, 2041efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy "ColorSeparatedImageRequired","`%s'",map); 2042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 2043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'o': 2045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'O': 2046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=OpacityQuantum; 2048e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'P': 2051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'p': 2052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=UndefinedQuantum; 2054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'R': 2057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'r': 2058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=RedQuantum; 2060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'Y': 2063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'y': 2064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=YellowQuantum; 2066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->colorspace == CMYKColorspace) 2067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 2069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(),ImageError, 2070efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy "ColorSeparatedImageRequired","`%s'",map); 2071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 2072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 2074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 2076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(),OptionError, 2077efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy "UnrecognizedPixelMap","`%s'",map); 2078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 2079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2082cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.width=width; 2083cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.height=height; 2084cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.x=x; 2085cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.y=y; 2086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (type) 2087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CharPixel: 2089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2090cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ExportCharPixel(image,&roi,map,quantum_map,pixels,exception); 2091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case DoublePixel: 2094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2095cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ExportDoublePixel(image,&roi,map,quantum_map,pixels,exception); 2096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case FloatPixel: 2099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2100cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ExportFloatPixel(image,&roi,map,quantum_map,pixels,exception); 2101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 21036c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy case LongPixel: 2104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2105cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ExportLongPixel(image,&roi,map,quantum_map,pixels,exception); 2106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 21086c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy case LongLongPixel: 2109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2110cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ExportLongLongPixel(image,&roi,map,quantum_map,pixels,exception); 2111e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2113e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case QuantumPixel: 2114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2115cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ExportQuantumPixel(image,&roi,map,quantum_map,pixels,exception); 2116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case ShortPixel: 2119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2120cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ExportShortPixel(image,&roi,map,quantum_map,pixels,exception); 2121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 2124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 2126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(),OptionError, 2127efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy "UnrecognizedPixelMap","`%s'",map); 21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 2132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickTrue); 2133e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 2134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/* 2136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% G e t P i x e l I n f o % 2141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% GetPixelInfo() initializes the PixelInfo structure. 2147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% The format of the GetPixelInfo method is: 2149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% GetPixelInfo(const Image *image,PixelInfo *pixel) 2151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% A description of each parameter follows: 2153e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2154a322a839a56b8d9fa40751b1906ce2a4780a24d6anthony% o image: the image. (optional - may be NULL) 2155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% o pixel: Specifies a pointer to a PixelInfo structure. 2157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/ 2159e5370944fabb7afa477ab1325d400731b1e5d5e8cristyMagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel) 2160e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 2161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->storage_class=DirectClass; 21627020ae6594690c03a4f73784fd41a7131a5b22c6cristy pixel->colorspace=sRGBColorspace; 21638a46d827a124555f0c48fb2368ec1bba8e079ab6cristy pixel->alpha_trait=UndefinedPixelTrait; 2164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->fuzz=0.0; 2165e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->depth=MAGICKCORE_QUANTUM_DEPTH; 2166e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->red=0.0; 2167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->green=0.0; 2168e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->blue=0.0; 2169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->black=0.0; 2170a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel->alpha=(double) OpaqueAlpha; 2171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->index=0.0; 2172f2a82ee6e25411cb280db708ff26ab55cece1945cristy pixel->count=0; 2173f2a82ee6e25411cb280db708ff26ab55cece1945cristy pixel->fuzz=0.0; 2174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image == (const Image *) NULL) 2175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2176e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->storage_class=image->storage_class; 2177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->colorspace=image->colorspace; 21788a46d827a124555f0c48fb2368ec1bba8e079ab6cristy pixel->alpha_trait=image->alpha_trait; 2179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->depth=image->depth; 2180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy pixel->fuzz=image->fuzz; 2181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 2182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/* 2184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2186e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 21889731df786aef53bf0482896bcdf9af7011880042cristy% G e t P i x e l I n t e n s i t y % 21899731df786aef53bf0482896bcdf9af7011880042cristy% % 21909731df786aef53bf0482896bcdf9af7011880042cristy% % 21919731df786aef53bf0482896bcdf9af7011880042cristy% % 21929731df786aef53bf0482896bcdf9af7011880042cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 21939731df786aef53bf0482896bcdf9af7011880042cristy% 21940c5c889633982c1b29bfaacf17092343544d6c8bcristy% GetPixelIntensity() returns a single sample intensity value from the red, 219570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy% green, and blue components of a pixel based on the selected method: 219670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy% 21972cf5d375fa7abe962164b39a35948fe76b4d239acristy% Rec601Luma 0.298839R' + 0.586811G' + 0.114350B' 21982cf5d375fa7abe962164b39a35948fe76b4d239acristy% Rec601Luminance 0.298839R + 0.586811G + 0.114350B 21991352acf3bec61a13875a2d020306ad6339686040cristy% Rec709Luma 0.212656R' + 0.715158G' + 0.072186B' 22001352acf3bec61a13875a2d020306ad6339686040cristy% Rec709Luminance 0.212656R + 0.715158G + 0.072186B 220109bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy% Brightness max(R', G', B') 220209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy% Lightness (min(R', G', B') + max(R', G', B')) / 2.0 220362cc94b542ffdb41cd62778530873f8babafb2b7cristy% 220409bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy% MS (R^2 + G^2 + B^2) / 3.0 220509bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy% RMS sqrt((R^2 + G^2 + B^2) / 3.0 220609bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy% Average (R + G + B') / 3.0 22079731df786aef53bf0482896bcdf9af7011880042cristy% 22089731df786aef53bf0482896bcdf9af7011880042cristy% The format of the GetPixelIntensity method is: 22099731df786aef53bf0482896bcdf9af7011880042cristy% 22102cf5d375fa7abe962164b39a35948fe76b4d239acristy% MagickRealType GetPixelIntensity(const Image *image, 22112cf5d375fa7abe962164b39a35948fe76b4d239acristy% const Quantum *pixel) 22129731df786aef53bf0482896bcdf9af7011880042cristy% 22139731df786aef53bf0482896bcdf9af7011880042cristy% A description of each parameter follows: 22149731df786aef53bf0482896bcdf9af7011880042cristy% 22159731df786aef53bf0482896bcdf9af7011880042cristy% o image: the image. 22169731df786aef53bf0482896bcdf9af7011880042cristy% 22179731df786aef53bf0482896bcdf9af7011880042cristy% o pixel: Specifies a pointer to a Quantum structure. 22189731df786aef53bf0482896bcdf9af7011880042cristy% 22199731df786aef53bf0482896bcdf9af7011880042cristy*/ 222070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy 222170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristystatic inline MagickRealType MagickMax(const MagickRealType x, 222270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy const MagickRealType y) 222370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy{ 222470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy if (x > y) 222570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy return(x); 222670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy return(y); 222770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy} 222870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy 222970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristystatic inline MagickRealType MagickMin(const MagickRealType x, 223070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy const MagickRealType y) 223170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy{ 223270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy if (x < y) 223370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy return(x); 223470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy return(y); 223570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy} 223670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy 22379731df786aef53bf0482896bcdf9af7011880042cristyMagickExport MagickRealType GetPixelIntensity(const Image *restrict image, 22389731df786aef53bf0482896bcdf9af7011880042cristy const Quantum *restrict pixel) 22399731df786aef53bf0482896bcdf9af7011880042cristy{ 22409731df786aef53bf0482896bcdf9af7011880042cristy MagickRealType 22419731df786aef53bf0482896bcdf9af7011880042cristy blue, 22429731df786aef53bf0482896bcdf9af7011880042cristy green, 224370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy red, 224470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy intensity; 22459731df786aef53bf0482896bcdf9af7011880042cristy 22469731df786aef53bf0482896bcdf9af7011880042cristy if (image->colorspace == GRAYColorspace) 2247592d6bbf607f36bbae8ca1391570534e3b72087ccristy return((MagickRealType) GetPixelGray(image,pixel)); 2248592d6bbf607f36bbae8ca1391570534e3b72087ccristy red=(MagickRealType) GetPixelRed(image,pixel); 2249592d6bbf607f36bbae8ca1391570534e3b72087ccristy green=(MagickRealType) GetPixelGreen(image,pixel); 2250592d6bbf607f36bbae8ca1391570534e3b72087ccristy blue=(MagickRealType) GetPixelBlue(image,pixel); 225170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy switch (image->intensity) 225270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy { 2253bf02d73b29c613944ea22e2acc8b830aa4700871cristy case AveragePixelIntensityMethod: 2254bf02d73b29c613944ea22e2acc8b830aa4700871cristy { 2255bf02d73b29c613944ea22e2acc8b830aa4700871cristy intensity=(red+green+blue)/3.0; 2256bf02d73b29c613944ea22e2acc8b830aa4700871cristy break; 2257bf02d73b29c613944ea22e2acc8b830aa4700871cristy } 2258bf02d73b29c613944ea22e2acc8b830aa4700871cristy case BrightnessPixelIntensityMethod: 2259bf02d73b29c613944ea22e2acc8b830aa4700871cristy { 2260bf02d73b29c613944ea22e2acc8b830aa4700871cristy intensity=MagickMax(MagickMax(red,green),blue); 2261bf02d73b29c613944ea22e2acc8b830aa4700871cristy break; 2262bf02d73b29c613944ea22e2acc8b830aa4700871cristy } 2263bf02d73b29c613944ea22e2acc8b830aa4700871cristy case LightnessPixelIntensityMethod: 2264bf02d73b29c613944ea22e2acc8b830aa4700871cristy { 226509bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy intensity=(MagickMin(MagickMin(red,green),blue)+ 2266ce326724341c443b3c813774b0cc3b4ce4b425cbcristy MagickMax(MagickMax(red,green),blue))/2.0; 2267bf02d73b29c613944ea22e2acc8b830aa4700871cristy break; 2268bf02d73b29c613944ea22e2acc8b830aa4700871cristy } 2269462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy case MSPixelIntensityMethod: 2270462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy { 2271462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy intensity=(MagickRealType) (((double) red*red+green*green+blue*blue)/ 2272462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy (3.0*QuantumRange)); 2273462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy break; 2274462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy } 227570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy case Rec601LumaPixelIntensityMethod: 227670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy { 227709bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy if (image->colorspace == RGBColorspace) 227809bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy { 227909bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy red=EncodePixelGamma(red); 228009bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy green=EncodePixelGamma(green); 228109bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy blue=EncodePixelGamma(blue); 228209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy } 22839e2436a78bdabef900e018dc77c0cc497bf6fbafcristy intensity=0.298839*red+0.586811*green+0.114350*blue; 22842cf5d375fa7abe962164b39a35948fe76b4d239acristy break; 22852cf5d375fa7abe962164b39a35948fe76b4d239acristy } 22862cf5d375fa7abe962164b39a35948fe76b4d239acristy case Rec601LuminancePixelIntensityMethod: 22872cf5d375fa7abe962164b39a35948fe76b4d239acristy { 228870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy if (image->colorspace == sRGBColorspace) 228970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy { 229070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy red=DecodePixelGamma(red); 229170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy green=DecodePixelGamma(green); 229270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy blue=DecodePixelGamma(blue); 229370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy } 22949e2436a78bdabef900e018dc77c0cc497bf6fbafcristy intensity=0.298839*red+0.586811*green+0.114350*blue; 229570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy break; 229670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy } 229770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy case Rec709LumaPixelIntensityMethod: 2298c94210c7c054e663026a776edfa1e2d6b79a00a5cristy default: 229970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy { 230009bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy if (image->colorspace == RGBColorspace) 230109bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy { 230209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy red=EncodePixelGamma(red); 230309bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy green=EncodePixelGamma(green); 230409bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy blue=EncodePixelGamma(blue); 230509bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy } 23061352acf3bec61a13875a2d020306ad6339686040cristy intensity=0.212656*red+0.715158*green+0.072186*blue; 23072cf5d375fa7abe962164b39a35948fe76b4d239acristy break; 23082cf5d375fa7abe962164b39a35948fe76b4d239acristy } 23092cf5d375fa7abe962164b39a35948fe76b4d239acristy case Rec709LuminancePixelIntensityMethod: 23102cf5d375fa7abe962164b39a35948fe76b4d239acristy { 231170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy if (image->colorspace == sRGBColorspace) 231270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy { 231370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy red=DecodePixelGamma(red); 231470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy green=DecodePixelGamma(green); 231570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy blue=DecodePixelGamma(blue); 231670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy } 23171352acf3bec61a13875a2d020306ad6339686040cristy intensity=0.212656*red+0.715158*green+0.072186*blue; 231870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy break; 231970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy } 232070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy case RMSPixelIntensityMethod: 232170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy { 2322462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy intensity=(MagickRealType) (sqrt((double) red*red+green*green+blue*blue)/ 2323462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy sqrt(3.0)); 232470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy break; 232570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy } 232670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy } 232770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy return(intensity); 23289731df786aef53bf0482896bcdf9af7011880042cristy} 23299731df786aef53bf0482896bcdf9af7011880042cristy 23309731df786aef53bf0482896bcdf9af7011880042cristy/* 23319731df786aef53bf0482896bcdf9af7011880042cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23329731df786aef53bf0482896bcdf9af7011880042cristy% % 23339731df786aef53bf0482896bcdf9af7011880042cristy% % 23349731df786aef53bf0482896bcdf9af7011880042cristy% % 2335e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% I m p o r t I m a g e P i x e l s % 2336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2337e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% % 2339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% ImportImagePixels() accepts pixel data and stores in the image at the 2342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% location you specify. The method returns MagickTrue on success otherwise 2343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% MagickFalse if an error is encountered. The pixel data can be either char, 2344b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy% Quantum, short int, unsigned int, unsigned long long, float, or double in 2345b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy% the order specified by map. 2346e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% Suppose your want to upload the first scanline of a 640x480 image from 2348e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% character data in red-green-blue order: 2349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels); 2351e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% The format of the ImportImagePixels method is: 2353e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2354cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% MagickBooleanType ImportImagePixels(Image *image,const ssize_t x, 2355cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% const ssize_t y,const size_t width,const size_t height, 2356cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% const char *map,const StorageType type,const void *pixels, 2357cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% ExceptionInfo *exception) 2358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% A description of each parameter follows: 2360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% o image: the image. 2362e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2363cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy% o x,y,width,height: These values define the perimeter 2364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% of a region of pixels you want to define. 2365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2366e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% o map: This string reflects the expected ordering of the pixel array. 2367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% It can be any combination or order of R = red, G = green, B = blue, 2368e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan, 2369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% Y = yellow, M = magenta, K = black, I = intensity (for grayscale), 2370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% P = pad. 2371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% o type: Define the data type of the pixels. Float and double types are 2373e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% normalized to [0..1] otherwise [0..QuantumRange]. Choose from these 23746c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy% types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *), 2375ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy% LongPixel (unsigned int *), LongLongPixel (unsigned long long *), 23766c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy% QuantumPixel (Quantum *), or ShortPixel (unsigned short *). 2377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% o pixels: This array of values contain the pixel components as defined by 2379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% map and type. You must preallocate this array where the expected 2380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% length varies depending on the values of width, height, map, and type. 2381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% o exception: return any errors or warnings in this structure. 2383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy% 2384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/ 2385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2386cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportCharPixel(Image *image,const RectangleInfo *roi, 238746f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,const void *pixels, 238846f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 2389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 2390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const unsigned char 2391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 2392e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2393e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register Quantum 23943fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 2395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 2397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 2398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 239914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 240014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 240114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 2402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 2403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 2404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p=(const unsigned char *) pixels; 2406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 2407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2408cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2410cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2412e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2413cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2415e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 2426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2427cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2428e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2429cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2430e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2431e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2432cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2433e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleCharToQuantum(*p++),q); 2438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2445e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRO") == 0) 2446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2447cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2448e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2449cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2452cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2453e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleCharToQuantum(*p++),q); 2458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 2466e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2467cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2469cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2472cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 2486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2487cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2489cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2492cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,ScaleCharToQuantum(*p++),q); 2495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 2503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2504cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2506cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2509cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 2522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2523cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2525cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2527e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2528cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleCharToQuantum(*p++),q); 2534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBO") == 0) 2542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2543cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2545cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2548cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleCharToQuantum(*p++),q); 2554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 2562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2563cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2565cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2568cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p++),q); 2571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p++),q); 2572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p++),q); 2573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 258114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 2582cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2584cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2587cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 2590e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 2591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 259214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 2593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 2595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 2597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 2598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleCharToQuantum(*p),q); 2600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 2603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 2604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleCharToQuantum(*p),q); 2606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 2609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 2610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleCharToQuantum(*p),q); 2612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 2615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleCharToQuantum(*p),q); 2617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2619e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 2620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleCharToQuantum(*p),q); 2622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 2625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlack(image,ScaleCharToQuantum(*p),q); 2627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 2630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,ScaleCharToQuantum(*p),q); 2632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 2635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 2645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2646cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportDoublePixel(Image *image,const RectangleInfo *roi, 264746f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,const void *pixels, 264846f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 2649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 2650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const double 2651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 2652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register Quantum 26543fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 2655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 2657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 2658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 265914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 266014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 266114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 2662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 2663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 2664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p=(const double *) pixels; 2666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 2667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2668cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2670cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2673cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 26758cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 26778cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 26798cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 2689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2690cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2692cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2695cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 26978cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 26998cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27018cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27038cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 2704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 2713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2714cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2716cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2719cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 27218cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27238cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27258cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 2736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2737cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2739cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2742cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 27448cd03c32d039162196906ff36501f3543019b56acristy SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q); 2745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2749e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 2754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2755cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2757cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2760cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 27628cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27648cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27668cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 2776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2777cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2779cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2782cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 27848cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27868cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27888cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 27908cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 2791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2793e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 2800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2801cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2803cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2806cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28088cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 28108cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 28128cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 282114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 2822cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2824cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2827cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 2830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 2831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 283214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 2833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 2835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 2837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 2838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28398cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 2843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 2844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28458cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 2849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 2850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28518cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 2855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28568cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 2857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 2860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28618cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 2862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 2865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28668cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q); 2867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 2870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 28718cd03c32d039162196906ff36501f3543019b56acristy SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q); 2872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 2875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 28843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 2885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2886cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportFloatPixel(Image *image,const RectangleInfo *roi, 288746f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,const void *pixels, 288846f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 28893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 2890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const float 2891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 2892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register Quantum 28943fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 2895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 2897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 2898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 289914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 290014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 290114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 2902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 2903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 2904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 2905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p=(const float *) pixels; 2906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 2907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2908cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2910cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2913cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 29158cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 29178cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 29198cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 2929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2930cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2932cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2935cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2936e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 29378cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 29398cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 29418cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 29438cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 2944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2945e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 2953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2954cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2956cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2959cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 29618cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 2962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 29638cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 2964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 29658cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 2966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 2976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2977cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2979cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2982cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 2983e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 29848cd03c32d039162196906ff36501f3543019b56acristy SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q); 2985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 2986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 2987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 2989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 2990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 2992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 2993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 2994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2995cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 2996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 2997cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 2998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 2999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3000cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 30028cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 3003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 30048cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 3005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 30068cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 3007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 3016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3017cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3019cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3022cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 30248cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 3025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 30268cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 3027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 30288cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 3029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 30308cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 3031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 3040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3041cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3043cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3046cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 30488cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 3049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 30508cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 3051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 30528cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 3053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 306114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 3062cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3064cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3067cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 3071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 307214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 3073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 3075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 3077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 3078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 30798cd03c32d039162196906ff36501f3543019b56acristy SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q); 3080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 3083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 3084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 30858cd03c32d039162196906ff36501f3543019b56acristy SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q); 3086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 3089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 3090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 30918cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q); 3092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 3095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 30968cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 3097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 3100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 31018cd03c32d039162196906ff36501f3543019b56acristy SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q); 3102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3103e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 3105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 31068cd03c32d039162196906ff36501f3543019b56acristy SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q); 3107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 3110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 31118cd03c32d039162196906ff36501f3543019b56acristy SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q); 3112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3113e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 3115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 3125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3126cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongPixel(Image *image,const RectangleInfo *roi, 312746f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,const void *pixels, 312846f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 31293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 3130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const unsigned int 3131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 31323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31334c08aed51c5899665ade97263692328eea4af106cristy register Quantum 31343fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 31353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3136bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 31373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 313914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 314014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 314114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 31429d314ff2c17a77996c05413c2013880387e50f0ecristy ssize_t 31439d314ff2c17a77996c05413c2013880387e50f0ecristy y; 31449d314ff2c17a77996c05413c2013880387e50f0ecristy 3145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p=(const unsigned int *) pixels; 3146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 31473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3148cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 31493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3150cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3153cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleLongToQuantum(*p++),q); 3156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleLongToQuantum(*p++),q); 3157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleLongToQuantum(*p++),q); 3158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3160e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 31623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3165e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 3166e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3167cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 31683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3169cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3172cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3173e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleLongToQuantum(*p++),q); 3175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleLongToQuantum(*p++),q); 3176e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleLongToQuantum(*p++),q); 3177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleLongToQuantum(*p++),q); 3178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 31823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 3186e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3187cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 31883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3189cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3191e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3192cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3193e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3194e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleLongToQuantum(*p++),q); 3195e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleLongToQuantum(*p++),q); 3196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleLongToQuantum(*p++),q); 3197e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3199e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 32023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3203e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3204e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 3206e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3207cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 32083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3209cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3211e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3212cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3214e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,ScaleLongToQuantum(*p++),q); 3215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3217e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 32193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3222e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 3223e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3224cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 32253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3226cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3228e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3229cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3230e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleLongToQuantum(*p++),q); 3232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleLongToQuantum(*p++),q); 3233e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleLongToQuantum(*p++),q); 3234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3236e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 32383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3241e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 3242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3243cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 32443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3245cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3246e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3248cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3249e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3250e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleLongToQuantum(*p++),q); 3251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleLongToQuantum(*p++),q); 3252e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleLongToQuantum(*p++),q); 3253e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleLongToQuantum(*p++),q); 3254e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3256e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3257e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 32583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3259e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3260e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3261e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 3262e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3263cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 32643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3265cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3266e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3267e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3268cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3269e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleLongToQuantum(*p++),q); 3271e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleLongToQuantum(*p++),q); 3272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleLongToQuantum(*p++),q); 3273e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3276e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 32783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 328114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 3282cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3284cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3286e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3287cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3289e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3290e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 3291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 329214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 32933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 3295e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 3297e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 3298e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleLongToQuantum(*p),q); 3300e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3301e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 3303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 3304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3305e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleLongToQuantum(*p),q); 3306e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 3309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 3310e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3311e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleLongToQuantum(*p),q); 3312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 3315e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3316e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleLongToQuantum(*p),q); 3317e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3318e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 3320e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleLongToQuantum(*p),q); 3322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 3325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3326e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlack(image,ScaleLongToQuantum(*p),q); 3327e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 3330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,ScaleLongToQuantum(*p),q); 3332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3333e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 3335e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3337e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3344e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 3345e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3346cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongLongPixel(Image *image,const RectangleInfo *roi, 334746f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,const void *pixels, 334846f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 3349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 3350b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy register const MagickSizeType 3351e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 3352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3353e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register Quantum 33543fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 3355e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3356e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3357e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 3358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 335914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 336014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 336114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 3362e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 3363e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 3364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3365b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy p=(const MagickSizeType *) pixels; 3366e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 3367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3368cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3370cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3373cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3374e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3375b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q); 3376b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q); 3377b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelRed(image,ScaleLongLongToQuantum(*p++),q); 3378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 3386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3387cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3389cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3392cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3393e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3394b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q); 3395b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q); 3396b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelRed(image,ScaleLongLongToQuantum(*p++),q); 3397b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q); 3398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3399e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 3406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3407cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3409cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3410e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3412cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3413e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3414b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q); 3415b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q); 3416b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelRed(image,ScaleLongLongToQuantum(*p++),q); 3417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 34223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 3426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3427cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 34283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3429cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3430e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3431e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3432cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3433e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3434b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGray(image,ScaleLongLongToQuantum(*p++),q); 3435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 34393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 3443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3444cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 34453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3446cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3448e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3449cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3451b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelRed(image,ScaleLongLongToQuantum(*p++),q); 3452b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q); 3453b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q); 3454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 34583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 3462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3463cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 34643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3465cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3466e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3468cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3469e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3470b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelRed(image,ScaleLongLongToQuantum(*p++),q); 3471b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q); 3472b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q); 3473b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q); 3474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 34783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 3482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3483cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3485cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3488cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3490b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelRed(image,ScaleLongLongToQuantum(*p++),q); 3491b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q); 3492b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q); 3493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 34983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 35003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 350114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 3502cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 35033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3504cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3507cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 35083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 35113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 351214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 3513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 35153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 3517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 35183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3519b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelRed(image,ScaleLongLongToQuantum(*p),q); 3520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 3523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3525b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGreen(image,ScaleLongLongToQuantum(*p),q); 3526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 3529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 35303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3531b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlue(image,ScaleLongLongToQuantum(*p),q); 3532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 35353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3536b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q); 3537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 35403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3541b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q); 3542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 35453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3546b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelBlack(image,ScaleLongLongToQuantum(*p),q); 3547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 35503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3551b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy SetPixelGray(image,ScaleLongLongToQuantum(*p),q); 3552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 3555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 35563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 3565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3566cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportQuantumPixel(Image *image,const RectangleInfo *roi, 356746f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,const void *pixels, 356846f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 3569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 3570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const Quantum 3571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 3572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register Quantum 35743fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 3575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 3578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 357914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 358014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 358114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 3582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 3583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 3584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p=(const Quantum *) pixels; 3586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 3587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3588cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3590cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 35923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3593cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 35943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,*p++,q); 3596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,*p++,q); 3597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,*p++,q); 3598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 3606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3607cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3609cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 36113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3612cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,*p++,q); 3615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,*p++,q); 3616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,*p++,q); 3617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,*p++,q); 3618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 36193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 3626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3627cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 36283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3629cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 36304c08aed51c5899665ade97263692328eea4af106cristy if (q == (Quantum *) NULL) 36313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3632cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 36333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,*p++,q); 3635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,*p++,q); 3636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,*p++,q); 3637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3638ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 36393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 36413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 36423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 36443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 36463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3647cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3649cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 36513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3652cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,*p++,q); 3655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 36563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 3663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3664cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 36653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3666cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 36674c08aed51c5899665ade97263692328eea4af106cristy if (q == (Quantum *) NULL) 36683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3669cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 36703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,*p++,q); 3672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,*p++,q); 3673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,*p++,q); 3674ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 36753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 36773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 36783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 36803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3683cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3685cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 36873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3688cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,*p++,q); 3691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,*p++,q); 3692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,*p++,q); 3693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,*p++,q); 3694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 36953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 3702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3703cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3705cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 37064c08aed51c5899665ade97263692328eea4af106cristy if (q == (Quantum *) NULL) 37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3708cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,*p++,q); 3711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,*p++,q); 3712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,*p++,q); 3713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3714ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 372114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 3722cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3724cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3727cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 37313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 373214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 3733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 37353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 3737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 37383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,*p,q); 3740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 3743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 37443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,*p,q); 3746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 3749e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,*p,q); 3752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,*p,q); 3757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,*p,q); 3762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlack(image,*p,q); 3767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 37703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,*p,q); 3772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 3775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 37763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 3780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 3785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3786cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportShortPixel(Image *image,const RectangleInfo *roi, 378746f4be29828ab7588745336d46ab11611c847933cristy const char *restrict map,const QuantumType *quantum_map,const void *pixels, 378846f4be29828ab7588745336d46ab11611c847933cristy ExceptionInfo *exception) 3789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 3790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register const unsigned short 3791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *restrict p; 3792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3793e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register Quantum 37943fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy *restrict q; 3795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy x; 3798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 379914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 380014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 380114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 3802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ssize_t 3803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy y; 3804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 3805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p=(const unsigned short *) pixels; 3806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGR") == 0) 3807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3808cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 38093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3810cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 38114c08aed51c5899665ade97263692328eea4af106cristy if (q == (Quantum *) NULL) 38123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3813cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 38143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleShortToQuantum(*p++),q); 3816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleShortToQuantum(*p++),q); 3817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleShortToQuantum(*p++),q); 3818ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 38193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 38213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 38223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 38243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRA") == 0) 38263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3827cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3829cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 38313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3832cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 38333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleShortToQuantum(*p++),q); 3835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleShortToQuantum(*p++),q); 3836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleShortToQuantum(*p++),q); 3837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleShortToQuantum(*p++),q); 3838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 38393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 38413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"BGRP") == 0) 3846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3847cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 38483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3849cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 38504c08aed51c5899665ade97263692328eea4af106cristy if (q == (Quantum *) NULL) 38513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3852cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 38533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleShortToQuantum(*p++),q); 3855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleShortToQuantum(*p++),q); 3856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleShortToQuantum(*p++),q); 3857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3858ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 38593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 38613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 38623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 38643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"I") == 0) 38663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3867cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3869cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 38713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3872cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 38733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,ScaleShortToQuantum(*p++),q); 3875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 38783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGB") == 0) 3883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3884cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3886cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 38883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3889cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 38903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleShortToQuantum(*p++),q); 3892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleShortToQuantum(*p++),q); 3893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleShortToQuantum(*p++),q); 3894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 38953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 38973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3900e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBA") == 0) 3902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3903cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3905cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 39073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3908cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 3909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleShortToQuantum(*p++),q); 3911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleShortToQuantum(*p++),q); 3912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleShortToQuantum(*p++),q); 3913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleShortToQuantum(*p++),q); 3914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 39153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 3917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 3920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (LocaleCompare(map,"RGBP") == 0) 3922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3923cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3925cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 39264c08aed51c5899665ade97263692328eea4af106cristy if (q == (Quantum *) NULL) 39273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3928cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleShortToQuantum(*p++),q); 3931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleShortToQuantum(*p++),q); 3932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleShortToQuantum(*p++),q); 3933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3934ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 39353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 39363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return; 39403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 394114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 3942cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (y=0; y < (ssize_t) roi->height; y++) 3943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3944cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception); 3945e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (q == (Quantum *) NULL) 3946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 3947cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy for (x=0; x < (ssize_t) roi->width; x++) 39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 3950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 395214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 3953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 3954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (quantum_map[i]) 39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case RedQuantum: 3957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CyanQuantum: 39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelRed(image,ScaleShortToQuantum(*p),q); 3960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case GreenQuantum: 3963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case MagentaQuantum: 39643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGreen(image,ScaleShortToQuantum(*p),q); 3966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlueQuantum: 3969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case YellowQuantum: 39703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlue(image,ScaleShortToQuantum(*p),q); 3972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case AlphaQuantum: 39753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleShortToQuantum(*p),q); 3977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case OpacityQuantum: 39803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelAlpha(image,ScaleShortToQuantum(*p),q); 3982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case BlackQuantum: 39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelBlack(image,ScaleShortToQuantum(*p),q); 3987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case IndexQuantum: 39903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy SetPixelGray(image,ScaleShortToQuantum(*p),q); 3992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 3995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy p++; 3998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 3999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy q+=GetPixelChannels(image); 4000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 4002e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy} 4005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 4006cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristyMagickExport MagickBooleanType ImportImagePixels(Image *image,const ssize_t x, 4007cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy const ssize_t y,const size_t width,const size_t height,const char *map, 4008cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy const StorageType type,const void *pixels,ExceptionInfo *exception) 4009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{ 4010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy QuantumType 4011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy *quantum_map; 4012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 4013cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy RectangleInfo 4014cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi; 4015cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy 4016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy register ssize_t 4017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy i; 4018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy 401914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy size_t 402014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length; 402114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy 4022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy /* 4023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy Allocate image structure. 4024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy */ 4025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy assert(image != (Image *) NULL); 4026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy assert(image->signature == MagickSignature); 4027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (image->debug != MagickFalse) 4028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 402914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy length=strlen(map); 403014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map)); 4031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (quantum_map == (QuantumType *) NULL) 4032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", 4033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy image->filename); 403414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy for (i=0; i < (ssize_t) length; i++) 4035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (map[i]) 4037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'a': 4039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'A': 40403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=AlphaQuantum; 40428a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=BlendPixelTrait; 4043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'B': 4046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'b': 4047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4048e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=BlueQuantum; 4049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'C': 4052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'c': 4053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=CyanQuantum; 4055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) SetImageColorspace(image,CMYKColorspace,exception); 4056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'g': 4059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'G': 4060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=GreenQuantum; 4062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'K': 4065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'k': 4066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=BlackQuantum; 4068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) SetImageColorspace(image,CMYKColorspace,exception); 4069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'I': 4072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'i': 4073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=IndexQuantum; 4075b7b3da6aa145fe62d107c4b4c1a25bcc24bd1006cristy (void) SetImageColorspace(image,GRAYColorspace,exception); 4076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'm': 4079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'M': 4080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=MagentaQuantum; 4082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) SetImageColorspace(image,CMYKColorspace,exception); 4083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4085e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'O': 4086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'o': 4087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=OpacityQuantum; 40898a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=BlendPixelTrait; 4090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'P': 4093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'p': 4094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=UndefinedQuantum; 4096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'R': 4099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'r': 4100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=RedQuantum; 4102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'Y': 4105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case 'y': 4106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map[i]=YellowQuantum; 4108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) SetImageColorspace(image,CMYKColorspace,exception); 4109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4111e5370944fabb7afa477ab1325d400731b1e5d5e8cristy default: 4112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4113e5370944fabb7afa477ab1325d400731b1e5d5e8cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 4114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy (void) ThrowMagickException(exception,GetMagickModule(),OptionError, 4115efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy "UnrecognizedPixelMap","`%s'",map); 4116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 4117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) 4121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy return(MagickFalse); 4122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy /* 4123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy Transfer the pixels from the pixel data to the image. 4124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy */ 4125cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.width=width; 4126cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.height=height; 4127cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.x=x; 4128cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy roi.y=y; 4129e5370944fabb7afa477ab1325d400731b1e5d5e8cristy switch (type) 4130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case CharPixel: 4132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4133cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ImportCharPixel(image,&roi,map,quantum_map,pixels,exception); 4134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case DoublePixel: 4137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4138cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ImportDoublePixel(image,&roi,map,quantum_map,pixels,exception); 4139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case FloatPixel: 4142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4143cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ImportFloatPixel(image,&roi,map,quantum_map,pixels,exception); 4144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 41466c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy case LongPixel: 4147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4148cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ImportLongPixel(image,&roi,map,quantum_map,pixels,exception); 4149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 41516c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy case LongLongPixel: 4152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4153cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ImportLongLongPixel(image,&roi,map,quantum_map,pixels,exception); 4154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case QuantumPixel: 4157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4158cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ImportQuantumPixel(image,&roi,map,quantum_map,pixels,exception); 4159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy break; 4160e5370944fabb7afa477ab1325d400731b1e5d5e8cristy } 4161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy case ShortPixel: 4162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy { 4163cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy ImportShortPixel(image,&roi,map,quantum_map,pixels,exception); 41643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 41653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 41673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 4169c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy (void) ThrowMagickException(exception,GetMagickModule(),OptionError, 417094db6c1547e1c4ef2ca7ea209d17749d2b5fd850dirk "UnrecognizedStorageType","`%d'",type); 41713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 41723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map); 41753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 41763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 4177d76c51ed30cf4084f4434ba08925d16001d1e340cristy 4178d76c51ed30cf4084f4434ba08925d16001d1e340cristy/* 4179d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4180a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% % 4181a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% % 4182a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% % 4183bd5a96cd2b69f218f85a7adc306296a736f91a56cristy+ I n i t i a l i z e P i x e l C h a n n e l M a p % 4184bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% % 4185bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% % 4186bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% % 4187bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4188bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% 4189bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% InitializePixelChannelMap() defines the standard pixel component map. 4190bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% 4191bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% The format of the InitializePixelChannelMap() method is: 4192bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% 4193bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% void InitializePixelChannelMap(Image *image) 4194bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% 4195bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% A description of each parameter follows: 4196bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% 4197bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% o image: the image. 4198bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% 4199bd5a96cd2b69f218f85a7adc306296a736f91a56cristy*/ 4200021216a8b35ea91ef1f12713ed41da843bbaee7bcristy 4201021216a8b35ea91ef1f12713ed41da843bbaee7bcristystatic void LogPixelChannels(const Image *image) 4202021216a8b35ea91ef1f12713ed41da843bbaee7bcristy{ 4203021216a8b35ea91ef1f12713ed41da843bbaee7bcristy register ssize_t 4204021216a8b35ea91ef1f12713ed41da843bbaee7bcristy i; 4205021216a8b35ea91ef1f12713ed41da843bbaee7bcristy 4206021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%.20g]", 4207021216a8b35ea91ef1f12713ed41da843bbaee7bcristy image->filename,(double) image->number_channels); 4208021216a8b35ea91ef1f12713ed41da843bbaee7bcristy for (i=0; i < (ssize_t) image->number_channels; i++) 4209021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4210021216a8b35ea91ef1f12713ed41da843bbaee7bcristy char 4211021216a8b35ea91ef1f12713ed41da843bbaee7bcristy traits[MaxTextExtent]; 4212021216a8b35ea91ef1f12713ed41da843bbaee7bcristy 4213021216a8b35ea91ef1f12713ed41da843bbaee7bcristy const char 4214021216a8b35ea91ef1f12713ed41da843bbaee7bcristy *name; 4215021216a8b35ea91ef1f12713ed41da843bbaee7bcristy 4216021216a8b35ea91ef1f12713ed41da843bbaee7bcristy PixelChannel 4217021216a8b35ea91ef1f12713ed41da843bbaee7bcristy channel; 4218021216a8b35ea91ef1f12713ed41da843bbaee7bcristy 4219021216a8b35ea91ef1f12713ed41da843bbaee7bcristy switch (GetPixelChannelChannel(image,i)) 4220021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4221021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case RedPixelChannel: 4222021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4223021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="red"; 4224021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if (image->colorspace == CMYKColorspace) 4225021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="cyan"; 4226021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if (image->colorspace == GRAYColorspace) 4227021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="gray"; 4228021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4229021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4230021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case GreenPixelChannel: 4231021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4232021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="green"; 4233021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if (image->colorspace == CMYKColorspace) 4234021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="magenta"; 4235021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4236021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4237021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case BluePixelChannel: 4238021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4239021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="blue"; 4240021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if (image->colorspace == CMYKColorspace) 4241021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="yellow"; 4242021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4243021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4244021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case BlackPixelChannel: 4245021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4246021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="black"; 4247021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if (image->storage_class == PseudoClass) 4248021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="index"; 4249021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4250021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4251021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case IndexPixelChannel: 4252021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4253021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="index"; 4254021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4255021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4256021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case AlphaPixelChannel: 4257021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4258021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="alpha"; 4259021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4260021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4261021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case ReadMaskPixelChannel: 4262021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 42630481714f03ee904233a3aa1a5ed8c7690c9d361dcristy name="read-mask"; 4264021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4265021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4266021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case WriteMaskPixelChannel: 4267021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 42680481714f03ee904233a3aa1a5ed8c7690c9d361dcristy name="write-mask"; 4269021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4270021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4271021216a8b35ea91ef1f12713ed41da843bbaee7bcristy case MetaPixelChannel: 4272021216a8b35ea91ef1f12713ed41da843bbaee7bcristy { 4273021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="meta"; 4274021216a8b35ea91ef1f12713ed41da843bbaee7bcristy break; 4275021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4276021216a8b35ea91ef1f12713ed41da843bbaee7bcristy default: 4277021216a8b35ea91ef1f12713ed41da843bbaee7bcristy name="undefined"; 4278021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4279021216a8b35ea91ef1f12713ed41da843bbaee7bcristy channel=GetPixelChannelChannel(image,i); 4280021216a8b35ea91ef1f12713ed41da843bbaee7bcristy *traits='\0'; 4281021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if ((GetPixelChannelTraits(image,channel) & UpdatePixelTrait) != 0) 4282021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (void) ConcatenateMagickString(traits,"update,",MaxTextExtent); 4283021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if ((GetPixelChannelTraits(image,channel) & BlendPixelTrait) != 0) 4284021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (void) ConcatenateMagickString(traits,"blend,",MaxTextExtent); 4285021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if ((GetPixelChannelTraits(image,channel) & CopyPixelTrait) != 0) 4286021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (void) ConcatenateMagickString(traits,"copy,",MaxTextExtent); 4287021216a8b35ea91ef1f12713ed41da843bbaee7bcristy if (*traits == '\0') 4288021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (void) ConcatenateMagickString(traits,"undefined,",MaxTextExtent); 4289021216a8b35ea91ef1f12713ed41da843bbaee7bcristy traits[strlen(traits)-1]='\0'; 4290021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (void) LogMagickEvent(PixelEvent,GetMagickModule()," %.20g: %s (%s)", 4291021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (double) i,name,traits); 4292021216a8b35ea91ef1f12713ed41da843bbaee7bcristy } 4293021216a8b35ea91ef1f12713ed41da843bbaee7bcristy} 4294021216a8b35ea91ef1f12713ed41da843bbaee7bcristy 4295e2a912b6c9086c98ec838baa0824cd8deca55538cristyMagickExport void InitializePixelChannelMap(Image *image) 429677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy{ 4297e2a912b6c9086c98ec838baa0824cd8deca55538cristy PixelTrait 4298e2a912b6c9086c98ec838baa0824cd8deca55538cristy trait; 4299e2a912b6c9086c98ec838baa0824cd8deca55538cristy 430077c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy register ssize_t 430177c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy i; 430277c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy 4303d26338ffb761a86f047d7bbb9a596800f53c8649cristy ssize_t 430477c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy n; 430577c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy 430677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy assert(image != (Image *) NULL); 430777c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy assert(image->signature == MagickSignature); 4308e2a912b6c9086c98ec838baa0824cd8deca55538cristy (void) ResetMagickMemory(image->channel_map,0,MaxPixelChannels* 4309e2a912b6c9086c98ec838baa0824cd8deca55538cristy sizeof(*image->channel_map)); 4310e2a912b6c9086c98ec838baa0824cd8deca55538cristy trait=UpdatePixelTrait; 431117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 431261f18adcc41fdd05d57e50544cdb9d321bb18953cristy trait=(PixelTrait) (trait | BlendPixelTrait); 431377c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy n=0; 4314c06c58036e12a41593f1c7a984f1fdb4e9cc434bcristy if (image->colorspace == GRAYColorspace) 431577c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy { 4316cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,BluePixelChannel,trait,n); 4317cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,GreenPixelChannel,trait,n); 4318cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,RedPixelChannel,trait,n++); 43193c3162882db2814a5b709072cd03b8d18c80d6afcristy } 43203c3162882db2814a5b709072cd03b8d18c80d6afcristy else 43213c3162882db2814a5b709072cd03b8d18c80d6afcristy { 4322cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,RedPixelChannel,trait,n++); 4323cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,GreenPixelChannel,trait,n++); 4324cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,BluePixelChannel,trait,n++); 432577c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy } 432677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy if (image->colorspace == CMYKColorspace) 4327cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,BlackPixelChannel,trait,n++); 432817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 4329cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,AlphaPixelChannel,CopyPixelTrait,n++); 4330bd5a96cd2b69f218f85a7adc306296a736f91a56cristy if (image->storage_class == PseudoClass) 4331cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,IndexPixelChannel,CopyPixelTrait,n++); 4332883fde11debec15cedb05dc5d7228d8588066bc0cristy if (image->read_mask != MagickFalse) 4333883fde11debec15cedb05dc5d7228d8588066bc0cristy SetPixelChannelAttributes(image,ReadMaskPixelChannel,CopyPixelTrait,n++); 4334883fde11debec15cedb05dc5d7228d8588066bc0cristy if (image->write_mask != MagickFalse) 4335883fde11debec15cedb05dc5d7228d8588066bc0cristy SetPixelChannelAttributes(image,WriteMaskPixelChannel,CopyPixelTrait,n++); 4336e2a912b6c9086c98ec838baa0824cd8deca55538cristy assert((n+image->number_meta_channels) < MaxPixelChannels); 4337e2a912b6c9086c98ec838baa0824cd8deca55538cristy for (i=0; i < (ssize_t) image->number_meta_channels; i++) 4338cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy SetPixelChannelAttributes(image,(PixelChannel) (MetaPixelChannel+i), 4339cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy CopyPixelTrait,n++); 4340d26338ffb761a86f047d7bbb9a596800f53c8649cristy image->number_channels=(size_t) n; 43416dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy if (image->debug != MagickFalse) 43426dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy LogPixelChannels(image); 434317ada024a8d39285affcac96ff344f3142c41aadcristy SetImageChannelMask(image,image->channel_mask); 4344bd5a96cd2b69f218f85a7adc306296a736f91a56cristy} 4345bd5a96cd2b69f218f85a7adc306296a736f91a56cristy 4346bd5a96cd2b69f218f85a7adc306296a736f91a56cristy/* 4347bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4348bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% % 4349bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% % 4350bd5a96cd2b69f218f85a7adc306296a736f91a56cristy% % 4351a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% I n t e r p o l a t e P i x e l C h a n n e l % 4352a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% % 4353a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% % 4354a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% % 4355a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4356a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4357884f600898ca6935a7981b4d56bf3d2c4ec17011cristy% InterpolatePixelChannel() applies a pixel interpolation method between a 4358884f600898ca6935a7981b4d56bf3d2c4ec17011cristy% floating point coordinate and the pixels surrounding that coordinate. No 4359884f600898ca6935a7981b4d56bf3d2c4ec17011cristy% pixel area resampling, or scaling of the result is performed. 4360a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4361cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% Interpolation is restricted to just the specified channel. 4362cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% 4363a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% The format of the InterpolatePixelChannel method is: 4364a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4365a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% MagickBooleanType InterpolatePixelChannel(const Image *image, 4366444eda6285b2191e662c3d375c86770da70a83b0cristy% const CacheView *image_view,const PixelChannel channel, 43675c4e2586d27d4299a742d170d41105de1689aa46cristy% const PixelInterpolateMethod method,const double x,const double y, 4368a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% double *pixel,ExceptionInfo *exception) 4369a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4370a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% A description of each parameter follows: 4371a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4372a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% o image: the image. 4373a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4374a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% o image_view: the image view. 4375a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4376a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% o channel: the pixel channel to interpolate. 4377a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4378a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% o method: the pixel color interpolation method. 4379a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4380a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% o x,y: A double representing the current (x,y) position of the pixel. 4381a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4382a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% o pixel: return the interpolated pixel here. 4383a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4384a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% o exception: return any errors or warnings in this structure. 4385a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy% 4386a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy*/ 438794ea1636709395774d7118ef56162d211904cfd2cristy 4388b0a657e13c4aefba39c51292005427b47277869dcristystatic inline void CatromWeights(const double x,double (*weights)[4]) 4389884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{ 4390a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 4391884f600898ca6935a7981b4d56bf3d2c4ec17011cristy alpha, 4392d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas beta, 4393884f600898ca6935a7981b4d56bf3d2c4ec17011cristy gamma; 4394884f600898ca6935a7981b4d56bf3d2c4ec17011cristy 43955a5e4d97bc9afa4660902954d2eed4f23582dfeccristy /* 43965a5e4d97bc9afa4660902954d2eed4f23582dfeccristy Nicolas Robidoux' 10 flops (4* + 5- + 1+) refactoring of the computation 43975a5e4d97bc9afa4660902954d2eed4f23582dfeccristy of the standard four 1D Catmull-Rom weights. The sampling location is 43985a5e4d97bc9afa4660902954d2eed4f23582dfeccristy assumed between the second and third input pixel locations, and x is the 43995a5e4d97bc9afa4660902954d2eed4f23582dfeccristy position relative to the second input pixel location. Formulas originally 44005a5e4d97bc9afa4660902954d2eed4f23582dfeccristy derived for the VIPS (Virtual Image Processing System) library. 44015a5e4d97bc9afa4660902954d2eed4f23582dfeccristy */ 4402a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy alpha=(double) 1.0-x; 4403a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy beta=(double) (-0.5)*x*alpha; 4404d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas (*weights)[0]=alpha*beta; 4405d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas (*weights)[3]=x*beta; 4406d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas /* 44075a5e4d97bc9afa4660902954d2eed4f23582dfeccristy The following computation of the inner weights from the outer ones work 44085a5e4d97bc9afa4660902954d2eed4f23582dfeccristy for all Keys cubics. 4409d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas */ 4410d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas gamma=(*weights)[3]-(*weights)[0]; 4411d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas (*weights)[1]=alpha-(*weights)[0]+gamma; 4412d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas (*weights)[2]=x-(*weights)[3]-gamma; 4413d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas} 4414d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas 4415b0a657e13c4aefba39c51292005427b47277869dcristystatic inline void SplineWeights(const double x,double (*weights)[4]) 4416d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas{ 44175a5e4d97bc9afa4660902954d2eed4f23582dfeccristy double 44185a5e4d97bc9afa4660902954d2eed4f23582dfeccristy alpha, 44195a5e4d97bc9afa4660902954d2eed4f23582dfeccristy beta; 44205a5e4d97bc9afa4660902954d2eed4f23582dfeccristy 4421d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas /* 442258ee5018960b42b80b54398eacabe9ae5da89149cristy Nicolas Robidoux' 12 flops (6* + 5- + 1+) refactoring of the computation 442358ee5018960b42b80b54398eacabe9ae5da89149cristy of the standard four 1D cubic B-spline smoothing weights. The sampling 442458ee5018960b42b80b54398eacabe9ae5da89149cristy location is assumed between the second and third input pixel locations, 442558ee5018960b42b80b54398eacabe9ae5da89149cristy and x is the position relative to the second input pixel location. 4426d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas */ 4427a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy alpha=(double) 1.0-x; 4428a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy (*weights)[3]=(double) (1.0/6.0)*x*x*x; 4429a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy (*weights)[0]=(double) (1.0/6.0)*alpha*alpha*alpha; 4430d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas beta=(*weights)[3]-(*weights)[0]; 4431d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas (*weights)[1]=alpha-(*weights)[0]+beta; 4432d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas (*weights)[2]=x-(*weights)[3]-beta; 4433884f600898ca6935a7981b4d56bf3d2c4ec17011cristy} 4434884f600898ca6935a7981b4d56bf3d2c4ec17011cristy 443594ea1636709395774d7118ef56162d211904cfd2cristystatic inline double MeshInterpolate(const PointInfo *delta,const double p, 443694ea1636709395774d7118ef56162d211904cfd2cristy const double x,const double y) 443794ea1636709395774d7118ef56162d211904cfd2cristy{ 443894ea1636709395774d7118ef56162d211904cfd2cristy return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p); 443994ea1636709395774d7118ef56162d211904cfd2cristy} 444094ea1636709395774d7118ef56162d211904cfd2cristy 4441cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony/* 4442a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristystatic inline ssize_t NearestNeighbor(const double x) 4443884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{ 4444884f600898ca6935a7981b4d56bf3d2c4ec17011cristy if (x >= 0.0) 4445884f600898ca6935a7981b4d56bf3d2c4ec17011cristy return((ssize_t) (x+0.5)); 4446884f600898ca6935a7981b4d56bf3d2c4ec17011cristy return((ssize_t) (x-0.5)); 4447884f600898ca6935a7981b4d56bf3d2c4ec17011cristy} 4448cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony*/ 4449884f600898ca6935a7981b4d56bf3d2c4ec17011cristy 4450a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristyMagickExport MagickBooleanType InterpolatePixelChannel(const Image *image, 4451a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy const CacheView *image_view,const PixelChannel channel, 44525c4e2586d27d4299a742d170d41105de1689aa46cristy const PixelInterpolateMethod method,const double x,const double y, 4453a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy double *pixel,ExceptionInfo *exception) 4454a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy{ 4455a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 445694ea1636709395774d7118ef56162d211904cfd2cristy alpha[16], 4457884f600898ca6935a7981b4d56bf3d2c4ec17011cristy gamma, 4458884f600898ca6935a7981b4d56bf3d2c4ec17011cristy pixels[16]; 445994ea1636709395774d7118ef56162d211904cfd2cristy 446058ee5018960b42b80b54398eacabe9ae5da89149cristy MagickBooleanType 446158ee5018960b42b80b54398eacabe9ae5da89149cristy status; 446258ee5018960b42b80b54398eacabe9ae5da89149cristy 446358ee5018960b42b80b54398eacabe9ae5da89149cristy PixelInterpolateMethod 446458ee5018960b42b80b54398eacabe9ae5da89149cristy interpolate; 446558ee5018960b42b80b54398eacabe9ae5da89149cristy 446694ea1636709395774d7118ef56162d211904cfd2cristy PixelTrait 446794ea1636709395774d7118ef56162d211904cfd2cristy traits; 446894ea1636709395774d7118ef56162d211904cfd2cristy 446994ea1636709395774d7118ef56162d211904cfd2cristy register const Quantum 447094ea1636709395774d7118ef56162d211904cfd2cristy *p; 447194ea1636709395774d7118ef56162d211904cfd2cristy 447250e64b85215ce366ca50af1ba16326c784221f92cristy register ssize_t 447394ea1636709395774d7118ef56162d211904cfd2cristy i; 447494ea1636709395774d7118ef56162d211904cfd2cristy 4475a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy ssize_t 4476a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy x_offset, 4477a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy y_offset; 4478a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy 4479a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy assert(image != (Image *) NULL); 4480a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy assert(image->signature == MagickSignature); 4481a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy assert(image_view != (CacheView *) NULL); 4482a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy status=MagickTrue; 4483884f600898ca6935a7981b4d56bf3d2c4ec17011cristy *pixel=0.0; 4484cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy traits=GetPixelChannelTraits(image,channel); 4485a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy x_offset=(ssize_t) floor(x); 4486a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy y_offset=(ssize_t) floor(y); 4487cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy interpolate=method; 4488cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy if (interpolate == UndefinedInterpolatePixel) 4489cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy interpolate=image->interpolate; 4490cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony switch (interpolate) 4491a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy { 449258ee5018960b42b80b54398eacabe9ae5da89149cristy case AverageInterpolatePixel: /* nearest 4 neighbours */ 449358ee5018960b42b80b54398eacabe9ae5da89149cristy case Average9InterpolatePixel: /* nearest 9 neighbours */ 449458ee5018960b42b80b54398eacabe9ae5da89149cristy case Average16InterpolatePixel: /* nearest 16 neighbours */ 4495884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4496fb12237dd6e4d4d8b92d879661153062eeca0572cristy ssize_t 4497fb12237dd6e4d4d8b92d879661153062eeca0572cristy count; 4498cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 4499fb12237dd6e4d4d8b92d879661153062eeca0572cristy count=2; /* size of the area to average - default nearest 4 */ 4500cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (interpolate == Average9InterpolatePixel) 4501cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4502cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony count=3; 4503cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony x_offset=(ssize_t) (floor(x+0.5)-1); 4504cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony y_offset=(ssize_t) (floor(y+0.5)-1); 4505cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 4506fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 4507fb12237dd6e4d4d8b92d879661153062eeca0572cristy if (interpolate == Average16InterpolatePixel) 4508fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 4509fb12237dd6e4d4d8b92d879661153062eeca0572cristy count=4; 4510fb12237dd6e4d4d8b92d879661153062eeca0572cristy x_offset--; 4511fb12237dd6e4d4d8b92d879661153062eeca0572cristy y_offset--; 4512fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 4513021216a8b35ea91ef1f12713ed41da843bbaee7bcristy p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count, 4514021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (size_t) count,exception); 4515884f600898ca6935a7981b4d56bf3d2c4ec17011cristy if (p == (const Quantum *) NULL) 4516884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4517884f600898ca6935a7981b4d56bf3d2c4ec17011cristy status=MagickFalse; 4518884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4519884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 452058ee5018960b42b80b54398eacabe9ae5da89149cristy count*=count; /* Number of pixels to average */ 4521222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy if ((traits & BlendPixelTrait) == 0) 452250e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) count; i++) 4523884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4524884f600898ca6935a7981b4d56bf3d2c4ec17011cristy alpha[i]=1.0; 4525a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[i]=(double) p[i*GetPixelChannels(image)+channel]; 4526884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4527884f600898ca6935a7981b4d56bf3d2c4ec17011cristy else 452850e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) count; i++) 4529884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4530884f600898ca6935a7981b4d56bf3d2c4ec17011cristy alpha[i]=QuantumScale*GetPixelAlpha(image,p+i* 4531884f600898ca6935a7981b4d56bf3d2c4ec17011cristy GetPixelChannels(image)); 4532884f600898ca6935a7981b4d56bf3d2c4ec17011cristy pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel]; 4533884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 453450e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) count; i++) 4535884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 45363e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(alpha[i])/count; 4537cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony *pixel+=gamma*pixels[i]; 4538884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4539884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4540884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4541cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case BilinearInterpolatePixel: 4542cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony default: 4543cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4544cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony PointInfo 4545cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta, 4546cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon; 4547cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 4548cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception); 4549cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (p == (const Quantum *) NULL) 4550cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4551cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony status=MagickFalse; 4552cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 4553cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 4554cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if ((traits & BlendPixelTrait) == 0) 4555cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony for (i=0; i < 4; i++) 4556cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4557cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony alpha[i]=1.0; 4558a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[i]=(double) p[i*GetPixelChannels(image)+channel]; 4559cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 4560cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony else 4561cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony for (i=0; i < 4; i++) 4562cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4563cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony alpha[i]=QuantumScale*GetPixelAlpha(image,p+i* 4564cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony GetPixelChannels(image)); 4565cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel]; 4566cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 4567cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta.x=x-x_offset; 4568cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta.y=y-y_offset; 4569cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon.x=1.0-delta.x; 4570cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon.y=1.0-delta.y; 4571cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y* 4572cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony (epsilon.x*alpha[2]+delta.x*alpha[3]))); 45733e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 4574cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y* 4575cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony (epsilon.x*pixels[2]+delta.x*pixels[3])); 4576cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 4577cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 45785f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony case BlendInterpolatePixel: 45795f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 45805f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception); 45815f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony if (p == (const Quantum *) NULL) 45825f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 45835f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony status=MagickFalse; 45845f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony break; 45855f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 45865f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony if ((traits & BlendPixelTrait) == 0) 45875f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony for (i=0; i < 4; i++) 45885f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 45895f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony alpha[i]=1.0; 45905f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel]; 45915f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 45925f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony else 45935f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony for (i=0; i < 4; i++) 45945f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 45955f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony alpha[i]=QuantumScale*GetPixelAlpha(image,p+i* 45965f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony GetPixelChannels(image)); 45975f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel]; 45985f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 459958ee5018960b42b80b54398eacabe9ae5da89149cristy gamma=1.0; /* number of pixels blended together (its variable) */ 46005f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony for (i=0; i <= 1L; i++) { 4601fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((y-y_offset) >= 0.75) 4602fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 4603fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[i]=alpha[i+2]; /* take right pixels */ 4604fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i]=pixels[i+2]; 4605fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 4606fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 4607fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((y-y_offset) > 0.25) 4608fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 4609fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma=2.0; /* blend both pixels in row */ 4610fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[i]+=alpha[i+2]; /* add up alpha weights */ 4611fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i]+=pixels[i+2]; 4612fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 46135f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 4614fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((x-x_offset) >= 0.75) 4615fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 4616fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[0]=alpha[1]; /* take bottom row blend */ 4617fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0]=pixels[1]; 4618fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 4619fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 4620fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((x-x_offset) > 0.25) 4621fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 4622fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma*=2.0; /* blend both rows */ 4623fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[0]+=alpha[1]; /* add up alpha weights */ 4624fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0]+=pixels[1]; 4625fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 46265f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony if (channel != AlphaPixelChannel) 462758ee5018960b42b80b54398eacabe9ae5da89149cristy gamma=PerceptibleReciprocal(alpha[0]); /* (color) 1/alpha_weights */ 46285f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony else 462958ee5018960b42b80b54398eacabe9ae5da89149cristy gamma=PerceptibleReciprocal(gamma); /* (alpha) 1/number_of_pixels */ 46305f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony *pixel=gamma*pixels[0]; 46315f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony break; 46325f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 4633cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case CatromInterpolatePixel: 4634884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4635a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 4636380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy cx[4], 46376676f5a461ba75c5f4a927218cb3577dd29d70aenicolas cy[4]; 4638884f600898ca6935a7981b4d56bf3d2c4ec17011cristy 4639884f600898ca6935a7981b4d56bf3d2c4ec17011cristy p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4, 4640884f600898ca6935a7981b4d56bf3d2c4ec17011cristy exception); 4641884f600898ca6935a7981b4d56bf3d2c4ec17011cristy if (p == (const Quantum *) NULL) 4642884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4643884f600898ca6935a7981b4d56bf3d2c4ec17011cristy status=MagickFalse; 4644884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4645884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4646222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy if ((traits & BlendPixelTrait) == 0) 4647884f600898ca6935a7981b4d56bf3d2c4ec17011cristy for (i=0; i < 16; i++) 4648884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4649884f600898ca6935a7981b4d56bf3d2c4ec17011cristy alpha[i]=1.0; 4650a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[i]=(double) p[i*GetPixelChannels(image)+channel]; 4651884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4652884f600898ca6935a7981b4d56bf3d2c4ec17011cristy else 4653884f600898ca6935a7981b4d56bf3d2c4ec17011cristy for (i=0; i < 16; i++) 4654884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4655884f600898ca6935a7981b4d56bf3d2c4ec17011cristy alpha[i]=QuantumScale*GetPixelAlpha(image,p+i* 4656884f600898ca6935a7981b4d56bf3d2c4ec17011cristy GetPixelChannels(image)); 4657884f600898ca6935a7981b4d56bf3d2c4ec17011cristy pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel]; 4658884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4659a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy CatromWeights((double) (x-x_offset),&cx); 4660a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy CatromWeights((double) (y-y_offset),&cy); 4661a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy gamma=(channel == AlphaPixelChannel ? (double) 1.0 : 46623e3ec3afbb0782697f201cbe30a56794c10dc7efcristy PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]* 4663d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]* 4664d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]* 4665d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+ 4666d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[2]*alpha[14]+cx[3]*alpha[15]))); 4667380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+ 4668d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]* 4669d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+ 4670d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]* 4671d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15])); 4672884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4673884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4674884f600898ca6935a7981b4d56bf3d2c4ec17011cristy case IntegerInterpolatePixel: 4675884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4676884f600898ca6935a7981b4d56bf3d2c4ec17011cristy p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception); 4677884f600898ca6935a7981b4d56bf3d2c4ec17011cristy if (p == (const Quantum *) NULL) 4678884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4679884f600898ca6935a7981b4d56bf3d2c4ec17011cristy status=MagickFalse; 4680884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4681884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 46820beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy *pixel=(double) GetPixelChannel(image,channel,p); 4683884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4684884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4685cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case NearestInterpolatePixel: 4686884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4687cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony x_offset=(ssize_t) floor(x+0.5); 4688cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony y_offset=(ssize_t) floor(y+0.5); 4689cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception); 4690884f600898ca6935a7981b4d56bf3d2c4ec17011cristy if (p == (const Quantum *) NULL) 4691884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4692884f600898ca6935a7981b4d56bf3d2c4ec17011cristy status=MagickFalse; 4693884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4694884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 46950beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy *pixel=(double) GetPixelChannel(image,channel,p); 4696884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4697884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4698884f600898ca6935a7981b4d56bf3d2c4ec17011cristy case MeshInterpolatePixel: 4699884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4700884f600898ca6935a7981b4d56bf3d2c4ec17011cristy PointInfo 4701884f600898ca6935a7981b4d56bf3d2c4ec17011cristy delta, 4702884f600898ca6935a7981b4d56bf3d2c4ec17011cristy luminance; 4703884f600898ca6935a7981b4d56bf3d2c4ec17011cristy 4704884f600898ca6935a7981b4d56bf3d2c4ec17011cristy p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception); 4705884f600898ca6935a7981b4d56bf3d2c4ec17011cristy if (p == (const Quantum *) NULL) 4706884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4707884f600898ca6935a7981b4d56bf3d2c4ec17011cristy status=MagickFalse; 4708884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4709884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4710222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy if ((traits & BlendPixelTrait) == 0) 471194ea1636709395774d7118ef56162d211904cfd2cristy for (i=0; i < 4; i++) 471294ea1636709395774d7118ef56162d211904cfd2cristy { 471394ea1636709395774d7118ef56162d211904cfd2cristy alpha[i]=1.0; 4714a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[i]=(double) p[i*GetPixelChannels(image)+channel]; 471594ea1636709395774d7118ef56162d211904cfd2cristy } 471694ea1636709395774d7118ef56162d211904cfd2cristy else 471794ea1636709395774d7118ef56162d211904cfd2cristy for (i=0; i < 4; i++) 471894ea1636709395774d7118ef56162d211904cfd2cristy { 471994ea1636709395774d7118ef56162d211904cfd2cristy alpha[i]=QuantumScale*GetPixelAlpha(image,p+i* 472094ea1636709395774d7118ef56162d211904cfd2cristy GetPixelChannels(image)); 472194ea1636709395774d7118ef56162d211904cfd2cristy pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel]; 472294ea1636709395774d7118ef56162d211904cfd2cristy } 4723884f600898ca6935a7981b4d56bf3d2c4ec17011cristy delta.x=x-x_offset; 4724884f600898ca6935a7981b4d56bf3d2c4ec17011cristy delta.y=y-y_offset; 4725ebfaacf0542df42a5beaa9b81a017992e838df70cristy luminance.x=GetPixelLuma(image,p)-(double) 4726ebfaacf0542df42a5beaa9b81a017992e838df70cristy GetPixelLuma(image,p+3*GetPixelChannels(image)); 4727ebfaacf0542df42a5beaa9b81a017992e838df70cristy luminance.y=GetPixelLuma(image,p+GetPixelChannels(image))-(double) 4728ebfaacf0542df42a5beaa9b81a017992e838df70cristy GetPixelLuma(image,p+2*GetPixelChannels(image)); 472994ea1636709395774d7118ef56162d211904cfd2cristy if (fabs(luminance.x) < fabs(luminance.y)) 473094ea1636709395774d7118ef56162d211904cfd2cristy { 473194ea1636709395774d7118ef56162d211904cfd2cristy /* 473294ea1636709395774d7118ef56162d211904cfd2cristy Diagonal 0-3 NW-SE. 473394ea1636709395774d7118ef56162d211904cfd2cristy */ 473494ea1636709395774d7118ef56162d211904cfd2cristy if (delta.x <= delta.y) 473594ea1636709395774d7118ef56162d211904cfd2cristy { 473694ea1636709395774d7118ef56162d211904cfd2cristy /* 473794ea1636709395774d7118ef56162d211904cfd2cristy Bottom-left triangle (pixel: 2, diagonal: 0-3). 473894ea1636709395774d7118ef56162d211904cfd2cristy */ 473994ea1636709395774d7118ef56162d211904cfd2cristy delta.y=1.0-delta.y; 474094ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]); 47413e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 474294ea1636709395774d7118ef56162d211904cfd2cristy *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3], 474394ea1636709395774d7118ef56162d211904cfd2cristy pixels[0]); 474494ea1636709395774d7118ef56162d211904cfd2cristy } 474594ea1636709395774d7118ef56162d211904cfd2cristy else 474694ea1636709395774d7118ef56162d211904cfd2cristy { 474794ea1636709395774d7118ef56162d211904cfd2cristy /* 474894ea1636709395774d7118ef56162d211904cfd2cristy Top-right triangle (pixel: 1, diagonal: 0-3). 474994ea1636709395774d7118ef56162d211904cfd2cristy */ 475094ea1636709395774d7118ef56162d211904cfd2cristy delta.x=1.0-delta.x; 475194ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]); 47523e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 475394ea1636709395774d7118ef56162d211904cfd2cristy *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0], 475494ea1636709395774d7118ef56162d211904cfd2cristy pixels[3]); 475594ea1636709395774d7118ef56162d211904cfd2cristy } 475694ea1636709395774d7118ef56162d211904cfd2cristy } 475794ea1636709395774d7118ef56162d211904cfd2cristy else 475894ea1636709395774d7118ef56162d211904cfd2cristy { 475994ea1636709395774d7118ef56162d211904cfd2cristy /* 476094ea1636709395774d7118ef56162d211904cfd2cristy Diagonal 1-2 NE-SW. 476194ea1636709395774d7118ef56162d211904cfd2cristy */ 476294ea1636709395774d7118ef56162d211904cfd2cristy if (delta.x <= (1.0-delta.y)) 476394ea1636709395774d7118ef56162d211904cfd2cristy { 476494ea1636709395774d7118ef56162d211904cfd2cristy /* 476594ea1636709395774d7118ef56162d211904cfd2cristy Top-left triangle (pixel: 0, diagonal: 1-2). 476694ea1636709395774d7118ef56162d211904cfd2cristy */ 476794ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]); 47683e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 476994ea1636709395774d7118ef56162d211904cfd2cristy *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1], 477094ea1636709395774d7118ef56162d211904cfd2cristy pixels[2]); 477194ea1636709395774d7118ef56162d211904cfd2cristy } 477294ea1636709395774d7118ef56162d211904cfd2cristy else 477394ea1636709395774d7118ef56162d211904cfd2cristy { 477494ea1636709395774d7118ef56162d211904cfd2cristy /* 477594ea1636709395774d7118ef56162d211904cfd2cristy Bottom-right triangle (pixel: 3, diagonal: 1-2). 477694ea1636709395774d7118ef56162d211904cfd2cristy */ 477794ea1636709395774d7118ef56162d211904cfd2cristy delta.x=1.0-delta.x; 477894ea1636709395774d7118ef56162d211904cfd2cristy delta.y=1.0-delta.y; 477994ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]); 47803e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 478194ea1636709395774d7118ef56162d211904cfd2cristy *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2], 478294ea1636709395774d7118ef56162d211904cfd2cristy pixels[1]); 478394ea1636709395774d7118ef56162d211904cfd2cristy } 478494ea1636709395774d7118ef56162d211904cfd2cristy } 4785a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy break; 4786a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy } 4787884f600898ca6935a7981b4d56bf3d2c4ec17011cristy case SplineInterpolatePixel: 4788884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4789a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 4790d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[4], 47916676f5a461ba75c5f4a927218cb3577dd29d70aenicolas cy[4]; 4792884f600898ca6935a7981b4d56bf3d2c4ec17011cristy 4793884f600898ca6935a7981b4d56bf3d2c4ec17011cristy p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4, 4794884f600898ca6935a7981b4d56bf3d2c4ec17011cristy exception); 4795884f600898ca6935a7981b4d56bf3d2c4ec17011cristy if (p == (const Quantum *) NULL) 4796884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4797884f600898ca6935a7981b4d56bf3d2c4ec17011cristy status=MagickFalse; 4798884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4799884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4800222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy if ((traits & BlendPixelTrait) == 0) 4801884f600898ca6935a7981b4d56bf3d2c4ec17011cristy for (i=0; i < 16; i++) 4802884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4803884f600898ca6935a7981b4d56bf3d2c4ec17011cristy alpha[i]=1.0; 4804a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[i]=(double) p[i*GetPixelChannels(image)+channel]; 4805884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4806884f600898ca6935a7981b4d56bf3d2c4ec17011cristy else 4807884f600898ca6935a7981b4d56bf3d2c4ec17011cristy for (i=0; i < 16; i++) 4808884f600898ca6935a7981b4d56bf3d2c4ec17011cristy { 4809884f600898ca6935a7981b4d56bf3d2c4ec17011cristy alpha[i]=QuantumScale*GetPixelAlpha(image,p+i* 4810884f600898ca6935a7981b4d56bf3d2c4ec17011cristy GetPixelChannels(image)); 4811884f600898ca6935a7981b4d56bf3d2c4ec17011cristy pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel]; 4812884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4813a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy SplineWeights((double) (x-x_offset),&cx); 4814a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy SplineWeights((double) (y-y_offset),&cy); 4815a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy gamma=(channel == AlphaPixelChannel ? (double) 1.0 : 48163e3ec3afbb0782697f201cbe30a56794c10dc7efcristy PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]* 4817d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]* 4818d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]* 4819d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+ 4820d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[2]*alpha[14]+cx[3]*alpha[15]))); 4821d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+ 4822d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]* 4823d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+ 4824d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]* 4825d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15])); 4826884f600898ca6935a7981b4d56bf3d2c4ec17011cristy break; 4827884f600898ca6935a7981b4d56bf3d2c4ec17011cristy } 4828a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy } 4829a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy return(status); 4830a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy} 4831a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy 4832a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy/* 4833a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4834d76c51ed30cf4084f4434ba08925d16001d1e340cristy% % 4835d76c51ed30cf4084f4434ba08925d16001d1e340cristy% % 4836d76c51ed30cf4084f4434ba08925d16001d1e340cristy% % 48375c4e2586d27d4299a742d170d41105de1689aa46cristy% I n t e r p o l a t e P i x e l C h a n n e l s % 48385c4e2586d27d4299a742d170d41105de1689aa46cristy% % 48395c4e2586d27d4299a742d170d41105de1689aa46cristy% % 48405c4e2586d27d4299a742d170d41105de1689aa46cristy% % 48415c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 48425c4e2586d27d4299a742d170d41105de1689aa46cristy% 48435c4e2586d27d4299a742d170d41105de1689aa46cristy% InterpolatePixelChannels() applies a pixel interpolation method between a 48445c4e2586d27d4299a742d170d41105de1689aa46cristy% floating point coordinate and the pixels surrounding that coordinate. No 48455c4e2586d27d4299a742d170d41105de1689aa46cristy% pixel area resampling, or scaling of the result is performed. 48465c4e2586d27d4299a742d170d41105de1689aa46cristy% 4847cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% Interpolation is restricted to just the current channel setting of the 4848cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% destination image into which the color is to be stored 4849cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% 48505c4e2586d27d4299a742d170d41105de1689aa46cristy% The format of the InterpolatePixelChannels method is: 48515c4e2586d27d4299a742d170d41105de1689aa46cristy% 48525c4e2586d27d4299a742d170d41105de1689aa46cristy% MagickBooleanType InterpolatePixelChannels(const Image *source, 48535c4e2586d27d4299a742d170d41105de1689aa46cristy% const CacheView *source_view,const Image *destination, 48545c4e2586d27d4299a742d170d41105de1689aa46cristy% const PixelInterpolateMethod method,const double x,const double y, 48555c4e2586d27d4299a742d170d41105de1689aa46cristy% Quantum *pixel,ExceptionInfo *exception) 48565c4e2586d27d4299a742d170d41105de1689aa46cristy% 48575c4e2586d27d4299a742d170d41105de1689aa46cristy% A description of each parameter follows: 48585c4e2586d27d4299a742d170d41105de1689aa46cristy% 48595c4e2586d27d4299a742d170d41105de1689aa46cristy% o source: the source. 48605c4e2586d27d4299a742d170d41105de1689aa46cristy% 48615c4e2586d27d4299a742d170d41105de1689aa46cristy% o source_view: the source view. 48625c4e2586d27d4299a742d170d41105de1689aa46cristy% 4863cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% o destination: the destination image, for the interpolated color 48645c4e2586d27d4299a742d170d41105de1689aa46cristy% 48655c4e2586d27d4299a742d170d41105de1689aa46cristy% o method: the pixel color interpolation method. 48665c4e2586d27d4299a742d170d41105de1689aa46cristy% 48675c4e2586d27d4299a742d170d41105de1689aa46cristy% o x,y: A double representing the current (x,y) position of the pixel. 48685c4e2586d27d4299a742d170d41105de1689aa46cristy% 48695c4e2586d27d4299a742d170d41105de1689aa46cristy% o pixel: return the interpolated pixel here. 48705c4e2586d27d4299a742d170d41105de1689aa46cristy% 48715c4e2586d27d4299a742d170d41105de1689aa46cristy% o exception: return any errors or warnings in this structure. 48725c4e2586d27d4299a742d170d41105de1689aa46cristy% 48735c4e2586d27d4299a742d170d41105de1689aa46cristy*/ 48745c4e2586d27d4299a742d170d41105de1689aa46cristyMagickExport MagickBooleanType InterpolatePixelChannels(const Image *source, 48755c4e2586d27d4299a742d170d41105de1689aa46cristy const CacheView *source_view,const Image *destination, 48765c4e2586d27d4299a742d170d41105de1689aa46cristy const PixelInterpolateMethod method,const double x,const double y, 48775c4e2586d27d4299a742d170d41105de1689aa46cristy Quantum *pixel,ExceptionInfo *exception) 48785c4e2586d27d4299a742d170d41105de1689aa46cristy{ 48795c4e2586d27d4299a742d170d41105de1689aa46cristy MagickBooleanType 48805c4e2586d27d4299a742d170d41105de1689aa46cristy status; 48815c4e2586d27d4299a742d170d41105de1689aa46cristy 4882a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 48835c4e2586d27d4299a742d170d41105de1689aa46cristy alpha[16], 48845c4e2586d27d4299a742d170d41105de1689aa46cristy gamma, 48855c4e2586d27d4299a742d170d41105de1689aa46cristy pixels[16]; 48865c4e2586d27d4299a742d170d41105de1689aa46cristy 48875c4e2586d27d4299a742d170d41105de1689aa46cristy register const Quantum 48885c4e2586d27d4299a742d170d41105de1689aa46cristy *p; 48895c4e2586d27d4299a742d170d41105de1689aa46cristy 489050e64b85215ce366ca50af1ba16326c784221f92cristy register ssize_t 48915c4e2586d27d4299a742d170d41105de1689aa46cristy i; 48925c4e2586d27d4299a742d170d41105de1689aa46cristy 48935c4e2586d27d4299a742d170d41105de1689aa46cristy ssize_t 48945c4e2586d27d4299a742d170d41105de1689aa46cristy x_offset, 48955c4e2586d27d4299a742d170d41105de1689aa46cristy y_offset; 48965c4e2586d27d4299a742d170d41105de1689aa46cristy 4897cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony PixelInterpolateMethod 4898cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony interpolate; 4899cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 49005c4e2586d27d4299a742d170d41105de1689aa46cristy assert(source != (Image *) NULL); 49015c4e2586d27d4299a742d170d41105de1689aa46cristy assert(source->signature == MagickSignature); 49025c4e2586d27d4299a742d170d41105de1689aa46cristy assert(source_view != (CacheView *) NULL); 49035c4e2586d27d4299a742d170d41105de1689aa46cristy status=MagickTrue; 49045c4e2586d27d4299a742d170d41105de1689aa46cristy x_offset=(ssize_t) floor(x); 49055c4e2586d27d4299a742d170d41105de1689aa46cristy y_offset=(ssize_t) floor(y); 4906cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy interpolate=method; 4907cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy if (interpolate == UndefinedInterpolatePixel) 4908cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy interpolate=source->interpolate; 4909cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony switch (interpolate) 49105c4e2586d27d4299a742d170d41105de1689aa46cristy { 491158ee5018960b42b80b54398eacabe9ae5da89149cristy case AverageInterpolatePixel: /* nearest 4 neighbours */ 491258ee5018960b42b80b54398eacabe9ae5da89149cristy case Average9InterpolatePixel: /* nearest 9 neighbours */ 491358ee5018960b42b80b54398eacabe9ae5da89149cristy case Average16InterpolatePixel: /* nearest 16 neighbours */ 49145c4e2586d27d4299a742d170d41105de1689aa46cristy { 4915fb12237dd6e4d4d8b92d879661153062eeca0572cristy ssize_t 4916fb12237dd6e4d4d8b92d879661153062eeca0572cristy count; 4917cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 4918fb12237dd6e4d4d8b92d879661153062eeca0572cristy count=2; /* size of the area to average - default nearest 4 */ 4919cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (interpolate == Average9InterpolatePixel) 4920cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4921cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony count=3; 4922cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony x_offset=(ssize_t) (floor(x+0.5)-1); 4923cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony y_offset=(ssize_t) (floor(y+0.5)-1); 4924cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 4925fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 4926fb12237dd6e4d4d8b92d879661153062eeca0572cristy if (interpolate == Average16InterpolatePixel) 4927fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 4928fb12237dd6e4d4d8b92d879661153062eeca0572cristy count=4; 4929fb12237dd6e4d4d8b92d879661153062eeca0572cristy x_offset--; 4930fb12237dd6e4d4d8b92d879661153062eeca0572cristy y_offset--; 4931fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 49321b72b8194b7d3f274bebf9e176192fd29e385481cristy p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,(size_t) count, 49331b72b8194b7d3f274bebf9e176192fd29e385481cristy (size_t) count,exception); 49345c4e2586d27d4299a742d170d41105de1689aa46cristy if (p == (const Quantum *) NULL) 49355c4e2586d27d4299a742d170d41105de1689aa46cristy { 49365c4e2586d27d4299a742d170d41105de1689aa46cristy status=MagickFalse; 49375c4e2586d27d4299a742d170d41105de1689aa46cristy break; 49385c4e2586d27d4299a742d170d41105de1689aa46cristy } 493958ee5018960b42b80b54398eacabe9ae5da89149cristy count*=count; /* Number of pixels to average */ 494050e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 49415c4e2586d27d4299a742d170d41105de1689aa46cristy { 49425c4e2586d27d4299a742d170d41105de1689aa46cristy double 49435c4e2586d27d4299a742d170d41105de1689aa46cristy sum; 49445c4e2586d27d4299a742d170d41105de1689aa46cristy 494550e64b85215ce366ca50af1ba16326c784221f92cristy register ssize_t 49465c4e2586d27d4299a742d170d41105de1689aa46cristy j; 49475c4e2586d27d4299a742d170d41105de1689aa46cristy 49485a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 49495a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 49505a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 49515a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 49525c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits == UndefinedPixelTrait) || 49535c4e2586d27d4299a742d170d41105de1689aa46cristy (destination_traits == UndefinedPixelTrait)) 49545c4e2586d27d4299a742d170d41105de1689aa46cristy continue; 495550e64b85215ce366ca50af1ba16326c784221f92cristy for (j=0; j < (ssize_t) count; j++) 4956a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[j]=(double) p[j*GetPixelChannels(source)+i]; 49574a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy sum=0.0; 49585c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits & BlendPixelTrait) == 0) 49595c4e2586d27d4299a742d170d41105de1689aa46cristy { 496050e64b85215ce366ca50af1ba16326c784221f92cristy for (j=0; j < (ssize_t) count; j++) 4961cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony sum+=pixels[j]; 4962cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony sum/=count; 49634a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel); 49645c4e2586d27d4299a742d170d41105de1689aa46cristy continue; 49655c4e2586d27d4299a742d170d41105de1689aa46cristy } 496650e64b85215ce366ca50af1ba16326c784221f92cristy for (j=0; j < (ssize_t) count; j++) 49675c4e2586d27d4299a742d170d41105de1689aa46cristy { 49685c4e2586d27d4299a742d170d41105de1689aa46cristy alpha[j]=QuantumScale*GetPixelAlpha(source,p+j* 49695c4e2586d27d4299a742d170d41105de1689aa46cristy GetPixelChannels(source)); 49705c4e2586d27d4299a742d170d41105de1689aa46cristy pixels[j]*=alpha[j]; 49713e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(alpha[j]); 4972cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony sum+=gamma*pixels[j]; 49735c4e2586d27d4299a742d170d41105de1689aa46cristy } 4974cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony sum/=count; 49754a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel); 49765c4e2586d27d4299a742d170d41105de1689aa46cristy } 49775c4e2586d27d4299a742d170d41105de1689aa46cristy break; 49785c4e2586d27d4299a742d170d41105de1689aa46cristy } 4979cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case BilinearInterpolatePixel: 4980cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony default: 4981cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4982cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception); 4983cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (p == (const Quantum *) NULL) 4984cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4985cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony status=MagickFalse; 4986cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 4987cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 498850e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 4989cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 4990cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony PointInfo 4991cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta, 4992cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon; 4993cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 49945a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 49955a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 49965a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 49975a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 4998cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if ((traits == UndefinedPixelTrait) || 4999cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony (destination_traits == UndefinedPixelTrait)) 5000cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony continue; 5001cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta.x=x-x_offset; 5002cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta.y=y-y_offset; 5003cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon.x=1.0-delta.x; 5004cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon.y=1.0-delta.y; 5005a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[0]=(double) p[i]; 5006a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[1]=(double) p[GetPixelChannels(source)+i]; 5007a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[2]=(double) p[2*GetPixelChannels(source)+i]; 5008a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[3]=(double) p[3*GetPixelChannels(source)+i]; 5009cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if ((traits & BlendPixelTrait) == 0) 5010cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5011cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x))); 50123e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5013cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y* 5014cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x* 5015cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[2]+delta.x*pixels[3]))),pixel); 5016cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony continue; 5017cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5018cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony alpha[0]=QuantumScale*GetPixelAlpha(source,p); 5019cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source)); 5020cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony alpha[2]=QuantumScale*GetPixelAlpha(source,p+2* 5021cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony GetPixelChannels(source)); 5022cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony alpha[3]=QuantumScale*GetPixelAlpha(source,p+3* 5023cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony GetPixelChannels(source)); 5024cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[0]*=alpha[0]; 5025cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[1]*=alpha[1]; 5026cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[2]*=alpha[2]; 5027cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[3]*=alpha[3]; 5028cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y* 5029cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony (epsilon.x*alpha[2]+delta.x*alpha[3]))); 50303e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5031cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y* 5032cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+ 5033cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta.x*pixels[3]))),pixel); 5034cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5035cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 5036cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 50375f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony case BlendInterpolatePixel: 50385f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 50395f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception); 50405f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony if (p == (const Quantum *) NULL) 50415f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 50425f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony status=MagickFalse; 50435f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony break; 50445f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 50455f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 50465f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 50475f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony register ssize_t 50485f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony j; 50495f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony 50505a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 50515a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 50525a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 50535a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 50545f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony if ((traits == UndefinedPixelTrait) || 50555f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony (destination_traits == UndefinedPixelTrait)) 50565f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony continue; 50575f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony if ((traits & BlendPixelTrait) == 0) 50585f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony for (j=0; j < 4; j++) 50595f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 50605f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony alpha[j]=1.0; 50615f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+channel]; 50625f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 50635f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony else 50645f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony for (j=0; j < 4; j++) 50655f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony { 50665f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony alpha[j]=QuantumScale*GetPixelAlpha(source,p+j* 50675f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony GetPixelChannels(source)); 50685f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+channel]; 50695f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 5070fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma=1.0; /* number of pixels blended together (its variable) */ 5071fb12237dd6e4d4d8b92d879661153062eeca0572cristy for (j=0; j <= 1L; j++) 5072fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5073fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((y-y_offset) >= 0.75) 5074fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5075fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[j]=alpha[j+2]; /* take right pixels */ 5076fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[j]=pixels[j+2]; 5077fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 5078fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 5079fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((y-y_offset) > 0.25) 5080fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 508158ee5018960b42b80b54398eacabe9ae5da89149cristy gamma=2.0; /* blend both pixels in row */ 5082fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[j]+=alpha[j+2]; /* add up alpha weights */ 5083fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[j]+=pixels[j+2]; 5084fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 50855f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 5086fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((x-x_offset) >= 0.75) 5087fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5088fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[0]=alpha[1]; /* take bottom row blend */ 5089fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0]=pixels[1]; 5090fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 5091fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 5092fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((x-x_offset) > 0.25) 5093fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5094fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma*=2.0; /* blend both rows */ 5095fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[0]+=alpha[1]; /* add up alpha weights */ 5096fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0]+=pixels[1]; 5097fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 50985f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony if ((traits & BlendPixelTrait) == 0) 509958ee5018960b42b80b54398eacabe9ae5da89149cristy gamma=PerceptibleReciprocal(alpha[0]); /* (color) 1/alpha_weights */ 51005f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony else 510158ee5018960b42b80b54398eacabe9ae5da89149cristy gamma=PerceptibleReciprocal(gamma); /* (alpha) 1/number_of_pixels */ 51025f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony SetPixelChannel(destination,channel,ClampToQuantum(gamma*pixels[0]), 5103fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel); 51045f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 51055f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony break; 51065f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony } 5107cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case CatromInterpolatePixel: 51085c4e2586d27d4299a742d170d41105de1689aa46cristy { 5109a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 5110380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy cx[4], 5111380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy cy[4]; 51125c4e2586d27d4299a742d170d41105de1689aa46cristy 51135c4e2586d27d4299a742d170d41105de1689aa46cristy p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4, 51145c4e2586d27d4299a742d170d41105de1689aa46cristy exception); 51155c4e2586d27d4299a742d170d41105de1689aa46cristy if (p == (const Quantum *) NULL) 51165c4e2586d27d4299a742d170d41105de1689aa46cristy { 51175c4e2586d27d4299a742d170d41105de1689aa46cristy status=MagickFalse; 51185c4e2586d27d4299a742d170d41105de1689aa46cristy break; 51195c4e2586d27d4299a742d170d41105de1689aa46cristy } 512050e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 51215c4e2586d27d4299a742d170d41105de1689aa46cristy { 51225c4e2586d27d4299a742d170d41105de1689aa46cristy register ssize_t 51235c4e2586d27d4299a742d170d41105de1689aa46cristy j; 51245c4e2586d27d4299a742d170d41105de1689aa46cristy 51255a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 51265a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 51275a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 51285a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 51295c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits == UndefinedPixelTrait) || 51305c4e2586d27d4299a742d170d41105de1689aa46cristy (destination_traits == UndefinedPixelTrait)) 51315c4e2586d27d4299a742d170d41105de1689aa46cristy continue; 51325c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits & BlendPixelTrait) == 0) 51335c4e2586d27d4299a742d170d41105de1689aa46cristy for (j=0; j < 16; j++) 51345c4e2586d27d4299a742d170d41105de1689aa46cristy { 51355c4e2586d27d4299a742d170d41105de1689aa46cristy alpha[j]=1.0; 5136a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[j]=(double) p[j*GetPixelChannels(source)+i]; 51375c4e2586d27d4299a742d170d41105de1689aa46cristy } 51385c4e2586d27d4299a742d170d41105de1689aa46cristy else 51395c4e2586d27d4299a742d170d41105de1689aa46cristy for (j=0; j < 16; j++) 51405c4e2586d27d4299a742d170d41105de1689aa46cristy { 51415c4e2586d27d4299a742d170d41105de1689aa46cristy alpha[j]=QuantumScale*GetPixelAlpha(source,p+j* 51425c4e2586d27d4299a742d170d41105de1689aa46cristy GetPixelChannels(source)); 51435c4e2586d27d4299a742d170d41105de1689aa46cristy pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i]; 51445c4e2586d27d4299a742d170d41105de1689aa46cristy } 5145a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy CatromWeights((double) (x-x_offset),&cx); 5146a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy CatromWeights((double) (y-y_offset),&cy); 5147a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy gamma=((traits & BlendPixelTrait) ? (double) (1.0) : 51483e3ec3afbb0782697f201cbe30a56794c10dc7efcristy PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]* 5149d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]* 5150d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]* 5151d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+ 5152d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[2]*alpha[14]+cx[3]*alpha[15]))); 5153380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]* 5154380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]* 5155380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+ 5156380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]* 5157d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]* 5158d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[14]+cx[3]*pixels[15]))),pixel); 51595c4e2586d27d4299a742d170d41105de1689aa46cristy } 51605c4e2586d27d4299a742d170d41105de1689aa46cristy break; 51615c4e2586d27d4299a742d170d41105de1689aa46cristy } 51625c4e2586d27d4299a742d170d41105de1689aa46cristy case IntegerInterpolatePixel: 51635c4e2586d27d4299a742d170d41105de1689aa46cristy { 51645c4e2586d27d4299a742d170d41105de1689aa46cristy p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception); 51655c4e2586d27d4299a742d170d41105de1689aa46cristy if (p == (const Quantum *) NULL) 51665c4e2586d27d4299a742d170d41105de1689aa46cristy { 51675c4e2586d27d4299a742d170d41105de1689aa46cristy status=MagickFalse; 51685c4e2586d27d4299a742d170d41105de1689aa46cristy break; 51695c4e2586d27d4299a742d170d41105de1689aa46cristy } 517050e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 51715c4e2586d27d4299a742d170d41105de1689aa46cristy { 51725a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 51735a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 51745a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 51755a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 51765c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits == UndefinedPixelTrait) || 51775c4e2586d27d4299a742d170d41105de1689aa46cristy (destination_traits == UndefinedPixelTrait)) 51785c4e2586d27d4299a742d170d41105de1689aa46cristy continue; 51794a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,p[i],pixel); 51805c4e2586d27d4299a742d170d41105de1689aa46cristy } 51815c4e2586d27d4299a742d170d41105de1689aa46cristy break; 51825c4e2586d27d4299a742d170d41105de1689aa46cristy } 5183cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case NearestInterpolatePixel: 51845c4e2586d27d4299a742d170d41105de1689aa46cristy { 5185cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony x_offset=(ssize_t) floor(x+0.5); 5186cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony y_offset=(ssize_t) floor(y+0.5); 5187cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception); 51885c4e2586d27d4299a742d170d41105de1689aa46cristy if (p == (const Quantum *) NULL) 51895c4e2586d27d4299a742d170d41105de1689aa46cristy { 51905c4e2586d27d4299a742d170d41105de1689aa46cristy status=MagickFalse; 51915c4e2586d27d4299a742d170d41105de1689aa46cristy break; 51925c4e2586d27d4299a742d170d41105de1689aa46cristy } 519350e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 51945c4e2586d27d4299a742d170d41105de1689aa46cristy { 51955a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 51965a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 51975a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 51985a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 51995c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits == UndefinedPixelTrait) || 52005c4e2586d27d4299a742d170d41105de1689aa46cristy (destination_traits == UndefinedPixelTrait)) 52015c4e2586d27d4299a742d170d41105de1689aa46cristy continue; 52024a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,p[i],pixel); 52035c4e2586d27d4299a742d170d41105de1689aa46cristy } 52045c4e2586d27d4299a742d170d41105de1689aa46cristy break; 52055c4e2586d27d4299a742d170d41105de1689aa46cristy } 52065c4e2586d27d4299a742d170d41105de1689aa46cristy case MeshInterpolatePixel: 52075c4e2586d27d4299a742d170d41105de1689aa46cristy { 52085c4e2586d27d4299a742d170d41105de1689aa46cristy p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception); 52095c4e2586d27d4299a742d170d41105de1689aa46cristy if (p == (const Quantum *) NULL) 52105c4e2586d27d4299a742d170d41105de1689aa46cristy { 52115c4e2586d27d4299a742d170d41105de1689aa46cristy status=MagickFalse; 52125c4e2586d27d4299a742d170d41105de1689aa46cristy break; 52135c4e2586d27d4299a742d170d41105de1689aa46cristy } 521450e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 52155c4e2586d27d4299a742d170d41105de1689aa46cristy { 52165c4e2586d27d4299a742d170d41105de1689aa46cristy PointInfo 52175c4e2586d27d4299a742d170d41105de1689aa46cristy delta, 52185c4e2586d27d4299a742d170d41105de1689aa46cristy luminance; 52195c4e2586d27d4299a742d170d41105de1689aa46cristy 52205a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 52215a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 52225a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 52235a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 52245c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits == UndefinedPixelTrait) || 52255c4e2586d27d4299a742d170d41105de1689aa46cristy (destination_traits == UndefinedPixelTrait)) 52265c4e2586d27d4299a742d170d41105de1689aa46cristy continue; 5227a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[0]=(double) p[i]; 5228a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[1]=(double) p[GetPixelChannels(source)+i]; 5229a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[2]=(double) p[2*GetPixelChannels(source)+i]; 5230a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[3]=(double) p[3*GetPixelChannels(source)+i]; 52311861c90c5c8c4ceb56885dd86377412aae0f4526cristy if ((traits & BlendPixelTrait) == 0) 52321861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 52331861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[0]=1.0; 52341861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[1]=1.0; 52351861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[2]=1.0; 52361861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[3]=1.0; 52371861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 52381861c90c5c8c4ceb56885dd86377412aae0f4526cristy else 52391861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 52401861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[0]=QuantumScale*GetPixelAlpha(source,p); 52411861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[1]=QuantumScale*GetPixelAlpha(source,p+ 52421861c90c5c8c4ceb56885dd86377412aae0f4526cristy GetPixelChannels(source)); 52431861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[2]=QuantumScale*GetPixelAlpha(source,p+2* 52441861c90c5c8c4ceb56885dd86377412aae0f4526cristy GetPixelChannels(source)); 52451861c90c5c8c4ceb56885dd86377412aae0f4526cristy alpha[3]=QuantumScale*GetPixelAlpha(source,p+3* 52461861c90c5c8c4ceb56885dd86377412aae0f4526cristy GetPixelChannels(source)); 52471861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 52481861c90c5c8c4ceb56885dd86377412aae0f4526cristy delta.x=x-x_offset; 52491861c90c5c8c4ceb56885dd86377412aae0f4526cristy delta.y=y-y_offset; 5250ebfaacf0542df42a5beaa9b81a017992e838df70cristy luminance.x=fabs((double) (GetPixelLuma(source,p)- 5251ebfaacf0542df42a5beaa9b81a017992e838df70cristy GetPixelLuma(source,p+3*GetPixelChannels(source)))); 5252ebfaacf0542df42a5beaa9b81a017992e838df70cristy luminance.y=fabs((double) (GetPixelLuma(source,p+ 5253ebfaacf0542df42a5beaa9b81a017992e838df70cristy GetPixelChannels(source))-GetPixelLuma(source,p+2* 5254fb12237dd6e4d4d8b92d879661153062eeca0572cristy GetPixelChannels(source)))); 5255cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (luminance.x < luminance.y) 52561861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 52571861c90c5c8c4ceb56885dd86377412aae0f4526cristy /* 52581861c90c5c8c4ceb56885dd86377412aae0f4526cristy Diagonal 0-3 NW-SE. 52591861c90c5c8c4ceb56885dd86377412aae0f4526cristy */ 52601861c90c5c8c4ceb56885dd86377412aae0f4526cristy if (delta.x <= delta.y) 52611861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 52621861c90c5c8c4ceb56885dd86377412aae0f4526cristy /* 52631861c90c5c8c4ceb56885dd86377412aae0f4526cristy Bottom-left triangle (pixel: 2, diagonal: 0-3). 52641861c90c5c8c4ceb56885dd86377412aae0f4526cristy */ 52651861c90c5c8c4ceb56885dd86377412aae0f4526cristy delta.y=1.0-delta.y; 52661861c90c5c8c4ceb56885dd86377412aae0f4526cristy gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]); 52673e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 52684a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,ClampToQuantum(gamma* 52694a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy MeshInterpolate(&delta,pixels[2],pixels[3],pixels[0])),pixel); 52701861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 52711861c90c5c8c4ceb56885dd86377412aae0f4526cristy else 52721861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 52731861c90c5c8c4ceb56885dd86377412aae0f4526cristy /* 52741861c90c5c8c4ceb56885dd86377412aae0f4526cristy Top-right triangle (pixel: 1, diagonal: 0-3). 52751861c90c5c8c4ceb56885dd86377412aae0f4526cristy */ 52761861c90c5c8c4ceb56885dd86377412aae0f4526cristy delta.x=1.0-delta.x; 52771861c90c5c8c4ceb56885dd86377412aae0f4526cristy gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]); 52783e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 52794a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,ClampToQuantum(gamma* 52804a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy MeshInterpolate(&delta,pixels[1],pixels[0],pixels[3])),pixel); 52811861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 52821861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 52831861c90c5c8c4ceb56885dd86377412aae0f4526cristy else 52841861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 52851861c90c5c8c4ceb56885dd86377412aae0f4526cristy /* 52861861c90c5c8c4ceb56885dd86377412aae0f4526cristy Diagonal 1-2 NE-SW. 52871861c90c5c8c4ceb56885dd86377412aae0f4526cristy */ 52881861c90c5c8c4ceb56885dd86377412aae0f4526cristy if (delta.x <= (1.0-delta.y)) 52891861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 52901861c90c5c8c4ceb56885dd86377412aae0f4526cristy /* 52911861c90c5c8c4ceb56885dd86377412aae0f4526cristy Top-left triangle (pixel: 0, diagonal: 1-2). 52921861c90c5c8c4ceb56885dd86377412aae0f4526cristy */ 52931861c90c5c8c4ceb56885dd86377412aae0f4526cristy gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]); 52943e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 52954a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,ClampToQuantum(gamma* 52964a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy MeshInterpolate(&delta,pixels[0],pixels[1],pixels[2])),pixel); 52971861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 52981861c90c5c8c4ceb56885dd86377412aae0f4526cristy else 52991861c90c5c8c4ceb56885dd86377412aae0f4526cristy { 53001861c90c5c8c4ceb56885dd86377412aae0f4526cristy /* 53011861c90c5c8c4ceb56885dd86377412aae0f4526cristy Bottom-right triangle (pixel: 3, diagonal: 1-2). 53021861c90c5c8c4ceb56885dd86377412aae0f4526cristy */ 53031861c90c5c8c4ceb56885dd86377412aae0f4526cristy delta.x=1.0-delta.x; 53041861c90c5c8c4ceb56885dd86377412aae0f4526cristy delta.y=1.0-delta.y; 53051861c90c5c8c4ceb56885dd86377412aae0f4526cristy gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]); 53063e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 53074a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy SetPixelChannel(destination,channel,ClampToQuantum(gamma* 53084a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy MeshInterpolate(&delta,pixels[3],pixels[2],pixels[1])),pixel); 53091861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 53101861c90c5c8c4ceb56885dd86377412aae0f4526cristy } 53115c4e2586d27d4299a742d170d41105de1689aa46cristy } 53125c4e2586d27d4299a742d170d41105de1689aa46cristy break; 53135c4e2586d27d4299a742d170d41105de1689aa46cristy } 53145c4e2586d27d4299a742d170d41105de1689aa46cristy case SplineInterpolatePixel: 53155c4e2586d27d4299a742d170d41105de1689aa46cristy { 5316a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 5317d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[4], 5318d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cy[4]; 5319d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas 53205c4e2586d27d4299a742d170d41105de1689aa46cristy p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4, 53215c4e2586d27d4299a742d170d41105de1689aa46cristy exception); 53225c4e2586d27d4299a742d170d41105de1689aa46cristy if (p == (const Quantum *) NULL) 53235c4e2586d27d4299a742d170d41105de1689aa46cristy { 53245c4e2586d27d4299a742d170d41105de1689aa46cristy status=MagickFalse; 53255c4e2586d27d4299a742d170d41105de1689aa46cristy break; 53265c4e2586d27d4299a742d170d41105de1689aa46cristy } 532750e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) GetPixelChannels(source); i++) 53285c4e2586d27d4299a742d170d41105de1689aa46cristy { 53295c4e2586d27d4299a742d170d41105de1689aa46cristy register ssize_t 53305c4e2586d27d4299a742d170d41105de1689aa46cristy j; 53315c4e2586d27d4299a742d170d41105de1689aa46cristy 53325a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(source,i); 53335a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait traits=GetPixelChannelTraits(source,channel); 53345a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelTrait destination_traits=GetPixelChannelTraits(destination, 53355a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy channel); 53365c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits == UndefinedPixelTrait) || 53375c4e2586d27d4299a742d170d41105de1689aa46cristy (destination_traits == UndefinedPixelTrait)) 53385c4e2586d27d4299a742d170d41105de1689aa46cristy continue; 53395c4e2586d27d4299a742d170d41105de1689aa46cristy if ((traits & BlendPixelTrait) == 0) 53405c4e2586d27d4299a742d170d41105de1689aa46cristy for (j=0; j < 16; j++) 53415c4e2586d27d4299a742d170d41105de1689aa46cristy { 53425c4e2586d27d4299a742d170d41105de1689aa46cristy alpha[j]=1.0; 5343a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixels[j]=(double) p[j*GetPixelChannels(source)+i]; 53445c4e2586d27d4299a742d170d41105de1689aa46cristy } 53455c4e2586d27d4299a742d170d41105de1689aa46cristy else 53465c4e2586d27d4299a742d170d41105de1689aa46cristy for (j=0; j < 16; j++) 53475c4e2586d27d4299a742d170d41105de1689aa46cristy { 53485c4e2586d27d4299a742d170d41105de1689aa46cristy alpha[j]=QuantumScale*GetPixelAlpha(source,p+j* 53495c4e2586d27d4299a742d170d41105de1689aa46cristy GetPixelChannels(source)); 53505c4e2586d27d4299a742d170d41105de1689aa46cristy pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i]; 53515c4e2586d27d4299a742d170d41105de1689aa46cristy } 5352a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy SplineWeights((double) (x-x_offset),&cx); 5353a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy SplineWeights((double) (y-y_offset),&cy); 5354a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy gamma=((traits & BlendPixelTrait) ? (double) (1.0) : 53553e3ec3afbb0782697f201cbe30a56794c10dc7efcristy PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]* 5356d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]* 5357d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]* 5358d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+ 5359d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[2]*alpha[14]+cx[3]*alpha[15]))); 5360d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]* 5361d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]* 5362d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+ 5363d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]* 5364d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]* 5365d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas pixels[14]+cx[3]*pixels[15]))),pixel); 53665c4e2586d27d4299a742d170d41105de1689aa46cristy } 53675c4e2586d27d4299a742d170d41105de1689aa46cristy break; 53685c4e2586d27d4299a742d170d41105de1689aa46cristy } 53695c4e2586d27d4299a742d170d41105de1689aa46cristy } 53705c4e2586d27d4299a742d170d41105de1689aa46cristy return(status); 53715c4e2586d27d4299a742d170d41105de1689aa46cristy} 53725c4e2586d27d4299a742d170d41105de1689aa46cristy 53735c4e2586d27d4299a742d170d41105de1689aa46cristy/* 53745c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 53755c4e2586d27d4299a742d170d41105de1689aa46cristy% % 53765c4e2586d27d4299a742d170d41105de1689aa46cristy% % 53775c4e2586d27d4299a742d170d41105de1689aa46cristy% % 53789075cdb062fda00666ab37b0ba7df4b8cc2e8eaccristy% I n t e r p o l a t e P i x e l I n f o % 5379d76c51ed30cf4084f4434ba08925d16001d1e340cristy% % 5380d76c51ed30cf4084f4434ba08925d16001d1e340cristy% % 5381d76c51ed30cf4084f4434ba08925d16001d1e340cristy% % 5382d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5383d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5384884f600898ca6935a7981b4d56bf3d2c4ec17011cristy% InterpolatePixelInfo() applies a pixel interpolation method between a 5385884f600898ca6935a7981b4d56bf3d2c4ec17011cristy% floating point coordinate and the pixels surrounding that coordinate. No 5386884f600898ca6935a7981b4d56bf3d2c4ec17011cristy% pixel area resampling, or scaling of the result is performed. 5387d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5388cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% Interpolation is restricted to just RGBKA channels. 5389cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony% 53904c08aed51c5899665ade97263692328eea4af106cristy% The format of the InterpolatePixelInfo method is: 5391d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 53924c08aed51c5899665ade97263692328eea4af106cristy% MagickBooleanType InterpolatePixelInfo(const Image *image, 53935c4e2586d27d4299a742d170d41105de1689aa46cristy% const CacheView *image_view,const PixelInterpolateMethod method, 53944c08aed51c5899665ade97263692328eea4af106cristy% const double x,const double y,PixelInfo *pixel, 5395d76c51ed30cf4084f4434ba08925d16001d1e340cristy% ExceptionInfo *exception) 5396d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5397d76c51ed30cf4084f4434ba08925d16001d1e340cristy% A description of each parameter follows: 5398d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5399d76c51ed30cf4084f4434ba08925d16001d1e340cristy% o image: the image. 5400d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5401d76c51ed30cf4084f4434ba08925d16001d1e340cristy% o image_view: the image view. 5402d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5403d76c51ed30cf4084f4434ba08925d16001d1e340cristy% o method: the pixel color interpolation method. 5404d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5405d76c51ed30cf4084f4434ba08925d16001d1e340cristy% o x,y: A double representing the current (x,y) position of the pixel. 5406d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5407d76c51ed30cf4084f4434ba08925d16001d1e340cristy% o pixel: return the interpolated pixel here. 5408d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5409d76c51ed30cf4084f4434ba08925d16001d1e340cristy% o exception: return any errors or warnings in this structure. 5410d76c51ed30cf4084f4434ba08925d16001d1e340cristy% 5411d76c51ed30cf4084f4434ba08925d16001d1e340cristy*/ 5412d76c51ed30cf4084f4434ba08925d16001d1e340cristy 54134c08aed51c5899665ade97263692328eea4af106cristystatic inline void AlphaBlendPixelInfo(const Image *image, 5414a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy const Quantum *pixel,PixelInfo *pixel_info,double *alpha) 5415d76c51ed30cf4084f4434ba08925d16001d1e340cristy{ 541617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait == UndefinedPixelTrait) 5417241310d359ef6893f4d0c1e43eeb39f34991fd2acristy { 5418241310d359ef6893f4d0c1e43eeb39f34991fd2acristy *alpha=1.0; 5419a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel_info->red=(double) GetPixelRed(image,pixel); 5420a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel_info->green=(double) GetPixelGreen(image,pixel); 5421a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel_info->blue=(double) GetPixelBlue(image,pixel); 54224c08aed51c5899665ade97263692328eea4af106cristy pixel_info->black=0.0; 54234c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 5424a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel_info->black=(double) GetPixelBlack(image,pixel); 5425a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel_info->alpha=(double) GetPixelAlpha(image,pixel); 5426241310d359ef6893f4d0c1e43eeb39f34991fd2acristy return; 5427241310d359ef6893f4d0c1e43eeb39f34991fd2acristy } 54284c08aed51c5899665ade97263692328eea4af106cristy *alpha=QuantumScale*GetPixelAlpha(image,pixel); 54294c08aed51c5899665ade97263692328eea4af106cristy pixel_info->red=(*alpha*GetPixelRed(image,pixel)); 54304c08aed51c5899665ade97263692328eea4af106cristy pixel_info->green=(*alpha*GetPixelGreen(image,pixel)); 54314c08aed51c5899665ade97263692328eea4af106cristy pixel_info->blue=(*alpha*GetPixelBlue(image,pixel)); 54324c08aed51c5899665ade97263692328eea4af106cristy pixel_info->black=0.0; 54334c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 54344c08aed51c5899665ade97263692328eea4af106cristy pixel_info->black=(*alpha*GetPixelBlack(image,pixel)); 5435a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel_info->alpha=(double) GetPixelAlpha(image,pixel); 5436d76c51ed30cf4084f4434ba08925d16001d1e340cristy} 5437d76c51ed30cf4084f4434ba08925d16001d1e340cristy 54384c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType InterpolatePixelInfo(const Image *image, 54395c4e2586d27d4299a742d170d41105de1689aa46cristy const CacheView *image_view,const PixelInterpolateMethod method, 54404c08aed51c5899665ade97263692328eea4af106cristy const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception) 5441d76c51ed30cf4084f4434ba08925d16001d1e340cristy{ 5442d76c51ed30cf4084f4434ba08925d16001d1e340cristy MagickBooleanType 5443d76c51ed30cf4084f4434ba08925d16001d1e340cristy status; 5444d76c51ed30cf4084f4434ba08925d16001d1e340cristy 5445a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 544642587c577d5b808de94915f2388b88b05c3d43a3cristy alpha[16], 544742587c577d5b808de94915f2388b88b05c3d43a3cristy gamma; 544842587c577d5b808de94915f2388b88b05c3d43a3cristy 5449865d58d60e5fc755d47771eab37ce5159531629dcristy PixelInfo 5450865d58d60e5fc755d47771eab37ce5159531629dcristy pixels[16]; 5451865d58d60e5fc755d47771eab37ce5159531629dcristy 54524c08aed51c5899665ade97263692328eea4af106cristy register const Quantum 5453d76c51ed30cf4084f4434ba08925d16001d1e340cristy *p; 5454d76c51ed30cf4084f4434ba08925d16001d1e340cristy 545550e64b85215ce366ca50af1ba16326c784221f92cristy register ssize_t 5456d76c51ed30cf4084f4434ba08925d16001d1e340cristy i; 5457d76c51ed30cf4084f4434ba08925d16001d1e340cristy 545842587c577d5b808de94915f2388b88b05c3d43a3cristy ssize_t 545942587c577d5b808de94915f2388b88b05c3d43a3cristy x_offset, 546042587c577d5b808de94915f2388b88b05c3d43a3cristy y_offset; 546142587c577d5b808de94915f2388b88b05c3d43a3cristy 5462cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony PixelInterpolateMethod 5463cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony interpolate; 5464cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 5465d76c51ed30cf4084f4434ba08925d16001d1e340cristy assert(image != (Image *) NULL); 5466d76c51ed30cf4084f4434ba08925d16001d1e340cristy assert(image->signature == MagickSignature); 5467d76c51ed30cf4084f4434ba08925d16001d1e340cristy assert(image_view != (CacheView *) NULL); 5468d76c51ed30cf4084f4434ba08925d16001d1e340cristy status=MagickTrue; 546942587c577d5b808de94915f2388b88b05c3d43a3cristy x_offset=(ssize_t) floor(x); 547042587c577d5b808de94915f2388b88b05c3d43a3cristy y_offset=(ssize_t) floor(y); 5471cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy interpolate=method; 5472cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy if (interpolate == UndefinedInterpolatePixel) 5473cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy interpolate=image->interpolate; 5474cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony switch (interpolate) 5475d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 547658ee5018960b42b80b54398eacabe9ae5da89149cristy case AverageInterpolatePixel: /* nearest 4 neighbours */ 547758ee5018960b42b80b54398eacabe9ae5da89149cristy case Average9InterpolatePixel: /* nearest 9 neighbours */ 547858ee5018960b42b80b54398eacabe9ae5da89149cristy case Average16InterpolatePixel: /* nearest 16 neighbours */ 5479d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5480fb12237dd6e4d4d8b92d879661153062eeca0572cristy ssize_t 5481fb12237dd6e4d4d8b92d879661153062eeca0572cristy count; 5482cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 5483fb12237dd6e4d4d8b92d879661153062eeca0572cristy count=2; /* size of the area to average - default nearest 4 */ 5484cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (interpolate == Average9InterpolatePixel) 5485cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5486cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony count=3; 5487cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony x_offset=(ssize_t) (floor(x+0.5)-1); 5488cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony y_offset=(ssize_t) (floor(y+0.5)-1); 5489cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5490cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony else if (interpolate == Average16InterpolatePixel) 5491cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5492cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony count=4; 5493cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony x_offset--; 5494cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony y_offset--; 5495cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5496021216a8b35ea91ef1f12713ed41da843bbaee7bcristy p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count, 5497021216a8b35ea91ef1f12713ed41da843bbaee7bcristy (size_t) count,exception); 54984c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 5499d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5500d76c51ed30cf4084f4434ba08925d16001d1e340cristy status=MagickFalse; 5501d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5502d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5503241310d359ef6893f4d0c1e43eeb39f34991fd2acristy pixel->red=0.0; 5504241310d359ef6893f4d0c1e43eeb39f34991fd2acristy pixel->green=0.0; 5505241310d359ef6893f4d0c1e43eeb39f34991fd2acristy pixel->blue=0.0; 55064c08aed51c5899665ade97263692328eea4af106cristy pixel->black=0.0; 5507865d58d60e5fc755d47771eab37ce5159531629dcristy pixel->alpha=0.0; 550858ee5018960b42b80b54398eacabe9ae5da89149cristy count*=count; /* number of pixels - square of size */ 550950e64b85215ce366ca50af1ba16326c784221f92cristy for (i=0; i < (ssize_t) count; i++) 5510cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5511cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony AlphaBlendPixelInfo(image,p,pixels,alpha); 55123e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(alpha[0]); 5513fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->red+=gamma*pixels[0].red; 5514fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->green+=gamma*pixels[0].green; 5515fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->blue+=gamma*pixels[0].blue; 5516fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->black+=gamma*pixels[0].black; 5517fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->alpha+=pixels[0].alpha; 5518cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p += GetPixelChannels(image); 5519cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5520cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony gamma=1.0/count; /* average weighting of each pixel in area */ 5521fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->red*=gamma; 5522fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->green*=gamma; 5523fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->blue*=gamma; 5524fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->black*=gamma; 5525fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->alpha*=gamma; 5526cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 5527cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5528cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case BackgroundInterpolatePixel: 5529cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5530fb12237dd6e4d4d8b92d879661153062eeca0572cristy *pixel=image->background_color; /* Copy PixelInfo Structure */ 5531d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5532d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5533cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case BilinearInterpolatePixel: 5534cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony default: 5535cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5536cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony PointInfo 5537cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta, 5538cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon; 5539cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony 5540cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception); 5541cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (p == (const Quantum *) NULL) 5542cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5543cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony status=MagickFalse; 5544cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 5545cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5546cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony for (i=0; i < 4L; i++) 5547cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i); 5548cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta.x=x-x_offset; 5549cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony delta.y=y-y_offset; 5550cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon.x=1.0-delta.x; 5551cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony epsilon.y=1.0-delta.y; 5552cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y* 5553cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony (epsilon.x*alpha[2]+delta.x*alpha[3]))); 55543e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5555cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x* 5556cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red)); 5557cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x* 5558cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x* 5559cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[3].green)); 5560cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x* 5561cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x* 5562cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[3].blue)); 5563cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (image->colorspace == CMYKColorspace) 5564cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x* 5565cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x* 5566cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[3].black)); 5567cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x))); 55683e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5569cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixel->alpha=(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x* 5570cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x* 5571cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony pixels[3].alpha)); 5572cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 5573cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5574cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case BlendInterpolatePixel: 5575cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5576cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception); 5577cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony if (p == (const Quantum *) NULL) 5578cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony { 5579cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony status=MagickFalse; 5580cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 5581cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5582cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony for (i=0; i < 4L; i++) 5583cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i); 5584fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma=1.0; /* number of pixels blended together (its variable) */ 5585fb12237dd6e4d4d8b92d879661153062eeca0572cristy for (i=0; i <= 1L; i++) 5586fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5587fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((y-y_offset) >= 0.75) 5588fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5589fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[i]=alpha[i+2]; /* take right pixels */ 5590fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i]=pixels[i+2]; 5591fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 5592fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 5593fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((y-y_offset) > 0.25) 5594fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5595fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma=2.0; /* blend both pixels in row */ 5596fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[i]+=alpha[i+2]; /* add up alpha weights */ 5597fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i].red+=pixels[i+2].red; 5598fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i].green+=pixels[i+2].green; 5599fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i].blue+=pixels[i+2].blue; 5600fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i].black+=pixels[i+2].black; 5601fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[i].alpha+=pixels[i+2].alpha; 5602fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 5603fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 5604fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((x-x_offset) >= 0.75) 5605fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5606fb12237dd6e4d4d8b92d879661153062eeca0572cristy alpha[0]=alpha[1]; 5607fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0]=pixels[1]; 5608fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 5609fb12237dd6e4d4d8b92d879661153062eeca0572cristy else 5610fb12237dd6e4d4d8b92d879661153062eeca0572cristy if ((x-x_offset) > 0.25) 5611fb12237dd6e4d4d8b92d879661153062eeca0572cristy { 5612fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma*=2.0; /* blend both rows */ 561358ee5018960b42b80b54398eacabe9ae5da89149cristy alpha[0]+= alpha[1]; /* add up alpha weights */ 5614fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0].red+=pixels[1].red; 5615fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0].green+=pixels[1].green; 5616fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0].blue+=pixels[1].blue; 5617fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0].black+=pixels[1].black; 5618fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[0].alpha+=pixels[1].alpha; 5619fb12237dd6e4d4d8b92d879661153062eeca0572cristy } 5620fb12237dd6e4d4d8b92d879661153062eeca0572cristy gamma=1.0/gamma; 56213e3ec3afbb0782697f201cbe30a56794c10dc7efcristy alpha[0]=PerceptibleReciprocal(alpha[0]); 5622fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->red=alpha[0]*pixels[0].red; 5623fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->green=alpha[0]*pixels[0].green; /* divide by sum of alpha */ 5624fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->blue=alpha[0]*pixels[0].blue; 5625fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->black=alpha[0]*pixels[0].black; 5626fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->alpha=gamma*pixels[0].alpha; /* divide by number of pixels */ 5627cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony break; 5628cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony } 5629cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case CatromInterpolatePixel: 5630d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5631a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 5632380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy cx[4], 5633380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy cy[4]; 5634d76c51ed30cf4084f4434ba08925d16001d1e340cristy 563542587c577d5b808de94915f2388b88b05c3d43a3cristy p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4, 563642587c577d5b808de94915f2388b88b05c3d43a3cristy exception); 56374c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 5638d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5639d76c51ed30cf4084f4434ba08925d16001d1e340cristy status=MagickFalse; 5640d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5641d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5642cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony for (i=0; i < 16L; i++) 5643cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i); 5644a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy CatromWeights((double) (x-x_offset),&cx); 5645a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy CatromWeights((double) (y-y_offset),&cy); 5646fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*pixels[1].red+cx[2]* 5647fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].red+cx[3]*pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]* 5648fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[5].red+cx[2]*pixels[6].red+cx[3]*pixels[7].red)+cy[2]*(cx[0]* 5649fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[8].red+cx[1]*pixels[9].red+cx[2]*pixels[10].red+cx[3]* 5650fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*pixels[13].red+cx[2]* 5651fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[14].red+cx[3]*pixels[15].red)); 5652fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*pixels[1].green+cx[2]* 5653fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].green+cx[3]*pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+ 5654fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[5].green+cx[2]*pixels[6].green+cx[3]*pixels[7].green)+ 5655fb12237dd6e4d4d8b92d879661153062eeca0572cristy cy[2]*(cx[0]*pixels[8].green+cx[1]*pixels[9].green+cx[2]* 5656fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[10].green+cx[3]*pixels[11].green)+cy[3]*(cx[0]* 5657fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[12].green+cx[1]*pixels[13].green+cx[2]*pixels[14].green+cx[3]* 5658fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[15].green)); 5659fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*pixels[1].blue+cx[2]* 5660fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].blue+cx[3]*pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]* 5661fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*pixels[7].blue)+cy[2]*(cx[0]* 5662fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[8].blue+cx[1]*pixels[9].blue+cx[2]*pixels[10].blue+cx[3]* 5663fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*pixels[13].blue+ 5664fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[2]*pixels[14].blue+cx[3]*pixels[15].blue)); 5665380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy if (image->colorspace == CMYKColorspace) 5666fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*pixels[1].black+cx[2]* 5667fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].black+cx[3]*pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+ 5668fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[5].black+cx[2]*pixels[6].black+cx[3]*pixels[7].black)+ 5669fb12237dd6e4d4d8b92d879661153062eeca0572cristy cy[2]*(cx[0]*pixels[8].black+cx[1]*pixels[9].black+cx[2]* 5670fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[10].black+cx[3]*pixels[11].black)+cy[3]*(cx[0]* 5671fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[12].black+cx[1]*pixels[13].black+cx[2]*pixels[14].black+cx[3]* 5672fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[15].black)); 5673fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*pixels[1].alpha+cx[2]* 5674fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].alpha+cx[3]*pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+ 5675fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*pixels[7].alpha)+ 5676fb12237dd6e4d4d8b92d879661153062eeca0572cristy cy[2]*(cx[0]*pixels[8].alpha+cx[1]*pixels[9].alpha+cx[2]* 5677fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[10].alpha+cx[3]*pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+ 5678fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha)); 5679d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5680d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5681d76c51ed30cf4084f4434ba08925d16001d1e340cristy case IntegerInterpolatePixel: 5682d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 568342587c577d5b808de94915f2388b88b05c3d43a3cristy p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception); 56844c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 5685d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5686d76c51ed30cf4084f4434ba08925d16001d1e340cristy status=MagickFalse; 5687d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5688d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5689803640d20a6a664315eddfff6f8531d0c5e0871dcristy GetPixelInfoPixel(image,p,pixel); 5690d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5691d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5692d76c51ed30cf4084f4434ba08925d16001d1e340cristy case MeshInterpolatePixel: 5693d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5694d76c51ed30cf4084f4434ba08925d16001d1e340cristy PointInfo 5695d76c51ed30cf4084f4434ba08925d16001d1e340cristy delta, 5696d76c51ed30cf4084f4434ba08925d16001d1e340cristy luminance; 5697d76c51ed30cf4084f4434ba08925d16001d1e340cristy 569894ea1636709395774d7118ef56162d211904cfd2cristy p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception); 56994c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 5700d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5701d76c51ed30cf4084f4434ba08925d16001d1e340cristy status=MagickFalse; 5702d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5703d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 570494ea1636709395774d7118ef56162d211904cfd2cristy delta.x=x-x_offset; 570594ea1636709395774d7118ef56162d211904cfd2cristy delta.y=y-y_offset; 5706ebfaacf0542df42a5beaa9b81a017992e838df70cristy luminance.x=GetPixelLuma(image,p)-(double) 5707ebfaacf0542df42a5beaa9b81a017992e838df70cristy GetPixelLuma(image,p+3*GetPixelChannels(image)); 5708ebfaacf0542df42a5beaa9b81a017992e838df70cristy luminance.y=GetPixelLuma(image,p+GetPixelChannels(image))-(double) 5709ebfaacf0542df42a5beaa9b81a017992e838df70cristy GetPixelLuma(image,p+2*GetPixelChannels(image)); 57105ce8df84afcfec6dc33ee61ac2014edb3871c455cristy AlphaBlendPixelInfo(image,p,pixels+0,alpha+0); 571128474bfbda5ee2d4da2eb79f299cf1f692770b99cristy AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1); 5712ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2); 5713ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3); 5714d76c51ed30cf4084f4434ba08925d16001d1e340cristy if (fabs(luminance.x) < fabs(luminance.y)) 5715d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5716d76c51ed30cf4084f4434ba08925d16001d1e340cristy /* 5717d76c51ed30cf4084f4434ba08925d16001d1e340cristy Diagonal 0-3 NW-SE. 5718d76c51ed30cf4084f4434ba08925d16001d1e340cristy */ 5719d76c51ed30cf4084f4434ba08925d16001d1e340cristy if (delta.x <= delta.y) 5720d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5721d76c51ed30cf4084f4434ba08925d16001d1e340cristy /* 572294ea1636709395774d7118ef56162d211904cfd2cristy Bottom-left triangle (pixel: 2, diagonal: 0-3). 5723d76c51ed30cf4084f4434ba08925d16001d1e340cristy */ 5724d76c51ed30cf4084f4434ba08925d16001d1e340cristy delta.y=1.0-delta.y; 5725d76c51ed30cf4084f4434ba08925d16001d1e340cristy gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]); 57263e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5727d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red, 5728d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[3].red,pixels[0].red); 5729d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green, 5730d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[3].green,pixels[0].green); 5731d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue, 5732d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[3].blue,pixels[0].blue); 57335af738104f48677012746b82ba0daa0dc59bdbb5cristy if (image->colorspace == CMYKColorspace) 57344c08aed51c5899665ade97263692328eea4af106cristy pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black, 57354c08aed51c5899665ade97263692328eea4af106cristy pixels[3].black,pixels[0].black); 573694ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,1.0,1.0,1.0); 5737865d58d60e5fc755d47771eab37ce5159531629dcristy pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha, 5738865d58d60e5fc755d47771eab37ce5159531629dcristy pixels[3].alpha,pixels[0].alpha); 5739d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5740d76c51ed30cf4084f4434ba08925d16001d1e340cristy else 5741d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5742d76c51ed30cf4084f4434ba08925d16001d1e340cristy /* 574394ea1636709395774d7118ef56162d211904cfd2cristy Top-right triangle (pixel:1 , diagonal: 0-3). 5744d76c51ed30cf4084f4434ba08925d16001d1e340cristy */ 5745d76c51ed30cf4084f4434ba08925d16001d1e340cristy delta.x=1.0-delta.x; 5746d76c51ed30cf4084f4434ba08925d16001d1e340cristy gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]); 57473e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5748d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red, 5749d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[0].red,pixels[3].red); 5750d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green, 5751d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[0].green,pixels[3].green); 5752d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue, 5753d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[0].blue,pixels[3].blue); 57545af738104f48677012746b82ba0daa0dc59bdbb5cristy if (image->colorspace == CMYKColorspace) 57554c08aed51c5899665ade97263692328eea4af106cristy pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black, 57564c08aed51c5899665ade97263692328eea4af106cristy pixels[0].black,pixels[3].black); 575794ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,1.0,1.0,1.0); 5758865d58d60e5fc755d47771eab37ce5159531629dcristy pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha, 5759865d58d60e5fc755d47771eab37ce5159531629dcristy pixels[0].alpha,pixels[3].alpha); 5760d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5761d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5762d76c51ed30cf4084f4434ba08925d16001d1e340cristy else 5763d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5764d76c51ed30cf4084f4434ba08925d16001d1e340cristy /* 5765d76c51ed30cf4084f4434ba08925d16001d1e340cristy Diagonal 1-2 NE-SW. 5766d76c51ed30cf4084f4434ba08925d16001d1e340cristy */ 5767d76c51ed30cf4084f4434ba08925d16001d1e340cristy if (delta.x <= (1.0-delta.y)) 5768d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5769d76c51ed30cf4084f4434ba08925d16001d1e340cristy /* 577094ea1636709395774d7118ef56162d211904cfd2cristy Top-left triangle (pixel: 0, diagonal: 1-2). 5771d76c51ed30cf4084f4434ba08925d16001d1e340cristy */ 5772d76c51ed30cf4084f4434ba08925d16001d1e340cristy gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]); 57733e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5774d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red, 5775d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[1].red,pixels[2].red); 5776d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green, 5777d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[1].green,pixels[2].green); 5778d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue, 5779d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[1].blue,pixels[2].blue); 57805af738104f48677012746b82ba0daa0dc59bdbb5cristy if (image->colorspace == CMYKColorspace) 57814c08aed51c5899665ade97263692328eea4af106cristy pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black, 57824c08aed51c5899665ade97263692328eea4af106cristy pixels[1].black,pixels[2].black); 578394ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,1.0,1.0,1.0); 5784865d58d60e5fc755d47771eab37ce5159531629dcristy pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha, 5785865d58d60e5fc755d47771eab37ce5159531629dcristy pixels[1].alpha,pixels[2].alpha); 5786d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5787d76c51ed30cf4084f4434ba08925d16001d1e340cristy else 5788d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5789d76c51ed30cf4084f4434ba08925d16001d1e340cristy /* 5790d76c51ed30cf4084f4434ba08925d16001d1e340cristy Bottom-right triangle (pixel: 3, diagonal: 1-2). 5791d76c51ed30cf4084f4434ba08925d16001d1e340cristy */ 5792d76c51ed30cf4084f4434ba08925d16001d1e340cristy delta.x=1.0-delta.x; 5793d76c51ed30cf4084f4434ba08925d16001d1e340cristy delta.y=1.0-delta.y; 5794d76c51ed30cf4084f4434ba08925d16001d1e340cristy gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]); 57953e3ec3afbb0782697f201cbe30a56794c10dc7efcristy gamma=PerceptibleReciprocal(gamma); 5796d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red, 5797d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[2].red,pixels[1].red); 5798d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green, 5799d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[2].green,pixels[1].green); 5800d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue, 5801d76c51ed30cf4084f4434ba08925d16001d1e340cristy pixels[2].blue,pixels[1].blue); 58025af738104f48677012746b82ba0daa0dc59bdbb5cristy if (image->colorspace == CMYKColorspace) 58034c08aed51c5899665ade97263692328eea4af106cristy pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black, 58044c08aed51c5899665ade97263692328eea4af106cristy pixels[2].black,pixels[1].black); 580594ea1636709395774d7118ef56162d211904cfd2cristy gamma=MeshInterpolate(&delta,1.0,1.0,1.0); 5806865d58d60e5fc755d47771eab37ce5159531629dcristy pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha, 5807865d58d60e5fc755d47771eab37ce5159531629dcristy pixels[2].alpha,pixels[1].alpha); 5808d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5809d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5810d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5811d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5812cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony case NearestInterpolatePixel: 5813d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5814cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony x_offset=(ssize_t) floor(x+0.5); 5815cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony y_offset=(ssize_t) floor(y+0.5); 5816cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception); 58174c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 5818d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5819d76c51ed30cf4084f4434ba08925d16001d1e340cristy status=MagickFalse; 5820d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5821d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5822803640d20a6a664315eddfff6f8531d0c5e0871dcristy GetPixelInfoPixel(image,p,pixel); 5823d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5824d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5825d76c51ed30cf4084f4434ba08925d16001d1e340cristy case SplineInterpolatePixel: 5826d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5827a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 5828d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cx[4], 5829d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas cy[4]; 5830d76c51ed30cf4084f4434ba08925d16001d1e340cristy 583142587c577d5b808de94915f2388b88b05c3d43a3cristy p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4, 583242587c577d5b808de94915f2388b88b05c3d43a3cristy exception); 58334c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 5834d76c51ed30cf4084f4434ba08925d16001d1e340cristy { 5835d76c51ed30cf4084f4434ba08925d16001d1e340cristy status=MagickFalse; 5836d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5837d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5838cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony for (i=0; i < 16L; i++) 5839cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i); 5840a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy SplineWeights((double) (x-x_offset),&cx); 5841a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy SplineWeights((double) (y-y_offset),&cy); 5842fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*pixels[1].red+cx[2]* 5843fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].red+cx[3]*pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]* 5844fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[5].red+cx[2]*pixels[6].red+cx[3]*pixels[7].red)+cy[2]*(cx[0]* 5845fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[8].red+cx[1]*pixels[9].red+cx[2]*pixels[10].red+cx[3]* 5846fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*pixels[13].red+cx[2]* 5847fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[14].red+cx[3]*pixels[15].red)); 5848fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*pixels[1].green+cx[2]* 5849fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].green+cx[3]*pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+ 5850fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[5].green+cx[2]*pixels[6].green+cx[3]*pixels[7].green)+ 5851fb12237dd6e4d4d8b92d879661153062eeca0572cristy cy[2]*(cx[0]*pixels[8].green+cx[1]*pixels[9].green+cx[2]* 5852fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[10].green+cx[3]*pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+ 5853fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green)); 5854fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*pixels[1].blue+cx[2]* 5855fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].blue+cx[3]*pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]* 5856fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*pixels[7].blue)+cy[2]*(cx[0]* 5857fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[8].blue+cx[1]*pixels[9].blue+cx[2]*pixels[10].blue+cx[3]* 5858fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*pixels[13].blue+ 5859fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[2]*pixels[14].blue+cx[3]*pixels[15].blue)); 5860d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas if (image->colorspace == CMYKColorspace) 5861fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*pixels[1].black+cx[2]* 5862fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].black+cx[3]*pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+ 5863fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[5].black+cx[2]*pixels[6].black+cx[3]*pixels[7].black)+ 5864fb12237dd6e4d4d8b92d879661153062eeca0572cristy cy[2]*(cx[0]*pixels[8].black+cx[1]*pixels[9].black+cx[2]* 5865fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[10].black+cx[3]*pixels[11].black)+cy[3]*(cx[0]* 5866fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[12].black+cx[1]*pixels[13].black+cx[2]*pixels[14].black+cx[3]* 5867fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[15].black)); 5868fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*pixels[1].alpha+cx[2]* 5869fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[2].alpha+cx[3]*pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+ 5870fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*pixels[7].alpha)+ 5871fb12237dd6e4d4d8b92d879661153062eeca0572cristy cy[2]*(cx[0]*pixels[8].alpha+cx[1]*pixels[9].alpha+cx[2]* 5872fb12237dd6e4d4d8b92d879661153062eeca0572cristy pixels[10].alpha+cx[3]*pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+ 5873fb12237dd6e4d4d8b92d879661153062eeca0572cristy cx[1]*pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha)); 5874d76c51ed30cf4084f4434ba08925d16001d1e340cristy break; 5875d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5876d76c51ed30cf4084f4434ba08925d16001d1e340cristy } 5877d76c51ed30cf4084f4434ba08925d16001d1e340cristy return(status); 5878d76c51ed30cf4084f4434ba08925d16001d1e340cristy} 58794c08aed51c5899665ade97263692328eea4af106cristy 58804c08aed51c5899665ade97263692328eea4af106cristy/* 58814c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 58824c08aed51c5899665ade97263692328eea4af106cristy% % 58834c08aed51c5899665ade97263692328eea4af106cristy% % 58844c08aed51c5899665ade97263692328eea4af106cristy% % 58854c08aed51c5899665ade97263692328eea4af106cristy+ I s F u z z y E q u i v a l e n c e P i x e l % 58864c08aed51c5899665ade97263692328eea4af106cristy% % 58874c08aed51c5899665ade97263692328eea4af106cristy% % 58884c08aed51c5899665ade97263692328eea4af106cristy% % 58894c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 58904c08aed51c5899665ade97263692328eea4af106cristy% 58914c08aed51c5899665ade97263692328eea4af106cristy% IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two 5892a060829f41c741d75c680e3a6863c9caae1009e4cristy% pixels is less than the specified distance in a linear three (or four) 58934c08aed51c5899665ade97263692328eea4af106cristy% dimensional color space. 58944c08aed51c5899665ade97263692328eea4af106cristy% 58954c08aed51c5899665ade97263692328eea4af106cristy% The format of the IsFuzzyEquivalencePixel method is: 58964c08aed51c5899665ade97263692328eea4af106cristy% 5897e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy% void IsFuzzyEquivalencePixel(const Image *source,const Quantum *p, 5898e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy% const Image *destination,const Quantum *q) 58994c08aed51c5899665ade97263692328eea4af106cristy% 59004c08aed51c5899665ade97263692328eea4af106cristy% A description of each parameter follows: 59014c08aed51c5899665ade97263692328eea4af106cristy% 5902e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy% o source: the source image. 59034c08aed51c5899665ade97263692328eea4af106cristy% 59044c08aed51c5899665ade97263692328eea4af106cristy% o p: Pixel p. 59054c08aed51c5899665ade97263692328eea4af106cristy% 5906e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy% o destination: the destination image. 5907e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy% 59084c08aed51c5899665ade97263692328eea4af106cristy% o q: Pixel q. 59094c08aed51c5899665ade97263692328eea4af106cristy% 59104c08aed51c5899665ade97263692328eea4af106cristy*/ 5911e4a404711bf20d9062d11ab28bc12e5acd307f9ccristyMagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *source, 5912e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy const Quantum *p,const Image *destination,const Quantum *q) 59134c08aed51c5899665ade97263692328eea4af106cristy{ 5914a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 59154c08aed51c5899665ade97263692328eea4af106cristy fuzz, 59164c08aed51c5899665ade97263692328eea4af106cristy pixel; 59174c08aed51c5899665ade97263692328eea4af106cristy 5918a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy register double 59194c08aed51c5899665ade97263692328eea4af106cristy distance, 59204c08aed51c5899665ade97263692328eea4af106cristy scale; 59214c08aed51c5899665ade97263692328eea4af106cristy 5922043a981a1f6b2393520e911594ce29ef5b060ee5cristy fuzz=(double) MagickMax(MagickMax(source->fuzz,destination->fuzz), 5923043a981a1f6b2393520e911594ce29ef5b060ee5cristy (MagickRealType) MagickSQ1_2); 5924043a981a1f6b2393520e911594ce29ef5b060ee5cristy fuzz*=fuzz; 59254c08aed51c5899665ade97263692328eea4af106cristy scale=1.0; 59264c08aed51c5899665ade97263692328eea4af106cristy distance=0.0; 592717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (source->alpha_trait != UndefinedPixelTrait) 59284c08aed51c5899665ade97263692328eea4af106cristy { 59294c08aed51c5899665ade97263692328eea4af106cristy /* 59304c08aed51c5899665ade97263692328eea4af106cristy Transparencies are involved - set alpha distance 59314c08aed51c5899665ade97263692328eea4af106cristy */ 593270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy pixel=GetPixelAlpha(source,p)-(double) GetPixelAlpha(destination,q); 59334c08aed51c5899665ade97263692328eea4af106cristy distance=pixel*pixel; 59344c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 59354c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 59364c08aed51c5899665ade97263692328eea4af106cristy /* 59374c08aed51c5899665ade97263692328eea4af106cristy Generate a alpha scaling factor to generate a 4D cone on colorspace 59384c08aed51c5899665ade97263692328eea4af106cristy Note that if one color is transparent, distance has no color component. 59394c08aed51c5899665ade97263692328eea4af106cristy */ 5940e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy scale=QuantumScale*GetPixelAlpha(source,p); 5941e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy scale*=QuantumScale*GetPixelAlpha(destination,q); 59424c08aed51c5899665ade97263692328eea4af106cristy if (scale <= MagickEpsilon) 59434c08aed51c5899665ade97263692328eea4af106cristy return(MagickTrue); 59444c08aed51c5899665ade97263692328eea4af106cristy } 59454c08aed51c5899665ade97263692328eea4af106cristy /* 59464c08aed51c5899665ade97263692328eea4af106cristy RGB or CMY color cube 59474c08aed51c5899665ade97263692328eea4af106cristy */ 59484c08aed51c5899665ade97263692328eea4af106cristy distance*=3.0; /* rescale appropriately */ 59494c08aed51c5899665ade97263692328eea4af106cristy fuzz*=3.0; 5950a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel=GetPixelRed(source,p)-(double) GetPixelRed(destination,q); 5951e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy if ((source->colorspace == HSLColorspace) || 5952e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy (source->colorspace == HSBColorspace) || 5953e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy (source->colorspace == HWBColorspace)) 59544c08aed51c5899665ade97263692328eea4af106cristy { 59554c08aed51c5899665ade97263692328eea4af106cristy /* 59564c08aed51c5899665ade97263692328eea4af106cristy Compute an arc distance for hue. It should be a vector angle of 59574c08aed51c5899665ade97263692328eea4af106cristy 'S'/'W' length with 'L'/'B' forming appropriate cones. 59584c08aed51c5899665ade97263692328eea4af106cristy */ 59594c08aed51c5899665ade97263692328eea4af106cristy if (fabs((double) pixel) > (QuantumRange/2)) 59604c08aed51c5899665ade97263692328eea4af106cristy pixel-=QuantumRange; 59614c08aed51c5899665ade97263692328eea4af106cristy pixel*=2; 59624c08aed51c5899665ade97263692328eea4af106cristy } 59634c08aed51c5899665ade97263692328eea4af106cristy distance+=scale*pixel*pixel; 59644c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 59654c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 5966a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel=GetPixelGreen(source,p)-(double) GetPixelGreen(destination,q); 59674c08aed51c5899665ade97263692328eea4af106cristy distance+=scale*pixel*pixel; 59684c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 59694c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 5970a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy pixel=GetPixelBlue(source,p)-(double) GetPixelBlue(destination,q); 59714c08aed51c5899665ade97263692328eea4af106cristy distance+=scale*pixel*pixel; 59724c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 59734c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 59744c08aed51c5899665ade97263692328eea4af106cristy return(MagickTrue); 59754c08aed51c5899665ade97263692328eea4af106cristy} 59764c08aed51c5899665ade97263692328eea4af106cristy 59774c08aed51c5899665ade97263692328eea4af106cristy/* 59784c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 59794c08aed51c5899665ade97263692328eea4af106cristy% % 59804c08aed51c5899665ade97263692328eea4af106cristy% % 59814c08aed51c5899665ade97263692328eea4af106cristy% % 59824c08aed51c5899665ade97263692328eea4af106cristy+ I s F u z z y E q u i v a l e n c e P i x e l I n f o % 59834c08aed51c5899665ade97263692328eea4af106cristy% % 59844c08aed51c5899665ade97263692328eea4af106cristy% % 59854c08aed51c5899665ade97263692328eea4af106cristy% % 59864c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 59874c08aed51c5899665ade97263692328eea4af106cristy% 59884c08aed51c5899665ade97263692328eea4af106cristy% IsFuzzyEquivalencePixelInfo() returns true if the distance between two 59894c08aed51c5899665ade97263692328eea4af106cristy% colors is less than the specified distance in a linear three (or four) 59904c08aed51c5899665ade97263692328eea4af106cristy% dimensional color space. 59914c08aed51c5899665ade97263692328eea4af106cristy% 59925f95f4f77efc46ff53593d750491c8f60698c983cristy% This implements the equivalent of: 59935f95f4f77efc46ff53593d750491c8f60698c983cristy% fuzz < sqrt(color_distance^2 * u.a*v.a + alpha_distance^2) 59944c08aed51c5899665ade97263692328eea4af106cristy% 59954c08aed51c5899665ade97263692328eea4af106cristy% Which produces a multi-dimensional cone for that colorspace along the 59964c08aed51c5899665ade97263692328eea4af106cristy% transparency vector. 59974c08aed51c5899665ade97263692328eea4af106cristy% 59985f95f4f77efc46ff53593d750491c8f60698c983cristy% For example for an RGB: 59994c08aed51c5899665ade97263692328eea4af106cristy% color_distance^2 = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3 60004c08aed51c5899665ade97263692328eea4af106cristy% 60014c08aed51c5899665ade97263692328eea4af106cristy% See http://www.imagemagick.org/Usage/bugs/fuzz_distance/ 60024c08aed51c5899665ade97263692328eea4af106cristy% 60034c08aed51c5899665ade97263692328eea4af106cristy% Hue colorspace distances need more work. Hue is not a distance, it is an 60044c08aed51c5899665ade97263692328eea4af106cristy% angle! 60054c08aed51c5899665ade97263692328eea4af106cristy% 60064c08aed51c5899665ade97263692328eea4af106cristy% A check that q is in the same color space as p should be made and the 60074c08aed51c5899665ade97263692328eea4af106cristy% appropriate mapping made. -- Anthony Thyssen 8 December 2010 60084c08aed51c5899665ade97263692328eea4af106cristy% 60094c08aed51c5899665ade97263692328eea4af106cristy% The format of the IsFuzzyEquivalencePixelInfo method is: 60104c08aed51c5899665ade97263692328eea4af106cristy% 60114c08aed51c5899665ade97263692328eea4af106cristy% MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p, 60124c08aed51c5899665ade97263692328eea4af106cristy% const PixelInfo *q) 60134c08aed51c5899665ade97263692328eea4af106cristy% 60144c08aed51c5899665ade97263692328eea4af106cristy% A description of each parameter follows: 60154c08aed51c5899665ade97263692328eea4af106cristy% 60164c08aed51c5899665ade97263692328eea4af106cristy% o p: Pixel p. 60174c08aed51c5899665ade97263692328eea4af106cristy% 60184c08aed51c5899665ade97263692328eea4af106cristy% o q: Pixel q. 60194c08aed51c5899665ade97263692328eea4af106cristy% 60204c08aed51c5899665ade97263692328eea4af106cristy*/ 60214c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p, 60224c08aed51c5899665ade97263692328eea4af106cristy const PixelInfo *q) 60234c08aed51c5899665ade97263692328eea4af106cristy{ 6024a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy double 60254c08aed51c5899665ade97263692328eea4af106cristy fuzz, 60264c08aed51c5899665ade97263692328eea4af106cristy pixel; 60274c08aed51c5899665ade97263692328eea4af106cristy 6028a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy register double 60294c08aed51c5899665ade97263692328eea4af106cristy scale, 60304c08aed51c5899665ade97263692328eea4af106cristy distance; 60314c08aed51c5899665ade97263692328eea4af106cristy 60324c08aed51c5899665ade97263692328eea4af106cristy if ((p->fuzz == 0.0) && (q->fuzz == 0.0)) 60334c08aed51c5899665ade97263692328eea4af106cristy return(IsPixelInfoEquivalent(p,q)); 6034043a981a1f6b2393520e911594ce29ef5b060ee5cristy fuzz=(double) MagickMax(MagickMax(p->fuzz,q->fuzz),(MagickRealType) 6035043a981a1f6b2393520e911594ce29ef5b060ee5cristy MagickSQ1_2); 6036043a981a1f6b2393520e911594ce29ef5b060ee5cristy fuzz*=fuzz; 60374c08aed51c5899665ade97263692328eea4af106cristy scale=1.0; 60384c08aed51c5899665ade97263692328eea4af106cristy distance=0.0; 603917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if ((p->alpha_trait != UndefinedPixelTrait) || 604017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy (q->alpha_trait != UndefinedPixelTrait)) 60414c08aed51c5899665ade97263692328eea4af106cristy { 60424c08aed51c5899665ade97263692328eea4af106cristy /* 60434c08aed51c5899665ade97263692328eea4af106cristy Transparencies are involved - set alpha distance. 60444c08aed51c5899665ade97263692328eea4af106cristy */ 604517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy pixel=(p->alpha_trait != UndefinedPixelTrait ? p->alpha : OpaqueAlpha)- 604617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy (q->alpha_trait != UndefinedPixelTrait ? q->alpha : OpaqueAlpha); 60474c08aed51c5899665ade97263692328eea4af106cristy distance=pixel*pixel; 60484c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 60494c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 60504c08aed51c5899665ade97263692328eea4af106cristy /* 60514c08aed51c5899665ade97263692328eea4af106cristy Generate a alpha scaling factor to generate a 4D cone on colorspace. 60525f95f4f77efc46ff53593d750491c8f60698c983cristy If one color is transparent, distance has no color component. 60534c08aed51c5899665ade97263692328eea4af106cristy */ 605417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (p->alpha_trait != UndefinedPixelTrait) 60554c08aed51c5899665ade97263692328eea4af106cristy scale=(QuantumScale*p->alpha); 605617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (q->alpha_trait != UndefinedPixelTrait) 60574c08aed51c5899665ade97263692328eea4af106cristy scale*=(QuantumScale*q->alpha); 60584c08aed51c5899665ade97263692328eea4af106cristy if (scale <= MagickEpsilon ) 60594c08aed51c5899665ade97263692328eea4af106cristy return(MagickTrue); 60604c08aed51c5899665ade97263692328eea4af106cristy } 60614c08aed51c5899665ade97263692328eea4af106cristy /* 60624c08aed51c5899665ade97263692328eea4af106cristy CMYK create a CMY cube with a multi-dimensional cone toward black. 60634c08aed51c5899665ade97263692328eea4af106cristy */ 60644c08aed51c5899665ade97263692328eea4af106cristy if (p->colorspace == CMYKColorspace) 60654c08aed51c5899665ade97263692328eea4af106cristy { 60664c08aed51c5899665ade97263692328eea4af106cristy pixel=p->black-q->black; 60674c08aed51c5899665ade97263692328eea4af106cristy distance+=pixel*pixel*scale; 60684c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 60694c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 6070a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy scale*=(double) (QuantumScale*(QuantumRange-p->black)); 6071a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy scale*=(double) (QuantumScale*(QuantumRange-q->black)); 60724c08aed51c5899665ade97263692328eea4af106cristy } 60734c08aed51c5899665ade97263692328eea4af106cristy /* 60744c08aed51c5899665ade97263692328eea4af106cristy RGB or CMY color cube. 60754c08aed51c5899665ade97263692328eea4af106cristy */ 60764c08aed51c5899665ade97263692328eea4af106cristy distance*=3.0; /* rescale appropriately */ 60774c08aed51c5899665ade97263692328eea4af106cristy fuzz*=3.0; 60784c08aed51c5899665ade97263692328eea4af106cristy pixel=p->red-q->red; 60794c08aed51c5899665ade97263692328eea4af106cristy if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) || 60804c08aed51c5899665ade97263692328eea4af106cristy (p->colorspace == HWBColorspace)) 60814c08aed51c5899665ade97263692328eea4af106cristy { 60825f95f4f77efc46ff53593d750491c8f60698c983cristy /* 608358ee5018960b42b80b54398eacabe9ae5da89149cristy This calculates a arc distance for hue-- it should be a vector 608458ee5018960b42b80b54398eacabe9ae5da89149cristy angle of 'S'/'W' length with 'L'/'B' forming appropriate cones. 608558ee5018960b42b80b54398eacabe9ae5da89149cristy In other words this is a hack - Anthony. 60864c08aed51c5899665ade97263692328eea4af106cristy */ 60874c08aed51c5899665ade97263692328eea4af106cristy if (fabs((double) pixel) > (QuantumRange/2)) 60884c08aed51c5899665ade97263692328eea4af106cristy pixel-=QuantumRange; 60894c08aed51c5899665ade97263692328eea4af106cristy pixel*=2; 60904c08aed51c5899665ade97263692328eea4af106cristy } 60914c08aed51c5899665ade97263692328eea4af106cristy distance+=pixel*pixel*scale; 60924c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 60934c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 60944c08aed51c5899665ade97263692328eea4af106cristy pixel=p->green-q->green; 60954c08aed51c5899665ade97263692328eea4af106cristy distance+=pixel*pixel*scale; 60964c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 60974c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 60984c08aed51c5899665ade97263692328eea4af106cristy pixel=p->blue-q->blue; 60994c08aed51c5899665ade97263692328eea4af106cristy distance+=pixel*pixel*scale; 61004c08aed51c5899665ade97263692328eea4af106cristy if (distance > fuzz) 61014c08aed51c5899665ade97263692328eea4af106cristy return(MagickFalse); 61024c08aed51c5899665ade97263692328eea4af106cristy return(MagickTrue); 61034c08aed51c5899665ade97263692328eea4af106cristy} 61042b9582a27910c7baaeb04b7e969638328fa70095cristy 61052b9582a27910c7baaeb04b7e969638328fa70095cristy/* 61062b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 61072b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61082b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61092b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61107ae1654e7582dc87637de6302875d81607393efacristy% S e t P i x e l C h a n n e l M a s k % 61112b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61122b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61132b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61142b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 61152b9582a27910c7baaeb04b7e969638328fa70095cristy% 61167ae1654e7582dc87637de6302875d81607393efacristy% SetPixelChannelMask() sets the pixel channel map from the specified channel 61177ae1654e7582dc87637de6302875d81607393efacristy% mask. 61182b9582a27910c7baaeb04b7e969638328fa70095cristy% 6119cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy% The format of the SetPixelChannelMask method is: 61202b9582a27910c7baaeb04b7e969638328fa70095cristy% 6121cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy% void SetPixelChannelMask(Image *image,const ChannelType channel_mask) 61222b9582a27910c7baaeb04b7e969638328fa70095cristy% 61232b9582a27910c7baaeb04b7e969638328fa70095cristy% A description of each parameter follows: 61242b9582a27910c7baaeb04b7e969638328fa70095cristy% 61252b9582a27910c7baaeb04b7e969638328fa70095cristy% o image: the image. 61262b9582a27910c7baaeb04b7e969638328fa70095cristy% 6127dfdb19ea2c08296b31fef860352c0a6efe8e9cc6cristy% o channel_mask: the channel mask. 61282b9582a27910c7baaeb04b7e969638328fa70095cristy% 61292b9582a27910c7baaeb04b7e969638328fa70095cristy*/ 6130cf1296eb467f83fd2106e51d2689ac0afc863ef8cristyMagickExport void SetPixelChannelMask(Image *image, 613107a6785ad974f0631a83731fe5d7fb85751ca235cristy const ChannelType channel_mask) 61322b9582a27910c7baaeb04b7e969638328fa70095cristy{ 61336a917d6c8b1695012e26389d2ec303267676815fcristy#define GetChannelBit(mask,bit) (((size_t) (mask) >> (size_t) (bit)) & 0x01) 6134dafd287faca4c8cd5415d13185973add9c02b2c4cristy 61352b9582a27910c7baaeb04b7e969638328fa70095cristy register ssize_t 61362b9582a27910c7baaeb04b7e969638328fa70095cristy i; 61372b9582a27910c7baaeb04b7e969638328fa70095cristy 6138177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy if (image->debug != MagickFalse) 6139f30396d9ccce929573b0e23698b43c55e415bf46cristy (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%08x]", 6140f30396d9ccce929573b0e23698b43c55e415bf46cristy image->filename,channel_mask); 61413c30981743f8543ca2ccc0d19de8fbda2b3639c6cristy image->channel_mask=channel_mask; 6142dafd287faca4c8cd5415d13185973add9c02b2c4cristy for (i=0; i < (ssize_t) GetPixelChannels(image); i++) 6143e2a912b6c9086c98ec838baa0824cd8deca55538cristy { 61445a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy PixelChannel channel=GetPixelChannelChannel(image,i); 614517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (GetChannelBit(channel_mask,channel) == 0) 614617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy { 614717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy SetPixelChannelTraits(image,channel,CopyPixelTrait); 614817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy continue; 614917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy } 615062cc94b542ffdb41cd62778530873f8babafb2b7cristy if (channel == AlphaPixelChannel) 615117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy { 615217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if ((image->alpha_trait & CopyPixelTrait) != 0) 615317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy { 615417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy SetPixelChannelTraits(image,channel,CopyPixelTrait); 615517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy continue; 615617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy } 615717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy SetPixelChannelTraits(image,channel,UpdatePixelTrait); 615817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy continue; 615917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy } 616017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 616117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy { 61623bdd925dbb0804df99e548c50667670319655816cristy SetPixelChannelTraits(image,channel,(const PixelTrait) 61633bdd925dbb0804df99e548c50667670319655816cristy (UpdatePixelTrait | BlendPixelTrait)); 616417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy continue; 616517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy } 616617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy SetPixelChannelTraits(image,channel,UpdatePixelTrait); 6167e2a912b6c9086c98ec838baa0824cd8deca55538cristy } 61681685e7216ce4e5fac701834cd7db6eee6d426234cristy if (image->storage_class == PseudoClass) 6169297e3a450d4b95328fa0667d4910881e9787e608cristy SetPixelChannelTraits(image,IndexPixelChannel,CopyPixelTrait); 6170883fde11debec15cedb05dc5d7228d8588066bc0cristy if (image->read_mask != MagickFalse) 6171883fde11debec15cedb05dc5d7228d8588066bc0cristy SetPixelChannelTraits(image,ReadMaskPixelChannel,CopyPixelTrait); 6172883fde11debec15cedb05dc5d7228d8588066bc0cristy if (image->write_mask != MagickFalse) 6173883fde11debec15cedb05dc5d7228d8588066bc0cristy SetPixelChannelTraits(image,WriteMaskPixelChannel,CopyPixelTrait); 61746dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy if (image->debug != MagickFalse) 61756dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy LogPixelChannels(image); 61762b9582a27910c7baaeb04b7e969638328fa70095cristy} 61772b9582a27910c7baaeb04b7e969638328fa70095cristy 61782b9582a27910c7baaeb04b7e969638328fa70095cristy/* 61792b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 61802b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61812b9582a27910c7baaeb04b7e969638328fa70095cristy% % 61822b9582a27910c7baaeb04b7e969638328fa70095cristy% % 6183322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% S e t P i x e l M e t a C h a n n e l s % 6184322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% % 6185322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% % 6186322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% % 6187322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6188322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6189322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% SetPixelMetaChannels() sets the image meta channels. 6190322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6191322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% The format of the SetPixelMetaChannels method is: 6192322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6193322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% MagickBooleanType SetPixelMetaChannels(Image *image, 6194322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% const size_t number_meta_channels,ExceptionInfo *exception) 6195322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6196322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% A description of each parameter follows: 6197322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6198322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% o image: the image. 6199322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6200322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% o number_meta_channels: the number of meta channels. 6201322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6202322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% o exception: return any errors or warnings in this structure. 6203322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy% 6204322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy*/ 6205322d07da43d795a7c3b9a2d068d9a9005591cbe4cristyMagickExport MagickBooleanType SetPixelMetaChannels(Image *image, 6206322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy const size_t number_meta_channels,ExceptionInfo *exception) 6207322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy{ 6208322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy image->number_meta_channels=number_meta_channels; 6209322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy return(SyncImagePixelCache(image,exception)); 6210322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy} 6211