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