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%                                                                             %
197ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 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"
59b93e6eb0e33b330e1d6be8b4ad79d28cfd3a9b84dirk#include "MagickCore/memory-private.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h"
624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
64380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy#include "MagickCore/pixel-private.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum.h"
664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h"
684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h"
694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/statistic.h"
704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/stream.h"
714c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
724c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/transform.h"
734c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
744c08aed51c5899665ade97263692328eea4af106cristy
75146a62b25d7466cceec79975894ce812e11f4625cristy/*
764c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
774c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
784c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
794c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
80ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   A c q u i r e P i x e l C h a n n e l M a p                               %
814c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
824c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
834c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
844c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
854c08aed51c5899665ade97263692328eea4af106cristy%
86ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  AcquirePixelChannelMap() acquires a pixel component map.
874c08aed51c5899665ade97263692328eea4af106cristy%
88ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the AcquirePixelChannelMap() method is:
894c08aed51c5899665ade97263692328eea4af106cristy%
90bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *AcquirePixelChannelMap(void)
914c08aed51c5899665ade97263692328eea4af106cristy%
924c08aed51c5899665ade97263692328eea4af106cristy*/
93bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *AcquirePixelChannelMap(void)
944c08aed51c5899665ade97263692328eea4af106cristy{
95ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  PixelChannelMap
96bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    *channel_map;
974c08aed51c5899665ade97263692328eea4af106cristy
984c08aed51c5899665ade97263692328eea4af106cristy  register ssize_t
994c08aed51c5899665ade97263692328eea4af106cristy    i;
1004c08aed51c5899665ade97263692328eea4af106cristy
101bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels,
102bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    sizeof(*channel_map));
103bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (channel_map == (PixelChannelMap *) NULL)
1044c08aed51c5899665ade97263692328eea4af106cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
105bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map));
106bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  for (i=0; i < MaxPixelChannels; i++)
107bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    channel_map[i].channel=(PixelChannel) i;
108ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  return(channel_map);
1094c08aed51c5899665ade97263692328eea4af106cristy}
1104c08aed51c5899665ade97263692328eea4af106cristy
1114c08aed51c5899665ade97263692328eea4af106cristy/*
1124c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1134c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1144c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1154c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
116ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   C l o n e P i x e l C h a n n e l M a p                                   %
1174c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1184c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1194c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1204c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1214c08aed51c5899665ade97263692328eea4af106cristy%
122ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  ClonePixelChannelMap() clones a pixel component map.
1234c08aed51c5899665ade97263692328eea4af106cristy%
124ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the ClonePixelChannelMap() method is:
1254c08aed51c5899665ade97263692328eea4af106cristy%
126bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
1274c08aed51c5899665ade97263692328eea4af106cristy%
1284c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
1294c08aed51c5899665ade97263692328eea4af106cristy%
130ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%    o channel_map: the pixel component map.
1314c08aed51c5899665ade97263692328eea4af106cristy%
1324c08aed51c5899665ade97263692328eea4af106cristy*/
133bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
1344c08aed51c5899665ade97263692328eea4af106cristy{
135ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  PixelChannelMap
136bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    *clone_map;
1374c08aed51c5899665ade97263692328eea4af106cristy
138bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  assert(channel_map != (PixelChannelMap *) NULL);
139ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  clone_map=AcquirePixelChannelMap();
140bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (clone_map == (PixelChannelMap *) NULL)
141bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    return((PixelChannelMap *) NULL);
142bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels*
143bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    sizeof(*channel_map));
1444c08aed51c5899665ade97263692328eea4af106cristy  return(clone_map);
1454c08aed51c5899665ade97263692328eea4af106cristy}
1464c08aed51c5899665ade97263692328eea4af106cristy
1474c08aed51c5899665ade97263692328eea4af106cristy/*
1484c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1494c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1504c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1514c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1524c08aed51c5899665ade97263692328eea4af106cristy+   C l o n e P i x e l I n f o                                               %
1534c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1544c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1554c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1564c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1574c08aed51c5899665ade97263692328eea4af106cristy%
1584c08aed51c5899665ade97263692328eea4af106cristy%  ClonePixelInfo() makes a duplicate of the given pixel info structure, or if
1594c08aed51c5899665ade97263692328eea4af106cristy%  pixel info is NULL, a new one.
1604c08aed51c5899665ade97263692328eea4af106cristy%
1614c08aed51c5899665ade97263692328eea4af106cristy%  The format of the ClonePixelInfo method is:
1624c08aed51c5899665ade97263692328eea4af106cristy%
1631f07555d1773dac3acebfce4ba017128246923c2cristy%      PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
1644c08aed51c5899665ade97263692328eea4af106cristy%
1654c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
1664c08aed51c5899665ade97263692328eea4af106cristy%
1671f07555d1773dac3acebfce4ba017128246923c2cristy%    o pixel: the pixel info.
1684c08aed51c5899665ade97263692328eea4af106cristy%
1694c08aed51c5899665ade97263692328eea4af106cristy*/
1704c08aed51c5899665ade97263692328eea4af106cristyMagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
1714c08aed51c5899665ade97263692328eea4af106cristy{
1724c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
1734c08aed51c5899665ade97263692328eea4af106cristy    *pixel_info;
1744c08aed51c5899665ade97263692328eea4af106cristy
175b93e6eb0e33b330e1d6be8b4ad79d28cfd3a9b84dirk  pixel_info=(PixelInfo *) MagickAssumeAligned(AcquireAlignedMemory(1,
176b93e6eb0e33b330e1d6be8b4ad79d28cfd3a9b84dirk    sizeof(*pixel_info)));
1774c08aed51c5899665ade97263692328eea4af106cristy  if (pixel_info == (PixelInfo *) NULL)
1784c08aed51c5899665ade97263692328eea4af106cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1794c08aed51c5899665ade97263692328eea4af106cristy  *pixel_info=(*pixel);
1804c08aed51c5899665ade97263692328eea4af106cristy  return(pixel_info);
1814c08aed51c5899665ade97263692328eea4af106cristy}
1824c08aed51c5899665ade97263692328eea4af106cristy
1834c08aed51c5899665ade97263692328eea4af106cristy/*
1844c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1854c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1864c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1874c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1881f07555d1773dac3acebfce4ba017128246923c2cristy+   C o n f o r m P i x e l I n f o                                           %
1891f07555d1773dac3acebfce4ba017128246923c2cristy%                                                                             %
1901f07555d1773dac3acebfce4ba017128246923c2cristy%                                                                             %
1911f07555d1773dac3acebfce4ba017128246923c2cristy%                                                                             %
1921f07555d1773dac3acebfce4ba017128246923c2cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1931f07555d1773dac3acebfce4ba017128246923c2cristy%
1941f07555d1773dac3acebfce4ba017128246923c2cristy%  ConformPixelInfo() ensures the pixel conforms with the colorspace and alpha
1951f07555d1773dac3acebfce4ba017128246923c2cristy%  attribute of the image.
1961f07555d1773dac3acebfce4ba017128246923c2cristy%
1971f07555d1773dac3acebfce4ba017128246923c2cristy%  The format of the ConformPixelInfo method is:
1981f07555d1773dac3acebfce4ba017128246923c2cristy%
19941029e100025ab869690dab8e564c8ee30d0120ccristy%      void *ConformPixelInfo((Image *image,const PixelInfo *source,
20041029e100025ab869690dab8e564c8ee30d0120ccristy%        PixelInfo *destination,ExceptionInfo *exception)
2011f07555d1773dac3acebfce4ba017128246923c2cristy%
2021f07555d1773dac3acebfce4ba017128246923c2cristy%  A description of each parameter follows:
2031f07555d1773dac3acebfce4ba017128246923c2cristy%
2041f07555d1773dac3acebfce4ba017128246923c2cristy%    o image: the image.
2051f07555d1773dac3acebfce4ba017128246923c2cristy%
206bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk%    o source: the source pixel info.
207bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk%
208bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk%    o destination: the destination pixel info.
209bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk%
2101f07555d1773dac3acebfce4ba017128246923c2cristy%    o exception: return any errors or warnings in this structure.
2111f07555d1773dac3acebfce4ba017128246923c2cristy%
2121f07555d1773dac3acebfce4ba017128246923c2cristy*/
213bfdd5bc06830778f14dfa0659b389ff630b7fbfedirkMagickExport void ConformPixelInfo(Image *image,const PixelInfo *source,
214bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk  PixelInfo *destination,ExceptionInfo *exception)
2151f07555d1773dac3acebfce4ba017128246923c2cristy{
2161f07555d1773dac3acebfce4ba017128246923c2cristy  assert(image != (Image *) NULL);
217e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
218bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk  assert(destination != (const PixelInfo *) NULL);
219bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk  *destination=(*source);
2201f07555d1773dac3acebfce4ba017128246923c2cristy  if (image->colorspace == CMYKColorspace)
2211f07555d1773dac3acebfce4ba017128246923c2cristy    {
222bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk      if (IssRGBCompatibleColorspace(destination->colorspace))
223bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk        ConvertRGBToCMYK(destination);
2241f07555d1773dac3acebfce4ba017128246923c2cristy    }
2251f07555d1773dac3acebfce4ba017128246923c2cristy  else
226bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk    if (destination->colorspace == CMYKColorspace)
2271f07555d1773dac3acebfce4ba017128246923c2cristy      {
2281f07555d1773dac3acebfce4ba017128246923c2cristy        if (IssRGBCompatibleColorspace(image->colorspace))
229bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk          ConvertCMYKToRGB(destination);
2301f07555d1773dac3acebfce4ba017128246923c2cristy      }
231bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk  if ((IsPixelInfoGray(&image->background_color) == MagickFalse) &&
232bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk      (IsGrayColorspace(image->colorspace) != MagickFalse))
233bfdd5bc06830778f14dfa0659b389ff630b7fbfedirk    (void) TransformImageColorspace(image,sRGBColorspace,exception);
23417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy  if ((destination->alpha_trait != UndefinedPixelTrait) &&
23517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      (image->alpha_trait == UndefinedPixelTrait))
2361f07555d1773dac3acebfce4ba017128246923c2cristy    (void) SetImageAlpha(image,OpaqueAlpha,exception);
2371f07555d1773dac3acebfce4ba017128246923c2cristy}
2381f07555d1773dac3acebfce4ba017128246923c2cristy
2391f07555d1773dac3acebfce4ba017128246923c2cristy/*
2401f07555d1773dac3acebfce4ba017128246923c2cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2411f07555d1773dac3acebfce4ba017128246923c2cristy%                                                                             %
2421f07555d1773dac3acebfce4ba017128246923c2cristy%                                                                             %
2431f07555d1773dac3acebfce4ba017128246923c2cristy%                                                                             %
244c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%   D e c o d e P i x e l G a m m a                                           %
245c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
246c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
247c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
248c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
249c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
250c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  DecodePixelGamma() applies the expansive power-law nonlinearity to the pixel.
251c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
2523506059097340c6cdeff165058b5e18adfc89025cristy%  The format of the DecodePixelGamma method is:
253c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
254c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%      double DecodePixelGamma(const MagickRealType pixel)
255c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
256c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  A description of each parameter follows:
257c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
258c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%    o pixel: the pixel.
259c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
260c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy*/
261c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
262c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristystatic inline double DecodeGamma(const double x)
263c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy{
264c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  div_t
265c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    quotient;
266c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
267c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  double
268c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    p,
269c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    term[9];
270c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
271c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  int
272c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    exponent;
273c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
274c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double coefficient[] =  /* terms for x^(7/5), x=1.5 */
275c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
276c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.7917488588043277509,
277c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.82045614371976854984,
278c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.027694100686325412819,
279c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -0.00094244335181762134018,
280c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.000064355540911469709545,
281c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -5.7224404636060757485e-06,
282c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    5.8767669437311184313e-07,
283c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -6.6139920053589721168e-08,
284c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    7.9323242696227458163e-09
285c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
286c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
287c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double powers_of_two[] =  /* (2^x)^(7/5) */
288c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
289c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.0,
290c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    2.6390158215457883983,
291c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    6.9644045063689921093,
292c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.8379173679952558018e+01,
293c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    4.8502930128332728543e+01
294c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
295c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
296c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  /*
297c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    Compute x^2.4 == x*x^(7/5) == pow(x,2.4).
298c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  */
299c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[0]=1.0;
300c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[1]=4.0*frexp(x,&exponent)-3.0;
301c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[2]=2.0*term[1]*term[1]-term[0];
302c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[3]=2.0*term[1]*term[2]-term[1];
303c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[4]=2.0*term[1]*term[3]-term[2];
304c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[5]=2.0*term[1]*term[4]-term[3];
305c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[6]=2.0*term[1]*term[5]-term[4];
306c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[7]=2.0*term[1]*term[6]-term[5];
307c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[8]=2.0*term[1]*term[7]-term[6];
308c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  p=coefficient[0]*term[0]+coefficient[1]*term[1]+coefficient[2]*term[2]+
309c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[3]*term[3]+coefficient[4]*term[4]+coefficient[5]*term[5]+
310c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[6]*term[6]+coefficient[7]*term[7]+coefficient[8]*term[8];
311c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  quotient=div(exponent-1,5);
312c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  if (quotient.rem < 0)
313c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    {
314c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.quot-=1;
315c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.rem+=5;
316c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    }
317c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return(x*ldexp(powers_of_two[quotient.rem]*p,7*quotient.quot));
318c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy}
319c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
320c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristyMagickExport MagickRealType DecodePixelGamma(const MagickRealType pixel)
321c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy{
322c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy  if (pixel <= (0.0404482362771076*QuantumRange))
323c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy    return(pixel/12.92f);
324c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return((MagickRealType) (QuantumRange*DecodeGamma((double) (QuantumScale*
325c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    pixel+0.055)/1.055)));
326c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy}
327c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy
328c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy/*
329c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
330c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
331c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
332c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
333ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   D e s t r o y P i x e l C h a n n e l M a p                               %
3344c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
3354c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
3364c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
3374c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3384c08aed51c5899665ade97263692328eea4af106cristy%
339ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  DestroyPixelChannelMap() deallocates memory associated with the pixel
340ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  channel map.
3414c08aed51c5899665ade97263692328eea4af106cristy%
342ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the DestroyPixelChannelMap() method is:
3434c08aed51c5899665ade97263692328eea4af106cristy%
344bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *DestroyPixelChannelMap(PixelChannelMap *channel_map)
3454c08aed51c5899665ade97263692328eea4af106cristy%
3464c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
3474c08aed51c5899665ade97263692328eea4af106cristy%
348ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%    o channel_map: the pixel component map.
3494c08aed51c5899665ade97263692328eea4af106cristy%
3504c08aed51c5899665ade97263692328eea4af106cristy*/
351bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *DestroyPixelChannelMap(
352bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  PixelChannelMap *channel_map)
3534c08aed51c5899665ade97263692328eea4af106cristy{
354bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  assert(channel_map != (PixelChannelMap *) NULL);
355bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  channel_map=(PixelChannelMap *) RelinquishMagickMemory(channel_map);
356bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  return((PixelChannelMap *) RelinquishMagickMemory(channel_map));
3574c08aed51c5899665ade97263692328eea4af106cristy}
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
364c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy+   E n c o d e P i x e l G a m m a                                           %
365c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
366c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
367c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
368c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
369c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
370c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  EncodePixelGamma() cancels any nonlinearity in the pixel.
371c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
3723506059097340c6cdeff165058b5e18adfc89025cristy%  The format of the EncodePixelGamma method is:
373c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
374c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%      MagickRealType EncodePixelGamma(const double MagickRealType)
375c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
376c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  A description of each parameter follows:
377c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
378c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%    o pixel: the pixel.
379c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
380c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy*/
381c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
382c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristystatic inline double EncodeGamma(const double x)
383c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy{
384c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  div_t
385c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    quotient;
386c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
387c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  double
388c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    p,
389c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    term[9];
390c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
391c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  int
392c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    exponent;
393c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
394c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double coefficient[] =  /* Chebychevi poly: x^(5/12), x=1.5 */
395c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
396c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.1758200232996901923,
397c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.16665763094889061230,
398c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -0.0083154894939042125035,
399c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.00075187976780420279038,
400c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -0.000083240178519391795367,
401c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.000010229209410070008679,
402c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -1.3400466409860246e-06,
403c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.8333422241635376682e-07,
404c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -2.5878596761348859722e-08
405c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
406c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
407c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double powers_of_two[] =  /* (2^N)^(5/12) */
408c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
409c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.0,
410c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.3348398541700343678,
411c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.7817974362806785482,
412c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    2.3784142300054420538,
413c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    3.1748021039363991669,
414c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    4.2378523774371812394,
415c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    5.6568542494923805819,
416c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    7.5509945014535482244,
417c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.0079368399158985525e1,
418c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.3454342644059433809e1,
419c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.7959392772949968275e1,
420c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    2.3972913230026907883e1
421c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
422c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
423c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  /*
424c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    Compute x^(1/2.4) == x^(5/12) == pow(x,1.0/2.4).
425c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  */
426c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[0]=1.0;
427c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[1]=4.0*frexp(x,&exponent)-3.0;
428c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[2]=2.0*term[1]*term[1]-term[0];
429c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[3]=2.0*term[1]*term[2]-term[1];
430c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[4]=2.0*term[1]*term[3]-term[2];
431c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[5]=2.0*term[1]*term[4]-term[3];
432c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[6]=2.0*term[1]*term[5]-term[4];
433c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[7]=2.0*term[1]*term[6]-term[5];
434c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[8]=2.0*term[1]*term[7]-term[6];
435c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  p=coefficient[0]*term[0]+coefficient[1]*term[1]+coefficient[2]*term[2]+
436c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[3]*term[3]+coefficient[4]*term[4]+coefficient[5]*term[5]+
437c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[6]*term[6]+coefficient[7]*term[7]+coefficient[8]*term[8];
438c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  quotient=div(exponent-1,12);
439c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  if (quotient.rem < 0)
440c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    {
441c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.quot-=1;
442c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.rem+=12;
443c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    }
444c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return(ldexp(powers_of_two[quotient.rem]*p,5*quotient.quot));
445c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy}
446c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
447c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristyMagickExport MagickRealType EncodePixelGamma(const MagickRealType pixel)
448c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy{
449c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy  if (pixel <= (0.0031306684425005883*QuantumRange))
450c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy    return(12.92f*pixel);
451c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return((MagickRealType) QuantumRange*(1.055*EncodeGamma((double) QuantumScale*
4522a13aa6938f7e40986908f79a54a32958bf0fc81cristy    pixel)-0.055));
453c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy}
454c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy
455c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy/*
456c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
457c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
458c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
459c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E x p o r t I m a g e P i x e l s                                         %
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ExportImagePixels() extracts pixel data from an image and returns it to you.
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The method returns MagickTrue on success otherwise MagickFalse if an error is
468b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  encountered.  The data is returned as char, short int, Quantum, unsigned int,
469cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%  unsigned long long, float, or double in the order specified by map.
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Suppose you want to extract the first scanline of a 640x480 image as
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  character data in red-green-blue order:
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ExportImagePixels method is:
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
478cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%      MagickBooleanType ExportImagePixels(const Image *image,const ssize_t x,
479cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const ssize_t y,const size_t width,const size_t height,
480cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const char *map,const StorageType type,void *pixels,
48146f4be29828ab7588745336d46ab11611c847933cristy%        ExceptionInfo *exception)
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
487cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%    o x,y,width,height:  These values define the perimeter
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      of a region of pixels you want to extract.
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map:  This string reflects the expected ordering of the pixel array.
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      It can be any combination or order of R = red, G = green, B = blue,
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      P = pad.
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o type: Define the data type of the pixels.  Float and double types are
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
4986c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
499ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy%      LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
5006c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixels: This array of values contain the pixel components as defined by
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      map and type.  You must preallocate this array where the expected
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      length varies depending on the values of width, height, map, and type.
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
51039fee9a56b751a52fb8b73d39836d48bc80cb35fdirkstatic void ExportCharPixel(const Image *image,const RectangleInfo *roi,
51105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,void *pixels,
51246f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
51505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
517bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned char
52105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
52314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
52414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
52514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
5269d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
5279d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
5289d314ff2c17a77996c05413c2013880387e50f0ecristy
52946f4be29828ab7588745336d46ab11611c847933cristy  q=(unsigned char *) pixels;
530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
532cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
534cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
537cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
549cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
551cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
554cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
567cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
569cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
572cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar((Quantum) 0);
578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
585cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
587cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
590cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
59270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p)));
593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
600cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
602cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
605cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
617cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
619cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
622cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
635cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
637cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
640cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar((Quantum) 0);
646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
65114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
652cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
654cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
657cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
66214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelRed(image,p));
671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelGreen(image,p));
677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelBlue(image,p));
683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=ScaleQuantumToChar(GetPixelBlack(image,p));
699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
70370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p)));
704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
714e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
71639fee9a56b751a52fb8b73d39836d48bc80cb35fdirkstatic void ExportDoublePixel(const Image *image,const RectangleInfo *roi,
71705d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,void *pixels,
71846f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
72105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register double
72405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
72914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
73014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
73114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(double *) pixels;
736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
738cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
740cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
7414c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
743cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
748ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
755cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
757cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
760cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
773cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
775cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
7764c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
778cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
784ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
791cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
793cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
796cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelIntensity(image,p));
799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
806cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
808cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
811cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
823cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
825cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
828cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
841cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
843cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
8444c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
846cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
852ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
85714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
858cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
860cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
863cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
86814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelRed(image,p));
877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelGreen(image,p));
883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelBlue(image,p));
889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelAlpha(image,p));
894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelAlpha(image,p));
899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=(double) (QuantumScale*
905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy                GetPixelBlack(image,p));
906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelIntensity(image,p));
911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=0;
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
92339fee9a56b751a52fb8b73d39836d48bc80cb35fdirkstatic void ExportFloatPixel(const Image *image,const RectangleInfo *roi,
92405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,void *pixels,
92546f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
92805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register float
93105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
93614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
93714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
93814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(float *) pixels;
943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
945cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
947cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
9484c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
950cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
955ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
962cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
964cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
967cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
980cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
982cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
9834c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
985cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
991ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
998cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1000cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1003cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelIntensity(image,p));
1006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1013cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1015cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1018cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
1021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
1022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
1023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1030cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1032cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1035cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
1038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
1039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
1040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
1041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1048cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1050cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
10514c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1053cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
1056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
1057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
1058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
1059ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
106414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1065cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1067cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1070cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
107514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelRed(image,p));
1084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelGreen(image,p));
1090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelBlue(image,p));
1096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p))));
1101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1103e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelAlpha(image,p));
1106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1111e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=(float) (QuantumScale* GetPixelBlack(image,p));
1112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelIntensity(image,p));
1117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=0;
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
112939fee9a56b751a52fb8b73d39836d48bc80cb35fdirkstatic void ExportLongPixel(const Image *image,const RectangleInfo *roi,
113005d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,void *pixels,
113146f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1133e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
113405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
1135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned int
114005d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
1141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
114214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
114314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
114414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(unsigned int *) pixels;
1149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1151cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1153cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
11544c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1156cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
11586c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11596c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11606c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1161ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1166e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1168cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1170cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1173cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
11756c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11766c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11776c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
11786c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1186cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1188cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1191cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1192e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
11936c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11946c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11956c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
11966c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=0;
1197e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1199e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1202e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1203e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1204cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1206cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1207e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1209cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
121170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p)));
1212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1214e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1217e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1219cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1221cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1222e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1223e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1224cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1225e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
12266c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
12276c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
12286c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1229e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1230e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1233e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1236cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1238cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1241cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
12436c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
12446c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
12456c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
12466c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1248e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1249e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1250e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1252e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1253e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1254cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1256cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1257e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1258e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1259cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1260e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
12616c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
12626c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
12636c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
12646c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=0;
1265e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1266e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1267e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1268e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1269e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
127014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1271cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1273cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1276cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
128114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1284e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1286e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1287e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
12896c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelRed(image,p));
1290e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1292e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
12956c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelGreen(image,p));
1296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1297e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1298e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1300e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
13016c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelBlue(image,p));
1302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1305e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
13066c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1310e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
13116c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1315e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1316e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
13176c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy              *q=ScaleQuantumToLong(GetPixelBlack(image,p));
1318e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1320e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
132270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p)));
1323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
13266c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            break;
1327e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1333e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
133539fee9a56b751a52fb8b73d39836d48bc80cb35fdirkstatic void ExportLongLongPixel(const Image *image,const RectangleInfo *roi,
133605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,void *pixels,
133746f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
134005d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
1341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1344e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1345b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  register MagickSizeType
134605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
1347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
134814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
134914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
135014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1351e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1353e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1354b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  q=(MagickSizeType *) pixels;
1355e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1356e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1357cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1359cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1362cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1363e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1364b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1365b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1366b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1368e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1373e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1374cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1375e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1376cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1379cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1381b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1382b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1383b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1384b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1392cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1393e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1394cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1397cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1399b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1400b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1401b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1410cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1412cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1413e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1415cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
141731e75937db91fd53e7deb9e3544646d0459f2196cristy          *q++=ScaleQuantumToLongLong(ClampToQuantum(
141831e75937db91fd53e7deb9e3544646d0459f2196cristy            GetPixelIntensity(image,p)));
1419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1426cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1428cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1430e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1431cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1432e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1433b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1434b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1435b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1443cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1445cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1448cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1449e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1450b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1451b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1452b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1453b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1461cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1463cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1466cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1468b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1469b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1470b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1472e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
147714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1478cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1480cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1483cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
148814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1496b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelRed(image,p));
1497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1502b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1504e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1508b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1513b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1518b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1524b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy              *q=ScaleQuantumToLongLong(GetPixelBlack(image,p));
1525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1527e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
152958ee5018960b42b80b54398eacabe9ae5da89149cristy            *q=ScaleQuantumToLongLong(ClampToQuantum(
153058ee5018960b42b80b54398eacabe9ae5da89149cristy              GetPixelIntensity(image,p)));
1531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
154339fee9a56b751a52fb8b73d39836d48bc80cb35fdirkstatic void ExportQuantumPixel(const Image *image,const RectangleInfo *roi,
154405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,void *pixels,
154546f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
154805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
1549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
155105d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
1552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
155614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
155714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
155814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(Quantum *) pixels;
1563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1565cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1567cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1570cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1582cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1584cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1587cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1590e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) (GetPixelAlpha(image,p));
1593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1600cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1602cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1605cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) 0;
1611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1618cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1619e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1620cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1623cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
162570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ClampToQuantum(GetPixelIntensity(image,p));
1626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1633cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1635cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1638cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1650cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1652cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1655cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) (GetPixelAlpha(image,p));
1661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1668cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1670cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1673cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) 0;
1679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
168414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1685cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1687cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1690cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
169514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=(Quantum) 0;
1698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelRed(image,p);
1704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelGreen(image,p);
1710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1714e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelBlue(image,p);
1716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelAlpha(image,p);
1721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelAlpha(image,p);
1726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=GetPixelBlack(image,p);
1732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
173670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ClampToQuantum(GetPixelIntensity(image,p));
1737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(Quantum) 0;
1742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1749e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
175239fee9a56b751a52fb8b73d39836d48bc80cb35fdirkstatic void ExportShortPixel(const Image *image,const RectangleInfo *roi,
175305d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,void *pixels,
175446f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
175705d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
1758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned short
176305d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
1764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
176514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
176614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
176714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
176814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  ssize_t
176914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    y;
177014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(unsigned short *) pixels;
1772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1774cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1776cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1779cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1786e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1788e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1791cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1793cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1796cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1808e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1809cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1811cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1814cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1827cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1829cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1832cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
183470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p)));
1835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1842cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1844cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1847cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1859cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1861cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1864cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1877cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1879cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1882cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
189314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1894cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1896cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1899cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1900e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
190414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelRed(image,p));
1913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelGreen(image,p));
1919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelBlue(image,p));
1925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1936e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=ScaleQuantumToShort(GetPixelBlack(image,p));
1941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
194570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p)));
1946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
195839fee9a56b751a52fb8b73d39836d48bc80cb35fdirkMagickExport MagickBooleanType ExportImagePixels(const Image *image,const ssize_t x,
195958ee5018960b42b80b54398eacabe9ae5da89149cristy  const ssize_t y,const size_t width,const size_t height,const char *map,
196058ee5018960b42b80b54398eacabe9ae5da89149cristy  const StorageType type,void *pixels,ExceptionInfo *exception)
1961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  QuantumType
1963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *quantum_map;
1964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1965cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  RectangleInfo
1966cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    roi;
1967cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy
1968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    i;
1970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
197114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
197214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
197314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image != (Image *) NULL);
1975e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
1976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image->debug != MagickFalse)
1977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
197814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
197914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
1980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (quantum_map == (QuantumType *) NULL)
1981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      (void) ThrowMagickException(exception,GetMagickModule(),
1983efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy        ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
1984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return(MagickFalse);
1985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
198614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  for (i=0; i < (ssize_t) length; i++)
1987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    switch (map[i])
1989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'A':
1991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'a':
1992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=AlphaQuantum;
1994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'B':
1997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'b':
1998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlueQuantum;
2000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
2001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2002e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'C':
2003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'c':
2004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=CyanQuantum;
2006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
2007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2010efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
2011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
2012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'g':
2014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'G':
2015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=GreenQuantum;
2017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
2018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'I':
2020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'i':
2021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=IndexQuantum;
2023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
2024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'K':
2026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'k':
2027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlackQuantum;
2029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
2030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2033efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
2034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
2035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'M':
2037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'm':
2038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=MagentaQuantum;
2040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
2041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2044efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
2045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
2046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'o':
2048e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'O':
2049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=OpacityQuantum;
2051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
2052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'P':
2054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'p':
2055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=UndefinedQuantum;
2057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
2058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'R':
2060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'r':
2061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=RedQuantum;
2063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
2064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'Y':
2066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'y':
2067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=YellowQuantum;
2069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
2070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2073efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
2074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
2075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      default:
2077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
2080efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "UnrecognizedPixelMap","`%s'",map);
2081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
2082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
2085cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.width=width;
2086cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.height=height;
2087cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.x=x;
2088cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.y=y;
2089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  switch (type)
2090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case CharPixel:
2092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2093cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportCharPixel(image,&roi,map,quantum_map,pixels,exception);
2094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case DoublePixel:
2097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2098cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
2099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case FloatPixel:
2102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2103cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
2104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
21066c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongPixel:
2107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2108cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportLongPixel(image,&roi,map,quantum_map,pixels,exception);
2109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
21116c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongLongPixel:
2112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2113cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
2114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case QuantumPixel:
2117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2118cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
2119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case ShortPixel:
2122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2123cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportShortPixel(image,&roi,map,quantum_map,pixels,exception);
2124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    default:
2127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2129e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
2130efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy        "UnrecognizedPixelMap","`%s'",map);
21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  return(MagickTrue);
2136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/*
2139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%   G e t P i x e l I n f o                                                   %
2144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  GetPixelInfo() initializes the PixelInfo structure.
2150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  The format of the GetPixelInfo method is:
2152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2153e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      GetPixelInfo(const Image *image,PixelInfo *pixel)
2154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  A description of each parameter follows:
2156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2157a322a839a56b8d9fa40751b1906ce2a4780a24d6anthony%    o image: the image. (optional - may be NULL)
2158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o pixel: Specifies a pointer to a PixelInfo structure.
2160e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/
2162e5370944fabb7afa477ab1325d400731b1e5d5e8cristyMagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel)
2163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->storage_class=DirectClass;
21657020ae6594690c03a4f73784fd41a7131a5b22c6cristy  pixel->colorspace=sRGBColorspace;
21668a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  pixel->alpha_trait=UndefinedPixelTrait;
2167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->fuzz=0.0;
2168e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->depth=MAGICKCORE_QUANTUM_DEPTH;
2169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->red=0.0;
2170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->green=0.0;
2171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->blue=0.0;
2172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->black=0.0;
2173a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->alpha=(double) OpaqueAlpha;
2174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->index=0.0;
2175f2a82ee6e25411cb280db708ff26ab55cece1945cristy  pixel->count=0;
2176f2a82ee6e25411cb280db708ff26ab55cece1945cristy  pixel->fuzz=0.0;
2177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image == (const Image *) NULL)
2178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    return;
2179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->storage_class=image->storage_class;
2180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->colorspace=image->colorspace;
21818a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  pixel->alpha_trait=image->alpha_trait;
2182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->depth=image->depth;
2183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->fuzz=image->fuzz;
2184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2186e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/*
2187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
219111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%   G e t P i x e l I n d o I n t e n s i t y                                 %
219211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%                                                                             %
219311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%                                                                             %
219411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%                                                                             %
219511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
219611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
219711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%  GetPixelInfoIntensity() returns a single sample intensity value from the red,
219811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%  green, and blue components of a pixel based on the selected method:
219911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
220011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    Rec601Luma       0.298839R' + 0.586811G' + 0.114350B'
220111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    Rec601Luminance  0.298839R + 0.586811G + 0.114350B
220211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    Rec709Luma       0.212656R' + 0.715158G' + 0.072186B'
220311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    Rec709Luminance  0.212656R + 0.715158G + 0.072186B
220411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    Brightness       max(R', G', B')
220511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    Lightness        (min(R', G', B') + max(R', G', B')) / 2.0
220611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
220711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    MS               (R^2 + G^2 + B^2) / 3.0
220811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    RMS              sqrt((R^2 + G^2 + B^2) / 3.0
220911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    Average          (R + G + B') / 3.0
221011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
221111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%  The format of the GetPixelInfoIntensity method is:
221211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
221311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%      MagickRealType GetPixelInfoIntensity(const Image *image,
221411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%        const Quantum *pixel)
221511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
221611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%  A description of each parameter follows:
221711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
221811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    o image: the image.
221911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
222011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%    o pixel: Specifies a pointer to a Quantum structure.
222111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%
222211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy*/
222305d2ff7ebf21f659f5b11e45afb294e152f4330cdirkMagickExport MagickRealType GetPixelInfoIntensity(
222405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const Image *magick_restrict image,const PixelInfo *magick_restrict pixel)
222511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy{
222611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy  MagickRealType
222711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    blue,
222811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    green,
222911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    red,
223011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    intensity;
223111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy
223211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy  PixelIntensityMethod
223311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    method;
223411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy
223511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy  method=Rec709LumaPixelIntensityMethod;
2236fff909e8b194dd94c6394df004685c583fe6808bdirk  if (image != (const Image *) NULL)
223773323e7ac6bc2362b3e6ad1249b37b7f76fdd103Cristy    method=image->intensity;
223873323e7ac6bc2362b3e6ad1249b37b7f76fdd103Cristy  red=pixel->red;
223973323e7ac6bc2362b3e6ad1249b37b7f76fdd103Cristy  green=pixel->green;
224073323e7ac6bc2362b3e6ad1249b37b7f76fdd103Cristy  blue=pixel->blue;
224111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy  switch (method)
224211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy  {
224311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case AveragePixelIntensityMethod:
224411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
224511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=(red+green+blue)/3.0;
224611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
224711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
224811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case BrightnessPixelIntensityMethod:
224911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
225011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=MagickMax(MagickMax(red,green),blue);
225111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
225211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
225311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case LightnessPixelIntensityMethod:
225411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
225511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=(MagickMin(MagickMin(red,green),blue)+
225611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        MagickMax(MagickMax(red,green),blue))/2.0;
225711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
225811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
225911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case MSPixelIntensityMethod:
226011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
226111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=(MagickRealType) (((double) red*red+green*green+blue*blue)/
226211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        (3.0*QuantumRange));
226311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
226411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
226511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case Rec601LumaPixelIntensityMethod:
226611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
226711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      if (pixel->colorspace == RGBColorspace)
226811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        {
226911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          red=EncodePixelGamma(red);
227011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          green=EncodePixelGamma(green);
227111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          blue=EncodePixelGamma(blue);
227211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        }
227311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=0.298839*red+0.586811*green+0.114350*blue;
227411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
227511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
227611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case Rec601LuminancePixelIntensityMethod:
227711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
227811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      if (pixel->colorspace == sRGBColorspace)
227911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        {
228011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          red=DecodePixelGamma(red);
228111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          green=DecodePixelGamma(green);
228211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          blue=DecodePixelGamma(blue);
228311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        }
228411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=0.298839*red+0.586811*green+0.114350*blue;
228511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
228611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
228711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case Rec709LumaPixelIntensityMethod:
228811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    default:
228911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
229011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      if (pixel->colorspace == RGBColorspace)
229111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        {
229211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          red=EncodePixelGamma(red);
229311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          green=EncodePixelGamma(green);
229411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          blue=EncodePixelGamma(blue);
229511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        }
229611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=0.212656*red+0.715158*green+0.072186*blue;
229711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
229811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
229911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case Rec709LuminancePixelIntensityMethod:
230011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
230111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      if (pixel->colorspace == sRGBColorspace)
230211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        {
230311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          red=DecodePixelGamma(red);
230411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          green=DecodePixelGamma(green);
230511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy          blue=DecodePixelGamma(blue);
230611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        }
230711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=0.212656*red+0.715158*green+0.072186*blue;
230811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
230911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
231011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    case RMSPixelIntensityMethod:
231111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    {
231211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      intensity=(MagickRealType) (sqrt((double) red*red+green*green+blue*blue)/
231311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy        sqrt(3.0));
231411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      break;
231511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy    }
231611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy  }
231711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy  return(intensity);
231811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy}
231911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy
232011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy/*
232111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
232211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%                                                                             %
232311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%                                                                             %
232411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy%                                                                             %
23259731df786aef53bf0482896bcdf9af7011880042cristy%   G e t P i x e l I n t e n s i t y                                         %
23269731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
23279731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
23289731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
23299731df786aef53bf0482896bcdf9af7011880042cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
23309731df786aef53bf0482896bcdf9af7011880042cristy%
23310c5c889633982c1b29bfaacf17092343544d6c8bcristy%  GetPixelIntensity() returns a single sample intensity value from the red,
233270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy%  green, and blue components of a pixel based on the selected method:
233370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy%
23342cf5d375fa7abe962164b39a35948fe76b4d239acristy%    Rec601Luma       0.298839R' + 0.586811G' + 0.114350B'
23352cf5d375fa7abe962164b39a35948fe76b4d239acristy%    Rec601Luminance  0.298839R + 0.586811G + 0.114350B
23361352acf3bec61a13875a2d020306ad6339686040cristy%    Rec709Luma       0.212656R' + 0.715158G' + 0.072186B'
23371352acf3bec61a13875a2d020306ad6339686040cristy%    Rec709Luminance  0.212656R + 0.715158G + 0.072186B
233809bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    Brightness       max(R', G', B')
233909bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    Lightness        (min(R', G', B') + max(R', G', B')) / 2.0
234062cc94b542ffdb41cd62778530873f8babafb2b7cristy%
234109bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    MS               (R^2 + G^2 + B^2) / 3.0
234209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    RMS              sqrt((R^2 + G^2 + B^2) / 3.0
234309bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    Average          (R + G + B') / 3.0
23449731df786aef53bf0482896bcdf9af7011880042cristy%
23459731df786aef53bf0482896bcdf9af7011880042cristy%  The format of the GetPixelIntensity method is:
23469731df786aef53bf0482896bcdf9af7011880042cristy%
23472cf5d375fa7abe962164b39a35948fe76b4d239acristy%      MagickRealType GetPixelIntensity(const Image *image,
23482cf5d375fa7abe962164b39a35948fe76b4d239acristy%        const Quantum *pixel)
23499731df786aef53bf0482896bcdf9af7011880042cristy%
23509731df786aef53bf0482896bcdf9af7011880042cristy%  A description of each parameter follows:
23519731df786aef53bf0482896bcdf9af7011880042cristy%
23529731df786aef53bf0482896bcdf9af7011880042cristy%    o image: the image.
23539731df786aef53bf0482896bcdf9af7011880042cristy%
23549731df786aef53bf0482896bcdf9af7011880042cristy%    o pixel: Specifies a pointer to a Quantum structure.
23559731df786aef53bf0482896bcdf9af7011880042cristy%
23569731df786aef53bf0482896bcdf9af7011880042cristy*/
235705d2ff7ebf21f659f5b11e45afb294e152f4330cdirkMagickExport MagickRealType GetPixelIntensity(const Image *magick_restrict image,
235805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const Quantum *magick_restrict pixel)
23599731df786aef53bf0482896bcdf9af7011880042cristy{
23609731df786aef53bf0482896bcdf9af7011880042cristy  MagickRealType
23619731df786aef53bf0482896bcdf9af7011880042cristy    blue,
23629731df786aef53bf0482896bcdf9af7011880042cristy    green,
236370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    red,
236470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    intensity;
23659731df786aef53bf0482896bcdf9af7011880042cristy
236673323e7ac6bc2362b3e6ad1249b37b7f76fdd103Cristy  red=GetPixelRed(image,pixel);
236773323e7ac6bc2362b3e6ad1249b37b7f76fdd103Cristy  green=GetPixelGreen(image,pixel);
236873323e7ac6bc2362b3e6ad1249b37b7f76fdd103Cristy  blue=GetPixelBlue(image,pixel);
236970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  switch (image->intensity)
237070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  {
2371bf02d73b29c613944ea22e2acc8b830aa4700871cristy    case AveragePixelIntensityMethod:
2372bf02d73b29c613944ea22e2acc8b830aa4700871cristy    {
2373bf02d73b29c613944ea22e2acc8b830aa4700871cristy      intensity=(red+green+blue)/3.0;
2374bf02d73b29c613944ea22e2acc8b830aa4700871cristy      break;
2375bf02d73b29c613944ea22e2acc8b830aa4700871cristy    }
2376bf02d73b29c613944ea22e2acc8b830aa4700871cristy    case BrightnessPixelIntensityMethod:
2377bf02d73b29c613944ea22e2acc8b830aa4700871cristy    {
2378bf02d73b29c613944ea22e2acc8b830aa4700871cristy      intensity=MagickMax(MagickMax(red,green),blue);
2379bf02d73b29c613944ea22e2acc8b830aa4700871cristy      break;
2380bf02d73b29c613944ea22e2acc8b830aa4700871cristy    }
2381bf02d73b29c613944ea22e2acc8b830aa4700871cristy    case LightnessPixelIntensityMethod:
2382bf02d73b29c613944ea22e2acc8b830aa4700871cristy    {
238309bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy      intensity=(MagickMin(MagickMin(red,green),blue)+
2384ce326724341c443b3c813774b0cc3b4ce4b425cbcristy        MagickMax(MagickMax(red,green),blue))/2.0;
2385bf02d73b29c613944ea22e2acc8b830aa4700871cristy      break;
2386bf02d73b29c613944ea22e2acc8b830aa4700871cristy    }
2387462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy    case MSPixelIntensityMethod:
2388462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy    {
2389462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy      intensity=(MagickRealType) (((double) red*red+green*green+blue*blue)/
2390462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy        (3.0*QuantumRange));
2391462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy      break;
2392462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy    }
239370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    case Rec601LumaPixelIntensityMethod:
239470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    {
239509bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy      if (image->colorspace == RGBColorspace)
239609bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        {
239709bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          red=EncodePixelGamma(red);
239809bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          green=EncodePixelGamma(green);
239909bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          blue=EncodePixelGamma(blue);
240009bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        }
24019e2436a78bdabef900e018dc77c0cc497bf6fbafcristy      intensity=0.298839*red+0.586811*green+0.114350*blue;
24022cf5d375fa7abe962164b39a35948fe76b4d239acristy      break;
24032cf5d375fa7abe962164b39a35948fe76b4d239acristy    }
24042cf5d375fa7abe962164b39a35948fe76b4d239acristy    case Rec601LuminancePixelIntensityMethod:
24052cf5d375fa7abe962164b39a35948fe76b4d239acristy    {
240670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      if (image->colorspace == sRGBColorspace)
240770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        {
240870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          red=DecodePixelGamma(red);
240970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          green=DecodePixelGamma(green);
241070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          blue=DecodePixelGamma(blue);
241170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        }
24129e2436a78bdabef900e018dc77c0cc497bf6fbafcristy      intensity=0.298839*red+0.586811*green+0.114350*blue;
241370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      break;
241470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    }
241570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    case Rec709LumaPixelIntensityMethod:
2416c94210c7c054e663026a776edfa1e2d6b79a00a5cristy    default:
241770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    {
241809bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy      if (image->colorspace == RGBColorspace)
241909bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        {
242009bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          red=EncodePixelGamma(red);
242109bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          green=EncodePixelGamma(green);
242209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          blue=EncodePixelGamma(blue);
242309bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        }
24241352acf3bec61a13875a2d020306ad6339686040cristy      intensity=0.212656*red+0.715158*green+0.072186*blue;
24252cf5d375fa7abe962164b39a35948fe76b4d239acristy      break;
24262cf5d375fa7abe962164b39a35948fe76b4d239acristy    }
24272cf5d375fa7abe962164b39a35948fe76b4d239acristy    case Rec709LuminancePixelIntensityMethod:
24282cf5d375fa7abe962164b39a35948fe76b4d239acristy    {
242970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      if (image->colorspace == sRGBColorspace)
243070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        {
243170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          red=DecodePixelGamma(red);
243270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          green=DecodePixelGamma(green);
243370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          blue=DecodePixelGamma(blue);
243470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        }
24351352acf3bec61a13875a2d020306ad6339686040cristy      intensity=0.212656*red+0.715158*green+0.072186*blue;
243670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      break;
243770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    }
243870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    case RMSPixelIntensityMethod:
243970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    {
2440462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy      intensity=(MagickRealType) (sqrt((double) red*red+green*green+blue*blue)/
2441462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy        sqrt(3.0));
244270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      break;
244370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    }
244470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  }
244570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  return(intensity);
24469731df786aef53bf0482896bcdf9af7011880042cristy}
24479731df786aef53bf0482896bcdf9af7011880042cristy
24489731df786aef53bf0482896bcdf9af7011880042cristy/*
24499731df786aef53bf0482896bcdf9af7011880042cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
24509731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
24519731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
24529731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
2453e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%   I m p o r t I m a g e P i x e l s                                         %
2454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  ImportImagePixels() accepts pixel data and stores in the image at the
2460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  location you specify.  The method returns MagickTrue on success otherwise
2461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  MagickFalse if an error is encountered.  The pixel data can be either char,
2462b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  Quantum, short int, unsigned int, unsigned long long, float, or double in
2463b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  the order specified by map.
2464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  Suppose your want to upload the first scanline of a 640x480 image from
2466e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  character data in red-green-blue order:
2467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels);
2469e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  The format of the ImportImagePixels method is:
2471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2472cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%      MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
2473cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const ssize_t y,const size_t width,const size_t height,
2474cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const char *map,const StorageType type,const void *pixels,
2475cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        ExceptionInfo *exception)
2476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  A description of each parameter follows:
2478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o image: the image.
2480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2481cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%    o x,y,width,height:  These values define the perimeter
2482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      of a region of pixels you want to define.
2483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o map:  This string reflects the expected ordering of the pixel array.
2485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      It can be any combination or order of R = red, G = green, B = blue,
2486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
2487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
2488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      P = pad.
2489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o type: Define the data type of the pixels.  Float and double types are
2491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
24926c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
2493ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy%      LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
24946c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
2495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o pixels: This array of values contain the pixel components as defined by
2497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      map and type.  You must preallocate this array where the expected
2498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      length varies depending on the values of width, height, map, and type.
2499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o exception: return any errors or warnings in this structure.
2501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/
2503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2504cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportCharPixel(Image *image,const RectangleInfo *roi,
250505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,
250605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const void *pixels,ExceptionInfo *exception)
2507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned char
250905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
2510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
251205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
2513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
251714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
251814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
251914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned char *) pixels;
2524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2526cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2527e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2528cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2531cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2545cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2547cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2550cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRO") == 0)
2564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2565cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2567cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2570cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2585cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2587cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2590cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2605cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2607cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2610cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleCharToQuantum(*p++),q);
2613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2619e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2622cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2624cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2627cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2641cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2643cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2646cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBO") == 0)
2660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2661cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2663cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2666cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2681cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2683cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2686cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
269914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
2700cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
2701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2702cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
2704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2705cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
2706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
2708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
2709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
271014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
2711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
2713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2714e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
2715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
2716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleCharToQuantum(*p),q);
2718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
2721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
2722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleCharToQuantum(*p),q);
2724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
2727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
2728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleCharToQuantum(*p),q);
2730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
2733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
2738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
2743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleCharToQuantum(*p),q);
2745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
2748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2749e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleCharToQuantum(*p),q);
2750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
2753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
2756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
2758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
2760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
2762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2764cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportDoublePixel(Image *image,const RectangleInfo *roi,
276505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,
276605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const void *pixels,ExceptionInfo *exception)
2767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const double
276905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
2770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
277205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
2773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
277714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
277814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
277914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const double *) pixels;
2784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2786cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2788cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2791cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
27938cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27958cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27978cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2808cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2810cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2813cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
28158cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28178cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28198cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28218cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2827e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2832cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2834cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2837cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
28398cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28418cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28438cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2855cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2857cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2860cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
28628cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2873cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2875cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2878cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
28808cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28828cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28848cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2895cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2897cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2900cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
29028cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29048cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29068cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29088cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2919cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2921cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2924cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
29268cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29288cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29308cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2936e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
293914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy   length=strlen(map);
2940cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
2941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2942cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
2944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2945cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
2946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
2948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
2949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
295014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
2951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
2953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
2955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
2956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
29578cd03c32d039162196906ff36501f3543019b56acristy            SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
2961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
2962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
29638cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
2967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
2968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
29698cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
2973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
29748cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
2978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
29798cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
2983e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
29848cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q);
2985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
2988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
29898cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
2993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
2996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
2998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
30023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3004cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportFloatPixel(Image *image,const RectangleInfo *roi,
300505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,
300605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const void *pixels,ExceptionInfo *exception)
30073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const float
300905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
3010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
301205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
3013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
301714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
301814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
301914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const float *) pixels;
3024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3026cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3028cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3031cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
30338cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
30358cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
30378cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3048cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3050cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3053cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
30558cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
30578cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
30598cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
30618cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
3062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3072cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3074cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3077cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
30798cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
30818cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
30838cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3085e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
3094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3095cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3097cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3100cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
31028cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
3103e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3111e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3113cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3115cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3118cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
31208cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
31228cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
31248cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3129e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3133e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3135cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3137cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3140cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
31428cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
31448cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
31468cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
31488cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
3149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3153e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3159cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3160e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3161cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3164cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3165e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
31668cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
31688cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
31708cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3173e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3176e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
317914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3180cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3182cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3185cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
3186e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
3189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
319014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3191e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3192e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
3193e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3194e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3195e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
3196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
31978cd03c32d039162196906ff36501f3543019b56acristy            SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3199e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
3202e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
32038cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3204e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3206e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3207e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
3208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
32098cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3211e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
3213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
32148cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
3215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3217e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
3218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
32198cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
3220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3222e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
3223e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
32248cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q);
3225e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3226e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
3228e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
32298cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
3230e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3233e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3236e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3238e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3241e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3243e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3244cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongPixel(Image *image,const RectangleInfo *roi,
324505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,
324605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const void *pixels,ExceptionInfo *exception)
32473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3248e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned int
324905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
32503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
32514c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
325205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
32533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3254bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
32553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
32563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
325714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
325814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
325914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
32609d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
32619d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
32629d314ff2c17a77996c05413c2013880387e50f0ecristy
3263e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned int *) pixels;
3264e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
32653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3266cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
32673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3268cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3269e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3271cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3273e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3276e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
32803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3284e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3285cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
32863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3287cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3289e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3290cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3292e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3295e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3297e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3298e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3301e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3305cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3307cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3310cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3311e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3315e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3316e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3317e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3318e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
3324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3325cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3327cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3330cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleLongToQuantum(*p++),q);
3333e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3335e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3342cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3344cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3345e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3346e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3347cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3348e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3351e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3353e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3355e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3357e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3361cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3363cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3366cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3368e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3373e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3374e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3375e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3381cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3383cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3386cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3392e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3393e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3394e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
339914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3400cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3402cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3405cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
3406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
3409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
341014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
34113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3412e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
3413e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3415e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
3416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleLongToQuantum(*p),q);
3418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
3422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleLongToQuantum(*p),q);
3424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
3428e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleLongToQuantum(*p),q);
3430e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3431e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3432e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
3433e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
3438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
3443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleLongToQuantum(*p),q);
3445e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
3448e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3449e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleLongToQuantum(*p),q);
3450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3452e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3453e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3464cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongLongPixel(Image *image,const RectangleInfo *roi,
346505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,
346605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const void *pixels,ExceptionInfo *exception)
3467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3468b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  register const MagickSizeType
346905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
3470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
347205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
3473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
347714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
347814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
347914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3483b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  p=(const MagickSizeType *) pixels;
3484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3486cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3488cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3491cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3493b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3494b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3495b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3504e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3505cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3507cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3510cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3512b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3513b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3514b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3515b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3525cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3527cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3530cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3532b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3533b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3534b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
35403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
3544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3545cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
35463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3547cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3550cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3552b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGray(image,ScaleLongLongToQuantum(*p++),q);
3553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
35573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3562cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
35633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3564cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3567cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3569b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3570b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3571b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
35763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3581cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
35823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3583cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3586cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3588b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3589b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3590b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3591b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
35963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3601cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
36023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3603cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3606cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3608b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3609b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3610b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
36163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
36183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
361914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3620cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
36213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3622cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3625cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
36263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
36293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
363014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
36333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
36363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3637b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelRed(image,ScaleLongLongToQuantum(*p),q);
3638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
36423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3643b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelGreen(image,ScaleLongLongToQuantum(*p),q);
3644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
36483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3649b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelBlue(image,ScaleLongLongToQuantum(*p),q);
3650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
36533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3654b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
36583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3659b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
36633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3664b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelBlack(image,ScaleLongLongToQuantum(*p),q);
3665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
36683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3669b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelGray(image,ScaleLongLongToQuantum(*p),q);
3670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3684cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportQuantumPixel(Image *image,const RectangleInfo *roi,
368505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,
368605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const void *pixels,ExceptionInfo *exception)
3687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
368905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
3690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
369205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
3693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
369714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
369814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
369914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const Quantum *) pixels;
3704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3706cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3708cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
37103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3711cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3714e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3725cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3727cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3730cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,*p++,q);
3736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
37373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3745cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
37463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3747cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
37484c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
37493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3750cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
37513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3756ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3765cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3767cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
37693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3770cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,*p++,q);
3773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3782cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
37833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3784cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
37854c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
37863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3787cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
37883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3792ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
37933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
37943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
37953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
37963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
37983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
38003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3801cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3803cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
38053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3806cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3808e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,*p++,q);
3812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
38133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3821cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
38223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3823cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
38244c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
38253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3826cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
38273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3832ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
38333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
38343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
38353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
38363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
38383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
383914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3840cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3842cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3845cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
38463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
38493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
385014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
38533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
38563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,*p,q);
3858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
38623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,*p,q);
3864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
38683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,*p,q);
3870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
38733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,*p,q);
3875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
38783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,*p,q);
3880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
38833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,*p,q);
3885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
38883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,*p,q);
3890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
38943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3900e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3904cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportShortPixel(Image *image,const RectangleInfo *roi,
390505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const char *magick_restrict map,const QuantumType *quantum_map,
390605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk  const void *pixels,ExceptionInfo *exception)
3907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned short
390905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict p;
3910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
391205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk    *magick_restrict q;
3913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
391714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
391814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
391914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned short *) pixels;
3924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3926cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
39273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3928cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
39294c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
39303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3931cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
39323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3936ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
39393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
39443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3945cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3947cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
39493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3950cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
39593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3965cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3967cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
39684c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
39693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3970cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3976ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
39773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
39783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
39793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
39803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
39823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3983e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
39843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3985cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3987cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
39893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3990cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
39913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleShortToQuantum(*p++),q);
3993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
4001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4002cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4004cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
4005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
4007cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
40083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
4009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
4010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
4011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
4012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
40133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
4016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
4018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
4020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4021cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4023cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
4024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
40253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
4026cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
4027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
4028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
4029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
4030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
4031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
4032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
40333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
4035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
4036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
4038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
4040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4041cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
40423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4043cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
40444c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
40453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
4046cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
40473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
4048e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
4049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
4050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
4051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
4052ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
40533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
40543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
40553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
40563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
40583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
405914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
4060cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
4061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
4062cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
4063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
4064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4065cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
40663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
4068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
407014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
4071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
4074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
4075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
40763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleShortToQuantum(*p),q);
4078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
4081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleShortToQuantum(*p),q);
4084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
40853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
4087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
40883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleShortToQuantum(*p),q);
4090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
40913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
40933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
4095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
4100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
41013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleShortToQuantum(*p),q);
4105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
4109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleShortToQuantum(*p),q);
4110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
41113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
4112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
4113e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
4116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
4118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
4120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
4122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
4123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
4124cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristyMagickExport MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
4125cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const ssize_t y,const size_t width,const size_t height,const char *map,
4126cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const StorageType type,const void *pixels,ExceptionInfo *exception)
4127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
4128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  QuantumType
4129e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *quantum_map;
4130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
4131cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  RectangleInfo
4132cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    roi;
4133cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy
4134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
4135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    i;
4136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
413714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
413814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
413914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
4140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  /*
4141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    Allocate image structure.
4142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  */
4143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image != (Image *) NULL);
4144e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
4145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image->debug != MagickFalse)
4146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
414714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
414814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
4149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (quantum_map == (QuantumType *) NULL)
4150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
4151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      image->filename);
415214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  for (i=0; i < (ssize_t) length; i++)
4153e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
4154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    switch (map[i])
4155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'a':
4157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'A':
41583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=AlphaQuantum;
41608a46d827a124555f0c48fb2368ec1bba8e079ab6cristy        image->alpha_trait=BlendPixelTrait;
4161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'B':
4164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'b':
4165e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4166e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlueQuantum;
4167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4168e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'C':
4170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'c':
4171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=CyanQuantum;
4173e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
4174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4176e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'g':
4177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'G':
4178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=GreenQuantum;
4180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'K':
4183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'k':
4184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlackQuantum;
4186e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
4187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'I':
4190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'i':
4191e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4192e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=IndexQuantum;
4193b7b3da6aa145fe62d107c4b4c1a25bcc24bd1006cristy        (void) SetImageColorspace(image,GRAYColorspace,exception);
4194e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4195e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'm':
4197e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'M':
4198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4199e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=MagentaQuantum;
4200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
4201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4202e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4203e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'O':
4204e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'o':
4205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4206e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=OpacityQuantum;
42078a46d827a124555f0c48fb2368ec1bba8e079ab6cristy        image->alpha_trait=BlendPixelTrait;
4208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4209e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'P':
4211e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'p':
4212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=UndefinedQuantum;
4214e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'R':
4217e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'r':
4218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4219e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=RedQuantum;
4220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
42213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4222e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'Y':
4223e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'y':
4224e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4225e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=YellowQuantum;
4226e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
4227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4228e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4229e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      default:
4230e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
4232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
4233efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "UnrecognizedPixelMap","`%s'",map);
4234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
4235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4236e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
4238e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
4239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    return(MagickFalse);
4240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  /*
4241e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    Transfer the pixels from the pixel data to the image.
4242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  */
4243cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.width=width;
4244cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.height=height;
4245cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.x=x;
4246cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.y=y;
4247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  switch (type)
4248e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
4249e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case CharPixel:
4250e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4251cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportCharPixel(image,&roi,map,quantum_map,pixels,exception);
4252e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4253e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4254e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case DoublePixel:
4255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4256cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
4257e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4258e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4259e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case FloatPixel:
4260e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4261cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
4262e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4263e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
42646c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongPixel:
4265e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4266cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportLongPixel(image,&roi,map,quantum_map,pixels,exception);
4267e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4268e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
42696c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongLongPixel:
4270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4271cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
4272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4273e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case QuantumPixel:
4275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4276cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
4277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case ShortPixel:
4280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4281cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportShortPixel(image,&roi,map,quantum_map,pixels,exception);
42823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
42833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
42853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
42863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
4287c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
428894db6c1547e1c4ef2ca7ea209d17749d2b5fd850dirk        "UnrecognizedStorageType","`%d'",type);
42893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
42903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
42913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
42923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
42933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
42943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4295d76c51ed30cf4084f4434ba08925d16001d1e340cristy
4296d76c51ed30cf4084f4434ba08925d16001d1e340cristy/*
4297d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4298a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4299a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4300a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4301bd5a96cd2b69f218f85a7adc306296a736f91a56cristy+   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                         %
4302bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4303bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4304bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4305bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4306bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4307bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  InitializePixelChannelMap() defines the standard pixel component map.
4308bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4309bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  The format of the InitializePixelChannelMap() method is:
4310bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4311bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      void InitializePixelChannelMap(Image *image)
4312bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4313bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  A description of each parameter follows:
4314bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4315bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%    o image: the image.
4316bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4317bd5a96cd2b69f218f85a7adc306296a736f91a56cristy*/
4318021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4319021216a8b35ea91ef1f12713ed41da843bbaee7bcristystatic void LogPixelChannels(const Image *image)
4320021216a8b35ea91ef1f12713ed41da843bbaee7bcristy{
4321021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  register ssize_t
4322021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    i;
4323021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4324021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%.20g]",
4325021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    image->filename,(double) image->number_channels);
4326021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  for (i=0; i < (ssize_t) image->number_channels; i++)
4327021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  {
4328021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    char
4329151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      traits[MagickPathExtent];
4330021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4331021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    const char
4332021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      *name;
4333021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4334021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    PixelChannel
4335021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      channel;
4336021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4337021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    switch (GetPixelChannelChannel(image,i))
4338021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    {
4339021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case RedPixelChannel:
4340021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4341021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="red";
4342021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == CMYKColorspace)
4343021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="cyan";
4344021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == GRAYColorspace)
4345021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="gray";
4346021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4347021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4348021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case GreenPixelChannel:
4349021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4350021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="green";
4351021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == CMYKColorspace)
4352021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="magenta";
4353021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4354021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4355021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case BluePixelChannel:
4356021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4357021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="blue";
4358021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == CMYKColorspace)
4359021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="yellow";
4360021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4361021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4362021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case BlackPixelChannel:
4363021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4364021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="black";
4365021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->storage_class == PseudoClass)
4366021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="index";
4367021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4368021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4369021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case IndexPixelChannel:
4370021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4371021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="index";
4372021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4373021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4374021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case AlphaPixelChannel:
4375021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4376021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="alpha";
4377021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4378021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4379021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case ReadMaskPixelChannel:
4380021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
43810481714f03ee904233a3aa1a5ed8c7690c9d361dcristy        name="read-mask";
4382021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4383021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4384021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case WriteMaskPixelChannel:
4385021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
43860481714f03ee904233a3aa1a5ed8c7690c9d361dcristy        name="write-mask";
4387021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4388021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4389021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case MetaPixelChannel:
4390021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4391021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="meta";
4392021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4393021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4394021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      default:
4395021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="undefined";
4396021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    }
4397021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    channel=GetPixelChannelChannel(image,i);
4398021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    *traits='\0';
4399021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if ((GetPixelChannelTraits(image,channel) & UpdatePixelTrait) != 0)
4400151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) ConcatenateMagickString(traits,"update,",MagickPathExtent);
4401021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if ((GetPixelChannelTraits(image,channel) & BlendPixelTrait) != 0)
4402151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) ConcatenateMagickString(traits,"blend,",MagickPathExtent);
4403021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if ((GetPixelChannelTraits(image,channel) & CopyPixelTrait) != 0)
4404151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) ConcatenateMagickString(traits,"copy,",MagickPathExtent);
4405021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if (*traits == '\0')
4406151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) ConcatenateMagickString(traits,"undefined,",MagickPathExtent);
4407021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    traits[strlen(traits)-1]='\0';
4408021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    (void) LogMagickEvent(PixelEvent,GetMagickModule(),"  %.20g: %s (%s)",
4409021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      (double) i,name,traits);
4410021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  }
4411021216a8b35ea91ef1f12713ed41da843bbaee7bcristy}
4412021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4413e2a912b6c9086c98ec838baa0824cd8deca55538cristyMagickExport void InitializePixelChannelMap(Image *image)
441477c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy{
4415e2a912b6c9086c98ec838baa0824cd8deca55538cristy  PixelTrait
4416e2a912b6c9086c98ec838baa0824cd8deca55538cristy    trait;
4417e2a912b6c9086c98ec838baa0824cd8deca55538cristy
441877c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  register ssize_t
441977c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    i;
442077c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy
4421d26338ffb761a86f047d7bbb9a596800f53c8649cristy  ssize_t
442277c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    n;
442377c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy
442477c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  assert(image != (Image *) NULL);
4425e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
4426e2a912b6c9086c98ec838baa0824cd8deca55538cristy  (void) ResetMagickMemory(image->channel_map,0,MaxPixelChannels*
4427e2a912b6c9086c98ec838baa0824cd8deca55538cristy    sizeof(*image->channel_map));
4428e2a912b6c9086c98ec838baa0824cd8deca55538cristy  trait=UpdatePixelTrait;
442917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy  if (image->alpha_trait != UndefinedPixelTrait)
443061f18adcc41fdd05d57e50544cdb9d321bb18953cristy    trait=(PixelTrait) (trait | BlendPixelTrait);
443177c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  n=0;
4432c06c58036e12a41593f1c7a984f1fdb4e9cc434bcristy  if (image->colorspace == GRAYColorspace)
443377c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    {
4434cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,BluePixelChannel,trait,n);
4435cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,GreenPixelChannel,trait,n);
4436cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,RedPixelChannel,trait,n++);
44373c3162882db2814a5b709072cd03b8d18c80d6afcristy    }
44383c3162882db2814a5b709072cd03b8d18c80d6afcristy  else
44393c3162882db2814a5b709072cd03b8d18c80d6afcristy    {
4440cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,RedPixelChannel,trait,n++);
4441cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,GreenPixelChannel,trait,n++);
4442cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,BluePixelChannel,trait,n++);
444377c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    }
444477c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  if (image->colorspace == CMYKColorspace)
4445cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,BlackPixelChannel,trait,n++);
444617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy  if (image->alpha_trait != UndefinedPixelTrait)
4447cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,AlphaPixelChannel,CopyPixelTrait,n++);
4448bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (image->storage_class == PseudoClass)
4449cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,IndexPixelChannel,CopyPixelTrait,n++);
4450883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->read_mask != MagickFalse)
4451883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelAttributes(image,ReadMaskPixelChannel,CopyPixelTrait,n++);
4452883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->write_mask != MagickFalse)
4453883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelAttributes(image,WriteMaskPixelChannel,CopyPixelTrait,n++);
4454e2a912b6c9086c98ec838baa0824cd8deca55538cristy  assert((n+image->number_meta_channels) < MaxPixelChannels);
4455e2a912b6c9086c98ec838baa0824cd8deca55538cristy  for (i=0; i < (ssize_t) image->number_meta_channels; i++)
4456cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,(PixelChannel) (MetaPixelChannel+i),
4457cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      CopyPixelTrait,n++);
4458d26338ffb761a86f047d7bbb9a596800f53c8649cristy  image->number_channels=(size_t) n;
44596dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy  if (image->debug != MagickFalse)
44606dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy    LogPixelChannels(image);
446117ada024a8d39285affcac96ff344f3142c41aadcristy  SetImageChannelMask(image,image->channel_mask);
4462bd5a96cd2b69f218f85a7adc306296a736f91a56cristy}
4463bd5a96cd2b69f218f85a7adc306296a736f91a56cristy
4464bd5a96cd2b69f218f85a7adc306296a736f91a56cristy/*
4465bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4466bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4467bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4468bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4469a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%   I n t e r p o l a t e P i x e l C h a n n e l                             %
4470a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4471a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4472a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4473a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4474a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4475884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  InterpolatePixelChannel() applies a pixel interpolation method between a
4476884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
4477884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  pixel area resampling, or scaling of the result is performed.
4478a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4479cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just the specified channel.
4480cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
4481a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%  The format of the InterpolatePixelChannel method is:
4482a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4483a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%      MagickBooleanType InterpolatePixelChannel(const Image *image,
4484444eda6285b2191e662c3d375c86770da70a83b0cristy%        const CacheView *image_view,const PixelChannel channel,
44855c4e2586d27d4299a742d170d41105de1689aa46cristy%        const PixelInterpolateMethod method,const double x,const double y,
4486a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%        double *pixel,ExceptionInfo *exception)
4487a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4488a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%  A description of each parameter follows:
4489a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4490a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o image: the image.
4491a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4492a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o image_view: the image view.
4493a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4494a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o channel: the pixel channel to interpolate.
4495a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4496a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o method: the pixel color interpolation method.
4497a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4498a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o x,y: A double representing the current (x,y) position of the pixel.
4499a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4500a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o pixel: return the interpolated pixel here.
4501a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4502a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o exception: return any errors or warnings in this structure.
4503a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4504a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy*/
450594ea1636709395774d7118ef56162d211904cfd2cristy
4506b0a657e13c4aefba39c51292005427b47277869dcristystatic inline void CatromWeights(const double x,double (*weights)[4])
4507884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{
4508a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
4509884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    alpha,
4510d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    beta,
4511884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    gamma;
4512884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
45135a5e4d97bc9afa4660902954d2eed4f23582dfeccristy  /*
45145a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    Nicolas Robidoux' 10 flops (4* + 5- + 1+) refactoring of the computation
45155a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    of the standard four 1D Catmull-Rom weights. The sampling location is
45165a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    assumed between the second and third input pixel locations, and x is the
45175a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    position relative to the second input pixel location. Formulas originally
45185a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    derived for the VIPS (Virtual Image Processing System) library.
45195a5e4d97bc9afa4660902954d2eed4f23582dfeccristy  */
4520a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  alpha=(double) 1.0-x;
4521a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  beta=(double) (-0.5)*x*alpha;
4522d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[0]=alpha*beta;
4523d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[3]=x*beta;
4524d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  /*
45255a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    The following computation of the inner weights from the outer ones work
45265a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    for all Keys cubics.
4527d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  */
4528d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  gamma=(*weights)[3]-(*weights)[0];
4529d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[1]=alpha-(*weights)[0]+gamma;
4530d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[2]=x-(*weights)[3]-gamma;
4531d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas}
4532d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas
4533b0a657e13c4aefba39c51292005427b47277869dcristystatic inline void SplineWeights(const double x,double (*weights)[4])
4534d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas{
45355a5e4d97bc9afa4660902954d2eed4f23582dfeccristy  double
45365a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    alpha,
45375a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    beta;
45385a5e4d97bc9afa4660902954d2eed4f23582dfeccristy
4539d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  /*
454058ee5018960b42b80b54398eacabe9ae5da89149cristy    Nicolas Robidoux' 12 flops (6* + 5- + 1+) refactoring of the computation
454158ee5018960b42b80b54398eacabe9ae5da89149cristy    of the standard four 1D cubic B-spline smoothing weights. The sampling
454258ee5018960b42b80b54398eacabe9ae5da89149cristy    location is assumed between the second and third input pixel locations,
454358ee5018960b42b80b54398eacabe9ae5da89149cristy    and x is the position relative to the second input pixel location.
4544d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  */
4545a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  alpha=(double) 1.0-x;
4546a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  (*weights)[3]=(double) (1.0/6.0)*x*x*x;
4547a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  (*weights)[0]=(double) (1.0/6.0)*alpha*alpha*alpha;
4548d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  beta=(*weights)[3]-(*weights)[0];
4549d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[1]=alpha-(*weights)[0]+beta;
4550d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[2]=x-(*weights)[3]-beta;
4551884f600898ca6935a7981b4d56bf3d2c4ec17011cristy}
4552884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
455394ea1636709395774d7118ef56162d211904cfd2cristystatic inline double MeshInterpolate(const PointInfo *delta,const double p,
455494ea1636709395774d7118ef56162d211904cfd2cristy  const double x,const double y)
455594ea1636709395774d7118ef56162d211904cfd2cristy{
455694ea1636709395774d7118ef56162d211904cfd2cristy  return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
455794ea1636709395774d7118ef56162d211904cfd2cristy}
455894ea1636709395774d7118ef56162d211904cfd2cristy
4559cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony/*
4560a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristystatic inline ssize_t NearestNeighbor(const double x)
4561884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{
4562884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  if (x >= 0.0)
4563884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    return((ssize_t) (x+0.5));
4564884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  return((ssize_t) (x-0.5));
4565884f600898ca6935a7981b4d56bf3d2c4ec17011cristy}
4566cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony*/
4567884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4568a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristyMagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
456939fee9a56b751a52fb8b73d39836d48bc80cb35fdirk  const CacheView_ *image_view,const PixelChannel channel,
45705c4e2586d27d4299a742d170d41105de1689aa46cristy  const PixelInterpolateMethod method,const double x,const double y,
4571a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  double *pixel,ExceptionInfo *exception)
4572a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy{
4573a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
457494ea1636709395774d7118ef56162d211904cfd2cristy    alpha[16],
4575884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    gamma,
4576884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    pixels[16];
457794ea1636709395774d7118ef56162d211904cfd2cristy
457858ee5018960b42b80b54398eacabe9ae5da89149cristy  MagickBooleanType
457958ee5018960b42b80b54398eacabe9ae5da89149cristy    status;
458058ee5018960b42b80b54398eacabe9ae5da89149cristy
458158ee5018960b42b80b54398eacabe9ae5da89149cristy  PixelInterpolateMethod
458258ee5018960b42b80b54398eacabe9ae5da89149cristy    interpolate;
458358ee5018960b42b80b54398eacabe9ae5da89149cristy
458494ea1636709395774d7118ef56162d211904cfd2cristy  PixelTrait
458594ea1636709395774d7118ef56162d211904cfd2cristy    traits;
458694ea1636709395774d7118ef56162d211904cfd2cristy
458794ea1636709395774d7118ef56162d211904cfd2cristy  register const Quantum
458894ea1636709395774d7118ef56162d211904cfd2cristy    *p;
458994ea1636709395774d7118ef56162d211904cfd2cristy
459050e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
459194ea1636709395774d7118ef56162d211904cfd2cristy    i;
459294ea1636709395774d7118ef56162d211904cfd2cristy
4593a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  ssize_t
4594a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    x_offset,
4595a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    y_offset;
4596a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy
4597a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image != (Image *) NULL);
4598e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
4599a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image_view != (CacheView *) NULL);
4600a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  status=MagickTrue;
4601884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  *pixel=0.0;
4602cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy  traits=GetPixelChannelTraits(image,channel);
4603a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  x_offset=(ssize_t) floor(x);
4604a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  y_offset=(ssize_t) floor(y);
4605cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy  interpolate=method;
4606cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy  if (interpolate == UndefinedInterpolatePixel)
4607cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy    interpolate=image->interpolate;
4608cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
4609a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  {
461058ee5018960b42b80b54398eacabe9ae5da89149cristy    case AverageInterpolatePixel:  /* nearest 4 neighbours */
461158ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average9InterpolatePixel:  /* nearest 9 neighbours */
461258ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average16InterpolatePixel:  /* nearest 16 neighbours */
4613884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4614fb12237dd6e4d4d8b92d879661153062eeca0572cristy      ssize_t
4615fb12237dd6e4d4d8b92d879661153062eeca0572cristy        count;
4616cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4617fb12237dd6e4d4d8b92d879661153062eeca0572cristy      count=2;  /* size of the area to average - default nearest 4 */
4618cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
4619cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4620cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
4621cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
4622cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
4623cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4624fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
4625fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if (interpolate == Average16InterpolatePixel)
4626fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
4627fb12237dd6e4d4d8b92d879661153062eeca0572cristy            count=4;
4628fb12237dd6e4d4d8b92d879661153062eeca0572cristy            x_offset--;
4629fb12237dd6e4d4d8b92d879661153062eeca0572cristy            y_offset--;
4630fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
4631021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count,
4632021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        (size_t) count,exception);
4633884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4634884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4635884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4636884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4637884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
463858ee5018960b42b80b54398eacabe9ae5da89149cristy      count*=count;  /* Number of pixels to average */
4639222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
464050e64b85215ce366ca50af1ba16326c784221f92cristy        for (i=0; i < (ssize_t) count; i++)
4641884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4642884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4643a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4644884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4645884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
464650e64b85215ce366ca50af1ba16326c784221f92cristy        for (i=0; i < (ssize_t) count; i++)
4647884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4648884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4649884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4650884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4651884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
465250e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) count; i++)
4653884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      {
46543e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        gamma=PerceptibleReciprocal(alpha[i])/count;
4655cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        *pixel+=gamma*pixels[i];
4656884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      }
4657884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4658884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4659cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
4660cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
4661cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
4662cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      PointInfo
4663cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta,
4664cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon;
4665cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4666cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4667cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
4668cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4669cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
4670cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
4671cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4672cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if ((traits & BlendPixelTrait) == 0)
4673cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        for (i=0; i < 4; i++)
4674cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4675cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]=1.0;
4676a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4677cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4678cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else
4679cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        for (i=0; i < 4; i++)
4680cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4681cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4682cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            GetPixelChannels(image));
4683cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4684cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4685cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.x=x-x_offset;
4686cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.y=y-y_offset;
4687cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.x=1.0-delta.x;
4688cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.y=1.0-delta.y;
4689cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4690cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*alpha[2]+delta.x*alpha[3])));
46913e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      gamma=PerceptibleReciprocal(gamma);
4692cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*
4693cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*pixels[2]+delta.x*pixels[3]));
4694cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
4695cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
46965f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    case BlendInterpolatePixel:
46975f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    {
46985f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
46995f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if (p == (const Quantum *) NULL)
47005f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
47015f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          status=MagickFalse;
47025f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          break;
47035f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
47045f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if ((traits & BlendPixelTrait) == 0)
47055f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        for (i=0; i < 4; i++)
47065f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
47075f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          alpha[i]=1.0;
47085f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
47095f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
47105f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      else
47115f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        for (i=0; i < 4; i++)
47125f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
47135f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
47145f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            GetPixelChannels(image));
47155f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
47165f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
471758ee5018960b42b80b54398eacabe9ae5da89149cristy      gamma=1.0;  /* number of pixels blended together (its variable) */
47185f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      for (i=0; i <= 1L; i++) {
4719fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((y-y_offset) >= 0.75)
4720fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
4721fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[i]=alpha[i+2];  /* take right pixels */
4722fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[i]=pixels[i+2];
4723fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
4724fb12237dd6e4d4d8b92d879661153062eeca0572cristy        else
4725fb12237dd6e4d4d8b92d879661153062eeca0572cristy          if ((y-y_offset) > 0.25)
4726fb12237dd6e4d4d8b92d879661153062eeca0572cristy            {
4727fb12237dd6e4d4d8b92d879661153062eeca0572cristy              gamma=2.0;  /* blend both pixels in row */
4728fb12237dd6e4d4d8b92d879661153062eeca0572cristy              alpha[i]+=alpha[i+2];  /* add up alpha weights */
4729fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i]+=pixels[i+2];
4730fb12237dd6e4d4d8b92d879661153062eeca0572cristy            }
47315f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      }
4732fb12237dd6e4d4d8b92d879661153062eeca0572cristy      if ((x-x_offset) >= 0.75)
4733fb12237dd6e4d4d8b92d879661153062eeca0572cristy        {
4734fb12237dd6e4d4d8b92d879661153062eeca0572cristy          alpha[0]=alpha[1];  /* take bottom row blend */
4735fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[0]=pixels[1];
4736fb12237dd6e4d4d8b92d879661153062eeca0572cristy        }
4737fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
4738fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((x-x_offset) > 0.25)
4739fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
4740fb12237dd6e4d4d8b92d879661153062eeca0572cristy            gamma*=2.0;  /* blend both rows */
4741fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[0]+=alpha[1];  /* add up alpha weights */
4742fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0]+=pixels[1];
4743fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
47445f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if (channel != AlphaPixelChannel)
474558ee5018960b42b80b54398eacabe9ae5da89149cristy        gamma=PerceptibleReciprocal(alpha[0]);  /* (color) 1/alpha_weights */
47465f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      else
474758ee5018960b42b80b54398eacabe9ae5da89149cristy        gamma=PerceptibleReciprocal(gamma);  /* (alpha) 1/number_of_pixels */
47485f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      *pixel=gamma*pixels[0];
47495f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      break;
47505f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    }
4751cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
4752884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4753a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
4754380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
47556676f5a461ba75c5f4a927218cb3577dd29d70aenicolas        cy[4];
4756884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4757884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4758884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        exception);
4759884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4760884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4761884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4762884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4763884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4764222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
4765884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4766884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4767884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4768a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4769884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4770884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
4771884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4772884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4773884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4774884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4775884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4776884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4777a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (x-x_offset),&cx);
4778a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (y-y_offset),&cy);
4779a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      gamma=(channel == AlphaPixelChannel ? (double) 1.0 :
47803e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4781d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4782d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4783d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4784d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*alpha[14]+cx[3]*alpha[15])));
4785380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4786d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4787d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4788d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4789d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4790884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4791884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4792884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case IntegerInterpolatePixel:
4793884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4794884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4795884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4796884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4797884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4798884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4799884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
48000beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy      *pixel=(double) GetPixelChannel(image,channel,p);
4801884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4802884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4803cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
4804884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4805cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
4806cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
4807cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4808884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4809884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4810884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4811884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4812884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
48130beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy      *pixel=(double) GetPixelChannel(image,channel,p);
4814884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4815884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4816884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case MeshInterpolatePixel:
4817884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4818884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      PointInfo
4819884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        delta,
4820884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        luminance;
4821884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4822884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4823884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4824884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4825884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4826884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4827884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4828222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
482994ea1636709395774d7118ef56162d211904cfd2cristy        for (i=0; i < 4; i++)
483094ea1636709395774d7118ef56162d211904cfd2cristy        {
483194ea1636709395774d7118ef56162d211904cfd2cristy          alpha[i]=1.0;
4832a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
483394ea1636709395774d7118ef56162d211904cfd2cristy        }
483494ea1636709395774d7118ef56162d211904cfd2cristy      else
483594ea1636709395774d7118ef56162d211904cfd2cristy        for (i=0; i < 4; i++)
483694ea1636709395774d7118ef56162d211904cfd2cristy        {
483794ea1636709395774d7118ef56162d211904cfd2cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
483894ea1636709395774d7118ef56162d211904cfd2cristy            GetPixelChannels(image));
483994ea1636709395774d7118ef56162d211904cfd2cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
484094ea1636709395774d7118ef56162d211904cfd2cristy        }
4841884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      delta.x=x-x_offset;
4842884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      delta.y=y-y_offset;
4843ebfaacf0542df42a5beaa9b81a017992e838df70cristy      luminance.x=GetPixelLuma(image,p)-(double)
4844ebfaacf0542df42a5beaa9b81a017992e838df70cristy        GetPixelLuma(image,p+3*GetPixelChannels(image));
4845ebfaacf0542df42a5beaa9b81a017992e838df70cristy      luminance.y=GetPixelLuma(image,p+GetPixelChannels(image))-(double)
4846ebfaacf0542df42a5beaa9b81a017992e838df70cristy        GetPixelLuma(image,p+2*GetPixelChannels(image));
484794ea1636709395774d7118ef56162d211904cfd2cristy      if (fabs(luminance.x) < fabs(luminance.y))
484894ea1636709395774d7118ef56162d211904cfd2cristy        {
484994ea1636709395774d7118ef56162d211904cfd2cristy          /*
485094ea1636709395774d7118ef56162d211904cfd2cristy            Diagonal 0-3 NW-SE.
485194ea1636709395774d7118ef56162d211904cfd2cristy          */
485294ea1636709395774d7118ef56162d211904cfd2cristy          if (delta.x <= delta.y)
485394ea1636709395774d7118ef56162d211904cfd2cristy            {
485494ea1636709395774d7118ef56162d211904cfd2cristy              /*
485594ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-left triangle (pixel: 2, diagonal: 0-3).
485694ea1636709395774d7118ef56162d211904cfd2cristy              */
485794ea1636709395774d7118ef56162d211904cfd2cristy              delta.y=1.0-delta.y;
485894ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
48593e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
486094ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3],
486194ea1636709395774d7118ef56162d211904cfd2cristy                pixels[0]);
486294ea1636709395774d7118ef56162d211904cfd2cristy            }
486394ea1636709395774d7118ef56162d211904cfd2cristy          else
486494ea1636709395774d7118ef56162d211904cfd2cristy            {
486594ea1636709395774d7118ef56162d211904cfd2cristy              /*
486694ea1636709395774d7118ef56162d211904cfd2cristy                Top-right triangle (pixel: 1, diagonal: 0-3).
486794ea1636709395774d7118ef56162d211904cfd2cristy              */
486894ea1636709395774d7118ef56162d211904cfd2cristy              delta.x=1.0-delta.x;
486994ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
48703e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
487194ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0],
487294ea1636709395774d7118ef56162d211904cfd2cristy                pixels[3]);
487394ea1636709395774d7118ef56162d211904cfd2cristy            }
487494ea1636709395774d7118ef56162d211904cfd2cristy        }
487594ea1636709395774d7118ef56162d211904cfd2cristy      else
487694ea1636709395774d7118ef56162d211904cfd2cristy        {
487794ea1636709395774d7118ef56162d211904cfd2cristy          /*
487894ea1636709395774d7118ef56162d211904cfd2cristy            Diagonal 1-2 NE-SW.
487994ea1636709395774d7118ef56162d211904cfd2cristy          */
488094ea1636709395774d7118ef56162d211904cfd2cristy          if (delta.x <= (1.0-delta.y))
488194ea1636709395774d7118ef56162d211904cfd2cristy            {
488294ea1636709395774d7118ef56162d211904cfd2cristy              /*
488394ea1636709395774d7118ef56162d211904cfd2cristy                Top-left triangle (pixel: 0, diagonal: 1-2).
488494ea1636709395774d7118ef56162d211904cfd2cristy              */
488594ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
48863e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
488794ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1],
488894ea1636709395774d7118ef56162d211904cfd2cristy                pixels[2]);
488994ea1636709395774d7118ef56162d211904cfd2cristy            }
489094ea1636709395774d7118ef56162d211904cfd2cristy          else
489194ea1636709395774d7118ef56162d211904cfd2cristy            {
489294ea1636709395774d7118ef56162d211904cfd2cristy              /*
489394ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-right triangle (pixel: 3, diagonal: 1-2).
489494ea1636709395774d7118ef56162d211904cfd2cristy              */
489594ea1636709395774d7118ef56162d211904cfd2cristy              delta.x=1.0-delta.x;
489694ea1636709395774d7118ef56162d211904cfd2cristy              delta.y=1.0-delta.y;
489794ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
48983e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
489994ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2],
490094ea1636709395774d7118ef56162d211904cfd2cristy                pixels[1]);
490194ea1636709395774d7118ef56162d211904cfd2cristy            }
490294ea1636709395774d7118ef56162d211904cfd2cristy        }
4903a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy      break;
4904a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    }
4905884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case SplineInterpolatePixel:
4906884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4907a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
4908d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
49096676f5a461ba75c5f4a927218cb3577dd29d70aenicolas        cy[4];
4910884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4911884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4912884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        exception);
4913884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4914884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4915884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4916884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4917884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4918222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
4919884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4920884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4921884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4922a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4923884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4924884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
4925884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4926884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4927884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4928884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4929884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4930884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4931a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (x-x_offset),&cx);
4932a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (y-y_offset),&cy);
4933a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      gamma=(channel == AlphaPixelChannel ? (double) 1.0 :
49343e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4935d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4936d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4937d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4938d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*alpha[14]+cx[3]*alpha[15])));
4939d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4940d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4941d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4942d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4943d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4944884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4945884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4946a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  }
4947a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  return(status);
4948a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy}
4949a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy
4950a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy/*
4951a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4952d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
4953d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
4954d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
49555c4e2586d27d4299a742d170d41105de1689aa46cristy%   I n t e r p o l a t e P i x e l C h a n n e l s                           %
49565c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
49575c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
49585c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
49595c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49605c4e2586d27d4299a742d170d41105de1689aa46cristy%
49615c4e2586d27d4299a742d170d41105de1689aa46cristy%  InterpolatePixelChannels() applies a pixel interpolation method between a
49625c4e2586d27d4299a742d170d41105de1689aa46cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
49635c4e2586d27d4299a742d170d41105de1689aa46cristy%  pixel area resampling, or scaling of the result is performed.
49645c4e2586d27d4299a742d170d41105de1689aa46cristy%
4965cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just the current channel setting of the
4966cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  destination image into which the color is to be stored
4967cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
49685c4e2586d27d4299a742d170d41105de1689aa46cristy%  The format of the InterpolatePixelChannels method is:
49695c4e2586d27d4299a742d170d41105de1689aa46cristy%
49705c4e2586d27d4299a742d170d41105de1689aa46cristy%      MagickBooleanType InterpolatePixelChannels(const Image *source,
49715c4e2586d27d4299a742d170d41105de1689aa46cristy%        const CacheView *source_view,const Image *destination,
49725c4e2586d27d4299a742d170d41105de1689aa46cristy%        const PixelInterpolateMethod method,const double x,const double y,
49735c4e2586d27d4299a742d170d41105de1689aa46cristy%        Quantum *pixel,ExceptionInfo *exception)
49745c4e2586d27d4299a742d170d41105de1689aa46cristy%
49755c4e2586d27d4299a742d170d41105de1689aa46cristy%  A description of each parameter follows:
49765c4e2586d27d4299a742d170d41105de1689aa46cristy%
49775c4e2586d27d4299a742d170d41105de1689aa46cristy%    o source: the source.
49785c4e2586d27d4299a742d170d41105de1689aa46cristy%
49795c4e2586d27d4299a742d170d41105de1689aa46cristy%    o source_view: the source view.
49805c4e2586d27d4299a742d170d41105de1689aa46cristy%
4981cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%    o destination: the destination image, for the interpolated color
49825c4e2586d27d4299a742d170d41105de1689aa46cristy%
49835c4e2586d27d4299a742d170d41105de1689aa46cristy%    o method: the pixel color interpolation method.
49845c4e2586d27d4299a742d170d41105de1689aa46cristy%
49855c4e2586d27d4299a742d170d41105de1689aa46cristy%    o x,y: A double representing the current (x,y) position of the pixel.
49865c4e2586d27d4299a742d170d41105de1689aa46cristy%
49875c4e2586d27d4299a742d170d41105de1689aa46cristy%    o pixel: return the interpolated pixel here.
49885c4e2586d27d4299a742d170d41105de1689aa46cristy%
49895c4e2586d27d4299a742d170d41105de1689aa46cristy%    o exception: return any errors or warnings in this structure.
49905c4e2586d27d4299a742d170d41105de1689aa46cristy%
49915c4e2586d27d4299a742d170d41105de1689aa46cristy*/
49925c4e2586d27d4299a742d170d41105de1689aa46cristyMagickExport MagickBooleanType InterpolatePixelChannels(const Image *source,
499339fee9a56b751a52fb8b73d39836d48bc80cb35fdirk  const CacheView_ *source_view,const Image *destination,
49945c4e2586d27d4299a742d170d41105de1689aa46cristy  const PixelInterpolateMethod method,const double x,const double y,
49955c4e2586d27d4299a742d170d41105de1689aa46cristy  Quantum *pixel,ExceptionInfo *exception)
49965c4e2586d27d4299a742d170d41105de1689aa46cristy{
49975c4e2586d27d4299a742d170d41105de1689aa46cristy  MagickBooleanType
49985c4e2586d27d4299a742d170d41105de1689aa46cristy    status;
49995c4e2586d27d4299a742d170d41105de1689aa46cristy
5000a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
50015c4e2586d27d4299a742d170d41105de1689aa46cristy    alpha[16],
50025c4e2586d27d4299a742d170d41105de1689aa46cristy    gamma,
50035c4e2586d27d4299a742d170d41105de1689aa46cristy    pixels[16];
50045c4e2586d27d4299a742d170d41105de1689aa46cristy
50055c4e2586d27d4299a742d170d41105de1689aa46cristy  register const Quantum
50065c4e2586d27d4299a742d170d41105de1689aa46cristy    *p;
50075c4e2586d27d4299a742d170d41105de1689aa46cristy
500850e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
50095c4e2586d27d4299a742d170d41105de1689aa46cristy    i;
50105c4e2586d27d4299a742d170d41105de1689aa46cristy
50115c4e2586d27d4299a742d170d41105de1689aa46cristy  ssize_t
50125c4e2586d27d4299a742d170d41105de1689aa46cristy    x_offset,
50135c4e2586d27d4299a742d170d41105de1689aa46cristy    y_offset;
50145c4e2586d27d4299a742d170d41105de1689aa46cristy
5015cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  PixelInterpolateMethod
5016cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate;
5017cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
50185c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source != (Image *) NULL);
5019e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(source->signature == MagickCoreSignature);
50205c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source_view != (CacheView *) NULL);
50215c4e2586d27d4299a742d170d41105de1689aa46cristy  status=MagickTrue;
50225c4e2586d27d4299a742d170d41105de1689aa46cristy  x_offset=(ssize_t) floor(x);
50235c4e2586d27d4299a742d170d41105de1689aa46cristy  y_offset=(ssize_t) floor(y);
5024cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy  interpolate=method;
5025cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy  if (interpolate == UndefinedInterpolatePixel)
5026cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy    interpolate=source->interpolate;
5027cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
50285c4e2586d27d4299a742d170d41105de1689aa46cristy  {
502958ee5018960b42b80b54398eacabe9ae5da89149cristy    case AverageInterpolatePixel:  /* nearest 4 neighbours */
503058ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average9InterpolatePixel:  /* nearest 9 neighbours */
503158ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average16InterpolatePixel:  /* nearest 16 neighbours */
50325c4e2586d27d4299a742d170d41105de1689aa46cristy    {
5033fb12237dd6e4d4d8b92d879661153062eeca0572cristy      ssize_t
5034fb12237dd6e4d4d8b92d879661153062eeca0572cristy        count;
5035cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5036fb12237dd6e4d4d8b92d879661153062eeca0572cristy      count=2;  /* size of the area to average - default nearest 4 */
5037cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
5038cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5039cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
5040cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
5041cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
5042cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5043fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
5044fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if (interpolate == Average16InterpolatePixel)
5045fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
5046fb12237dd6e4d4d8b92d879661153062eeca0572cristy            count=4;
5047fb12237dd6e4d4d8b92d879661153062eeca0572cristy            x_offset--;
5048fb12237dd6e4d4d8b92d879661153062eeca0572cristy            y_offset--;
5049fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
50501b72b8194b7d3f274bebf9e176192fd29e385481cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,(size_t) count,
50511b72b8194b7d3f274bebf9e176192fd29e385481cristy        (size_t) count,exception);
50525c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
50535c4e2586d27d4299a742d170d41105de1689aa46cristy        {
50545c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
50555c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
50565c4e2586d27d4299a742d170d41105de1689aa46cristy        }
505758ee5018960b42b80b54398eacabe9ae5da89149cristy      count*=count;  /* Number of pixels to average */
505850e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
50595c4e2586d27d4299a742d170d41105de1689aa46cristy      {
50605c4e2586d27d4299a742d170d41105de1689aa46cristy        double
50615c4e2586d27d4299a742d170d41105de1689aa46cristy          sum;
50625c4e2586d27d4299a742d170d41105de1689aa46cristy
506350e64b85215ce366ca50af1ba16326c784221f92cristy        register ssize_t
50645c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
50655c4e2586d27d4299a742d170d41105de1689aa46cristy
50665a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
50675a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
50685a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
50695a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
50705c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
50715c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
50725c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
507350e64b85215ce366ca50af1ba16326c784221f92cristy        for (j=0; j < (ssize_t) count; j++)
5074a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[j]=(double) p[j*GetPixelChannels(source)+i];
50754a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        sum=0.0;
50765c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
50775c4e2586d27d4299a742d170d41105de1689aa46cristy          {
507850e64b85215ce366ca50af1ba16326c784221f92cristy            for (j=0; j < (ssize_t) count; j++)
5079cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              sum+=pixels[j];
5080cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            sum/=count;
50814a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy            SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
50825c4e2586d27d4299a742d170d41105de1689aa46cristy            continue;
50835c4e2586d27d4299a742d170d41105de1689aa46cristy          }
508450e64b85215ce366ca50af1ba16326c784221f92cristy        for (j=0; j < (ssize_t) count; j++)
50855c4e2586d27d4299a742d170d41105de1689aa46cristy        {
50865c4e2586d27d4299a742d170d41105de1689aa46cristy          alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
50875c4e2586d27d4299a742d170d41105de1689aa46cristy            GetPixelChannels(source));
50885c4e2586d27d4299a742d170d41105de1689aa46cristy          pixels[j]*=alpha[j];
50893e3ec3afbb0782697f201cbe30a56794c10dc7efcristy          gamma=PerceptibleReciprocal(alpha[j]);
5090cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          sum+=gamma*pixels[j];
50915c4e2586d27d4299a742d170d41105de1689aa46cristy        }
5092cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        sum/=count;
50934a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
50945c4e2586d27d4299a742d170d41105de1689aa46cristy      }
50955c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
50965c4e2586d27d4299a742d170d41105de1689aa46cristy    }
5097cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
5098cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
5099cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5100cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
5101cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
5102cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5103cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
5104cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
5105cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
510650e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
5107cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      {
5108cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        PointInfo
5109cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          delta,
5110cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          epsilon;
5111cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
51125a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
51135a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
51145a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
51155a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
5116cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if ((traits == UndefinedPixelTrait) ||
5117cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            (destination_traits == UndefinedPixelTrait))
5118cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          continue;
5119cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta.x=x-x_offset;
5120cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta.y=y-y_offset;
5121cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon.x=1.0-delta.x;
5122cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon.y=1.0-delta.y;
5123a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[0]=(double) p[i];
5124a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[1]=(double) p[GetPixelChannels(source)+i];
5125a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[2]=(double) p[2*GetPixelChannels(source)+i];
5126a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[3]=(double) p[3*GetPixelChannels(source)+i];
5127cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if ((traits & BlendPixelTrait) == 0)
5128cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          {
5129cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
51303e3ec3afbb0782697f201cbe30a56794c10dc7efcristy            gamma=PerceptibleReciprocal(gamma);
5131cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
5132cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*
5133cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              pixels[2]+delta.x*pixels[3]))),pixel);
5134cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            continue;
5135cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          }
5136cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[0]=QuantumScale*GetPixelAlpha(source,p);
5137cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source));
5138cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
5139cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          GetPixelChannels(source));
5140cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
5141cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          GetPixelChannels(source));
5142cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0]*=alpha[0];
5143cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1]*=alpha[1];
5144cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[2]*=alpha[2];
5145cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3]*=alpha[3];
5146cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
5147cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          (epsilon.x*alpha[2]+delta.x*alpha[3])));
51483e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        gamma=PerceptibleReciprocal(gamma);
5149cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
5150cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+
5151cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          delta.x*pixels[3]))),pixel);
5152cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
5153cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5154cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
51555f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    case BlendInterpolatePixel:
51565f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    {
51575f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
51585f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if (p == (const Quantum *) NULL)
51595f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
51605f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          status=MagickFalse;
51615f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          break;
51625f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
51635f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
51645f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      {
51655f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        register ssize_t
51665f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          j;
51675f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony
51685a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
51695a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
51705a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
51715a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
51725f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        if ((traits == UndefinedPixelTrait) ||
51735f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            (destination_traits == UndefinedPixelTrait))
51745f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          continue;
51757750effcebd739b5cdea24dcda588d2d8d1d8732dirk        if (source->alpha_trait != BlendPixelTrait)
51765f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          for (j=0; j < 4; j++)
51775f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          {
51785f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            alpha[j]=1.0;
51797750effcebd739b5cdea24dcda588d2d8d1d8732dirk            pixels[j]=(double) p[j*GetPixelChannels(source)+i];
51805f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          }
51815f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        else
51825f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          for (j=0; j < 4; j++)
51835f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          {
51845f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
51855f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony              GetPixelChannels(source));
51867750effcebd739b5cdea24dcda588d2d8d1d8732dirk            pixels[j]=(double) p[j*GetPixelChannels(source)+i];
51877750effcebd739b5cdea24dcda588d2d8d1d8732dirk            if (channel != AlphaPixelChannel)
51887750effcebd739b5cdea24dcda588d2d8d1d8732dirk              pixels[j]*=alpha[j];
51895f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          }
5190fb12237dd6e4d4d8b92d879661153062eeca0572cristy        gamma=1.0;  /* number of pixels blended together (its variable) */
5191fb12237dd6e4d4d8b92d879661153062eeca0572cristy        for (j=0; j <= 1L; j++)
5192fb12237dd6e4d4d8b92d879661153062eeca0572cristy        {
5193fb12237dd6e4d4d8b92d879661153062eeca0572cristy          if ((y-y_offset) >= 0.75)
5194fb12237dd6e4d4d8b92d879661153062eeca0572cristy            {
5195fb12237dd6e4d4d8b92d879661153062eeca0572cristy              alpha[j]=alpha[j+2];  /* take right pixels */
5196fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[j]=pixels[j+2];
5197fb12237dd6e4d4d8b92d879661153062eeca0572cristy            }
5198fb12237dd6e4d4d8b92d879661153062eeca0572cristy          else
5199fb12237dd6e4d4d8b92d879661153062eeca0572cristy            if ((y-y_offset) > 0.25)
5200fb12237dd6e4d4d8b92d879661153062eeca0572cristy              {
520158ee5018960b42b80b54398eacabe9ae5da89149cristy                gamma=2.0;  /* blend both pixels in row */
5202fb12237dd6e4d4d8b92d879661153062eeca0572cristy                alpha[j]+=alpha[j+2];  /* add up alpha weights */
5203fb12237dd6e4d4d8b92d879661153062eeca0572cristy                pixels[j]+=pixels[j+2];
5204fb12237dd6e4d4d8b92d879661153062eeca0572cristy              }
52055f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
5206fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((x-x_offset) >= 0.75)
5207fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
5208fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[0]=alpha[1];  /* take bottom row blend */
5209fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0]=pixels[1];
5210fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
5211fb12237dd6e4d4d8b92d879661153062eeca0572cristy        else
5212fb12237dd6e4d4d8b92d879661153062eeca0572cristy           if ((x-x_offset) > 0.25)
5213fb12237dd6e4d4d8b92d879661153062eeca0572cristy             {
5214fb12237dd6e4d4d8b92d879661153062eeca0572cristy               gamma*=2.0;  /* blend both rows */
5215fb12237dd6e4d4d8b92d879661153062eeca0572cristy               alpha[0]+=alpha[1];  /* add up alpha weights */
5216fb12237dd6e4d4d8b92d879661153062eeca0572cristy               pixels[0]+=pixels[1];
5217fb12237dd6e4d4d8b92d879661153062eeca0572cristy             }
52187750effcebd739b5cdea24dcda588d2d8d1d8732dirk        if (channel != AlphaPixelChannel)
521958ee5018960b42b80b54398eacabe9ae5da89149cristy          gamma=PerceptibleReciprocal(alpha[0]);  /* (color) 1/alpha_weights */
52205f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        else
522158ee5018960b42b80b54398eacabe9ae5da89149cristy          gamma=PerceptibleReciprocal(gamma);  /* (alpha) 1/number_of_pixels */
52225f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        SetPixelChannel(destination,channel,ClampToQuantum(gamma*pixels[0]),
5223fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixel);
52245f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      }
52255f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      break;
52265f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    }
5227cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
52285c4e2586d27d4299a742d170d41105de1689aa46cristy    {
5229a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5230380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
5231380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cy[4];
52325c4e2586d27d4299a742d170d41105de1689aa46cristy
52335c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
52345c4e2586d27d4299a742d170d41105de1689aa46cristy        exception);
52355c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
52365c4e2586d27d4299a742d170d41105de1689aa46cristy        {
52375c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
52385c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
52395c4e2586d27d4299a742d170d41105de1689aa46cristy        }
524050e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
52415c4e2586d27d4299a742d170d41105de1689aa46cristy      {
52425c4e2586d27d4299a742d170d41105de1689aa46cristy        register ssize_t
52435c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
52445c4e2586d27d4299a742d170d41105de1689aa46cristy
52455a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
52465a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
52475a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
52485a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
52495c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
52505c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
52515c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
52525c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
52535c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
52545c4e2586d27d4299a742d170d41105de1689aa46cristy          {
52555c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=1.0;
5256a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy            pixels[j]=(double) p[j*GetPixelChannels(source)+i];
52575c4e2586d27d4299a742d170d41105de1689aa46cristy          }
52585c4e2586d27d4299a742d170d41105de1689aa46cristy        else
52595c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
52605c4e2586d27d4299a742d170d41105de1689aa46cristy          {
52615c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
52625c4e2586d27d4299a742d170d41105de1689aa46cristy              GetPixelChannels(source));
52635c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
52645c4e2586d27d4299a742d170d41105de1689aa46cristy          }
5265a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        CatromWeights((double) (x-x_offset),&cx);
5266a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        CatromWeights((double) (y-y_offset),&cy);
5267a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        gamma=((traits & BlendPixelTrait) ? (double) (1.0) :
52683e3ec3afbb0782697f201cbe30a56794c10dc7efcristy          PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
5269d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
5270d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
5271d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
5272d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cx[2]*alpha[14]+cx[3]*alpha[15])));
5273380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
5274380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
5275380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
5276380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
5277d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
5278d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[14]+cx[3]*pixels[15]))),pixel);
52795c4e2586d27d4299a742d170d41105de1689aa46cristy      }
52805c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
52815c4e2586d27d4299a742d170d41105de1689aa46cristy    }
52825c4e2586d27d4299a742d170d41105de1689aa46cristy    case IntegerInterpolatePixel:
52835c4e2586d27d4299a742d170d41105de1689aa46cristy    {
52845c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
52855c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
52865c4e2586d27d4299a742d170d41105de1689aa46cristy        {
52875c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
52885c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
52895c4e2586d27d4299a742d170d41105de1689aa46cristy        }
529050e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
52915c4e2586d27d4299a742d170d41105de1689aa46cristy      {
52925a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
52935a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
52945a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
52955a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
52965c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
52975c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
52985c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
52994a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,p[i],pixel);
53005c4e2586d27d4299a742d170d41105de1689aa46cristy      }
53015c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
53025c4e2586d27d4299a742d170d41105de1689aa46cristy    }
5303cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
53045c4e2586d27d4299a742d170d41105de1689aa46cristy    {
5305cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
5306cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
5307cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
53085c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
53095c4e2586d27d4299a742d170d41105de1689aa46cristy        {
53105c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
53115c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
53125c4e2586d27d4299a742d170d41105de1689aa46cristy        }
531350e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
53145c4e2586d27d4299a742d170d41105de1689aa46cristy      {
53155a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
53165a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
53175a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
53185a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
53195c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
53205c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
53215c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
53224a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,p[i],pixel);
53235c4e2586d27d4299a742d170d41105de1689aa46cristy      }
53245c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
53255c4e2586d27d4299a742d170d41105de1689aa46cristy    }
53265c4e2586d27d4299a742d170d41105de1689aa46cristy    case MeshInterpolatePixel:
53275c4e2586d27d4299a742d170d41105de1689aa46cristy    {
53285c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
53295c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
53305c4e2586d27d4299a742d170d41105de1689aa46cristy        {
53315c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
53325c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
53335c4e2586d27d4299a742d170d41105de1689aa46cristy        }
533450e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
53355c4e2586d27d4299a742d170d41105de1689aa46cristy      {
53365c4e2586d27d4299a742d170d41105de1689aa46cristy        PointInfo
53375c4e2586d27d4299a742d170d41105de1689aa46cristy          delta,
53385c4e2586d27d4299a742d170d41105de1689aa46cristy          luminance;
53395c4e2586d27d4299a742d170d41105de1689aa46cristy
53405a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
53415a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
53425a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
53435a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
53445c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
53455c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
53465c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
5347a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[0]=(double) p[i];
5348a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[1]=(double) p[GetPixelChannels(source)+i];
5349a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[2]=(double) p[2*GetPixelChannels(source)+i];
5350a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[3]=(double) p[3*GetPixelChannels(source)+i];
53511861c90c5c8c4ceb56885dd86377412aae0f4526cristy        if ((traits & BlendPixelTrait) == 0)
53521861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
53531861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[0]=1.0;
53541861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[1]=1.0;
53551861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[2]=1.0;
53561861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[3]=1.0;
53571861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
53581861c90c5c8c4ceb56885dd86377412aae0f4526cristy        else
53591861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
53601861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[0]=QuantumScale*GetPixelAlpha(source,p);
53611861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[1]=QuantumScale*GetPixelAlpha(source,p+
53621861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
53631861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
53641861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
53651861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
53661861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
53671861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
53681861c90c5c8c4ceb56885dd86377412aae0f4526cristy        delta.x=x-x_offset;
53691861c90c5c8c4ceb56885dd86377412aae0f4526cristy        delta.y=y-y_offset;
5370ebfaacf0542df42a5beaa9b81a017992e838df70cristy        luminance.x=fabs((double) (GetPixelLuma(source,p)-
5371ebfaacf0542df42a5beaa9b81a017992e838df70cristy          GetPixelLuma(source,p+3*GetPixelChannels(source))));
5372ebfaacf0542df42a5beaa9b81a017992e838df70cristy        luminance.y=fabs((double) (GetPixelLuma(source,p+
5373ebfaacf0542df42a5beaa9b81a017992e838df70cristy          GetPixelChannels(source))-GetPixelLuma(source,p+2*
5374fb12237dd6e4d4d8b92d879661153062eeca0572cristy          GetPixelChannels(source))));
5375cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if (luminance.x < luminance.y)
53761861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
53771861c90c5c8c4ceb56885dd86377412aae0f4526cristy            /*
53781861c90c5c8c4ceb56885dd86377412aae0f4526cristy              Diagonal 0-3 NW-SE.
53791861c90c5c8c4ceb56885dd86377412aae0f4526cristy            */
53801861c90c5c8c4ceb56885dd86377412aae0f4526cristy            if (delta.x <= delta.y)
53811861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
53821861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
53831861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Bottom-left triangle (pixel: 2, diagonal: 0-3).
53841861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
53851861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.y=1.0-delta.y;
53861861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
53873e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
53884a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
53894a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[2],pixels[3],pixels[0])),pixel);
53901861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
53911861c90c5c8c4ceb56885dd86377412aae0f4526cristy            else
53921861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
53931861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
53941861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Top-right triangle (pixel: 1, diagonal: 0-3).
53951861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
53961861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.x=1.0-delta.x;
53971861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
53983e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
53994a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
54004a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[1],pixels[0],pixels[3])),pixel);
54011861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
54021861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
54031861c90c5c8c4ceb56885dd86377412aae0f4526cristy        else
54041861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
54051861c90c5c8c4ceb56885dd86377412aae0f4526cristy            /*
54061861c90c5c8c4ceb56885dd86377412aae0f4526cristy              Diagonal 1-2 NE-SW.
54071861c90c5c8c4ceb56885dd86377412aae0f4526cristy            */
54081861c90c5c8c4ceb56885dd86377412aae0f4526cristy            if (delta.x <= (1.0-delta.y))
54091861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
54101861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
54111861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Top-left triangle (pixel: 0, diagonal: 1-2).
54121861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
54131861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
54143e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
54154a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
54164a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[0],pixels[1],pixels[2])),pixel);
54171861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
54181861c90c5c8c4ceb56885dd86377412aae0f4526cristy            else
54191861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
54201861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
54211861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Bottom-right triangle (pixel: 3, diagonal: 1-2).
54221861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
54231861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.x=1.0-delta.x;
54241861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.y=1.0-delta.y;
54251861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
54263e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
54274a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
54284a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[3],pixels[2],pixels[1])),pixel);
54291861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
54301861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
54315c4e2586d27d4299a742d170d41105de1689aa46cristy      }
54325c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
54335c4e2586d27d4299a742d170d41105de1689aa46cristy    }
54345c4e2586d27d4299a742d170d41105de1689aa46cristy    case SplineInterpolatePixel:
54355c4e2586d27d4299a742d170d41105de1689aa46cristy    {
5436a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5437d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
5438d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cy[4];
5439d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas
54405c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
54415c4e2586d27d4299a742d170d41105de1689aa46cristy        exception);
54425c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
54435c4e2586d27d4299a742d170d41105de1689aa46cristy        {
54445c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
54455c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
54465c4e2586d27d4299a742d170d41105de1689aa46cristy        }
544750e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
54485c4e2586d27d4299a742d170d41105de1689aa46cristy      {
54495c4e2586d27d4299a742d170d41105de1689aa46cristy        register ssize_t
54505c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
54515c4e2586d27d4299a742d170d41105de1689aa46cristy
54525a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
54535a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
54545a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
54555a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
54565c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
54575c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
54585c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
54595c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
54605c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
54615c4e2586d27d4299a742d170d41105de1689aa46cristy          {
54625c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=1.0;
5463a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy            pixels[j]=(double) p[j*GetPixelChannels(source)+i];
54645c4e2586d27d4299a742d170d41105de1689aa46cristy          }
54655c4e2586d27d4299a742d170d41105de1689aa46cristy        else
54665c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
54675c4e2586d27d4299a742d170d41105de1689aa46cristy          {
54685c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
54695c4e2586d27d4299a742d170d41105de1689aa46cristy              GetPixelChannels(source));
54705c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
54715c4e2586d27d4299a742d170d41105de1689aa46cristy          }
5472a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        SplineWeights((double) (x-x_offset),&cx);
5473a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        SplineWeights((double) (y-y_offset),&cy);
5474a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        gamma=((traits & BlendPixelTrait) ? (double) (1.0) :
54753e3ec3afbb0782697f201cbe30a56794c10dc7efcristy          PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
5476d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
5477d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
5478d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
5479d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cx[2]*alpha[14]+cx[3]*alpha[15])));
5480d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
5481d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
5482d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
5483d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
5484d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
5485d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[14]+cx[3]*pixels[15]))),pixel);
54865c4e2586d27d4299a742d170d41105de1689aa46cristy      }
54875c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
54885c4e2586d27d4299a742d170d41105de1689aa46cristy    }
54895c4e2586d27d4299a742d170d41105de1689aa46cristy  }
54905c4e2586d27d4299a742d170d41105de1689aa46cristy  return(status);
54915c4e2586d27d4299a742d170d41105de1689aa46cristy}
54925c4e2586d27d4299a742d170d41105de1689aa46cristy
54935c4e2586d27d4299a742d170d41105de1689aa46cristy/*
54945c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54955c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
54965c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
54975c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
54989075cdb062fda00666ab37b0ba7df4b8cc2e8eaccristy%   I n t e r p o l a t e P i x e l I n f o                                   %
5499d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5500d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5501d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5502d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5503d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5504884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  InterpolatePixelInfo() applies a pixel interpolation method between a
5505884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
5506884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  pixel area resampling, or scaling of the result is performed.
5507d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5508cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just RGBKA channels.
5509cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
55104c08aed51c5899665ade97263692328eea4af106cristy%  The format of the InterpolatePixelInfo method is:
5511d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
55124c08aed51c5899665ade97263692328eea4af106cristy%      MagickBooleanType InterpolatePixelInfo(const Image *image,
55135c4e2586d27d4299a742d170d41105de1689aa46cristy%        const CacheView *image_view,const PixelInterpolateMethod method,
55144c08aed51c5899665ade97263692328eea4af106cristy%        const double x,const double y,PixelInfo *pixel,
5515d76c51ed30cf4084f4434ba08925d16001d1e340cristy%        ExceptionInfo *exception)
5516d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5517d76c51ed30cf4084f4434ba08925d16001d1e340cristy%  A description of each parameter follows:
5518d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5519d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o image: the image.
5520d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5521d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o image_view: the image view.
5522d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5523d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o method: the pixel color interpolation method.
5524d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5525d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o x,y: A double representing the current (x,y) position of the pixel.
5526d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5527d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o pixel: return the interpolated pixel here.
5528d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5529d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o exception: return any errors or warnings in this structure.
5530d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5531d76c51ed30cf4084f4434ba08925d16001d1e340cristy*/
5532d76c51ed30cf4084f4434ba08925d16001d1e340cristy
55334c08aed51c5899665ade97263692328eea4af106cristystatic inline void AlphaBlendPixelInfo(const Image *image,
5534a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  const Quantum *pixel,PixelInfo *pixel_info,double *alpha)
5535d76c51ed30cf4084f4434ba08925d16001d1e340cristy{
553617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy  if (image->alpha_trait == UndefinedPixelTrait)
5537241310d359ef6893f4d0c1e43eeb39f34991fd2acristy    {
5538241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      *alpha=1.0;
5539a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->red=(double) GetPixelRed(image,pixel);
5540a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->green=(double) GetPixelGreen(image,pixel);
5541a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->blue=(double) GetPixelBlue(image,pixel);
55424c08aed51c5899665ade97263692328eea4af106cristy      pixel_info->black=0.0;
55434c08aed51c5899665ade97263692328eea4af106cristy      if (image->colorspace == CMYKColorspace)
5544a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixel_info->black=(double) GetPixelBlack(image,pixel);
5545a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->alpha=(double) GetPixelAlpha(image,pixel);
5546241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      return;
5547241310d359ef6893f4d0c1e43eeb39f34991fd2acristy    }
55484c08aed51c5899665ade97263692328eea4af106cristy  *alpha=QuantumScale*GetPixelAlpha(image,pixel);
55494c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->red=(*alpha*GetPixelRed(image,pixel));
55504c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->green=(*alpha*GetPixelGreen(image,pixel));
55514c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->blue=(*alpha*GetPixelBlue(image,pixel));
55524c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->black=0.0;
55534c08aed51c5899665ade97263692328eea4af106cristy  if (image->colorspace == CMYKColorspace)
55544c08aed51c5899665ade97263692328eea4af106cristy    pixel_info->black=(*alpha*GetPixelBlack(image,pixel));
5555a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel_info->alpha=(double) GetPixelAlpha(image,pixel);
5556d76c51ed30cf4084f4434ba08925d16001d1e340cristy}
5557d76c51ed30cf4084f4434ba08925d16001d1e340cristy
55584c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
555939fee9a56b751a52fb8b73d39836d48bc80cb35fdirk  const CacheView_ *image_view,const PixelInterpolateMethod method,
55604c08aed51c5899665ade97263692328eea4af106cristy  const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception)
5561d76c51ed30cf4084f4434ba08925d16001d1e340cristy{
5562d76c51ed30cf4084f4434ba08925d16001d1e340cristy  MagickBooleanType
5563d76c51ed30cf4084f4434ba08925d16001d1e340cristy    status;
5564d76c51ed30cf4084f4434ba08925d16001d1e340cristy
5565a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
556642587c577d5b808de94915f2388b88b05c3d43a3cristy    alpha[16],
556742587c577d5b808de94915f2388b88b05c3d43a3cristy    gamma;
556842587c577d5b808de94915f2388b88b05c3d43a3cristy
5569865d58d60e5fc755d47771eab37ce5159531629dcristy  PixelInfo
5570865d58d60e5fc755d47771eab37ce5159531629dcristy    pixels[16];
5571865d58d60e5fc755d47771eab37ce5159531629dcristy
55724c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
5573d76c51ed30cf4084f4434ba08925d16001d1e340cristy    *p;
5574d76c51ed30cf4084f4434ba08925d16001d1e340cristy
557550e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
5576d76c51ed30cf4084f4434ba08925d16001d1e340cristy    i;
5577d76c51ed30cf4084f4434ba08925d16001d1e340cristy
557842587c577d5b808de94915f2388b88b05c3d43a3cristy  ssize_t
557942587c577d5b808de94915f2388b88b05c3d43a3cristy    x_offset,
558042587c577d5b808de94915f2388b88b05c3d43a3cristy    y_offset;
558142587c577d5b808de94915f2388b88b05c3d43a3cristy
5582cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  PixelInterpolateMethod
5583cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate;
5584cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5585d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image != (Image *) NULL);
5586e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
5587d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image_view != (CacheView *) NULL);
5588d76c51ed30cf4084f4434ba08925d16001d1e340cristy  status=MagickTrue;
558942587c577d5b808de94915f2388b88b05c3d43a3cristy  x_offset=(ssize_t) floor(x);
559042587c577d5b808de94915f2388b88b05c3d43a3cristy  y_offset=(ssize_t) floor(y);
5591cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy  interpolate=method;
5592cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy  if (interpolate == UndefinedInterpolatePixel)
5593cfc71b1f9ffb73f906c5b9c10b2d9b89f1c51fa9cristy    interpolate=image->interpolate;
5594ccad00b02d1242dc1c039f9979337e00f69212e8dirk  (void) ResetMagickMemory(&pixels,0,sizeof(pixels));
5595cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
5596d76c51ed30cf4084f4434ba08925d16001d1e340cristy  {
559758ee5018960b42b80b54398eacabe9ae5da89149cristy    case AverageInterpolatePixel:  /* nearest 4 neighbours */
559858ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average9InterpolatePixel:  /* nearest 9 neighbours */
559958ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average16InterpolatePixel:  /* nearest 16 neighbours */
5600d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5601fb12237dd6e4d4d8b92d879661153062eeca0572cristy      ssize_t
5602fb12237dd6e4d4d8b92d879661153062eeca0572cristy        count;
5603cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5604fb12237dd6e4d4d8b92d879661153062eeca0572cristy      count=2;  /* size of the area to average - default nearest 4 */
5605cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
5606cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5607cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
5608cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
5609cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
5610cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5611cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else if (interpolate == Average16InterpolatePixel)
5612cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5613cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=4;
5614cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset--;
5615cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset--;
5616cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5617021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count,
5618021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        (size_t) count,exception);
56194c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5620d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5621d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5622d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5623d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5624241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->red=0.0;
5625241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->green=0.0;
5626241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->blue=0.0;
56274c08aed51c5899665ade97263692328eea4af106cristy      pixel->black=0.0;
5628865d58d60e5fc755d47771eab37ce5159531629dcristy      pixel->alpha=0.0;
562958ee5018960b42b80b54398eacabe9ae5da89149cristy      count*=count;  /* number of pixels - square of size */
563050e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) count; i++)
5631cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      {
5632cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p,pixels,alpha);
56333e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        gamma=PerceptibleReciprocal(alpha[0]);
5634fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->red+=gamma*pixels[0].red;
5635fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->green+=gamma*pixels[0].green;
5636fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->blue+=gamma*pixels[0].blue;
5637fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->black+=gamma*pixels[0].black;
5638fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->alpha+=pixels[0].alpha;
5639cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        p += GetPixelChannels(image);
5640cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
5641cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=1.0/count;   /* average weighting of each pixel in area */
5642fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red*=gamma;
5643fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green*=gamma;
5644fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue*=gamma;
5645fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->black*=gamma;
5646fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha*=gamma;
5647cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5648cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5649cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BackgroundInterpolatePixel:
5650cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5651fb12237dd6e4d4d8b92d879661153062eeca0572cristy      *pixel=image->background_color;  /* Copy PixelInfo Structure  */
5652d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5653d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5654cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
5655cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
5656cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5657cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      PointInfo
5658cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta,
5659cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon;
5660cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5661cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5662cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
5663cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5664cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
5665cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
5666cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5667cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 4L; i++)
5668cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5669cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.x=x-x_offset;
5670cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.y=y-y_offset;
5671cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.x=1.0-delta.x;
5672cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.y=1.0-delta.y;
5673cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
5674cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*alpha[2]+delta.x*alpha[3])));
56753e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      gamma=PerceptibleReciprocal(gamma);
5676cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x*
5677cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red));
5678cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x*
5679cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x*
5680cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].green));
5681cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x*
5682cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x*
5683cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].blue));
5684cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (image->colorspace == CMYKColorspace)
5685cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x*
5686cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x*
5687cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[3].black));
5688cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
56893e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      gamma=PerceptibleReciprocal(gamma);
5690554f4e55b6a472298c8986827fedc07174890de6cristy      pixel->alpha=gamma*(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x*
5691cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x*
5692cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].alpha));
5693cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5694cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5695cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BlendInterpolatePixel:
5696cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5697cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5698cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
5699cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5700cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
5701cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
5702cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5703cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 4L; i++)
5704e26356f969a4160ff16680cd348b928633caaaebcristy      {
5705e26356f969a4160ff16680cd348b928633caaaebcristy        GetPixelInfoPixel(image,p+i*GetPixelChannels(image),pixels+i);
5706cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5707e26356f969a4160ff16680cd348b928633caaaebcristy      }
5708fb12237dd6e4d4d8b92d879661153062eeca0572cristy      gamma=1.0;  /* number of pixels blended together (its variable) */
5709fb12237dd6e4d4d8b92d879661153062eeca0572cristy      for (i=0; i <= 1L; i++)
5710fb12237dd6e4d4d8b92d879661153062eeca0572cristy      {
5711fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((y-y_offset) >= 0.75)
5712fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
5713fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[i]=alpha[i+2];  /* take right pixels */
5714fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[i]=pixels[i+2];
5715fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
5716fb12237dd6e4d4d8b92d879661153062eeca0572cristy        else
5717fb12237dd6e4d4d8b92d879661153062eeca0572cristy          if ((y-y_offset) > 0.25)
5718fb12237dd6e4d4d8b92d879661153062eeca0572cristy            {
5719fb12237dd6e4d4d8b92d879661153062eeca0572cristy              gamma=2.0;  /* blend both pixels in row */
5720fb12237dd6e4d4d8b92d879661153062eeca0572cristy              alpha[i]+=alpha[i+2];  /* add up alpha weights */
5721fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].red+=pixels[i+2].red;
5722fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].green+=pixels[i+2].green;
5723fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].blue+=pixels[i+2].blue;
5724fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].black+=pixels[i+2].black;
5725fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].alpha+=pixels[i+2].alpha;
5726fb12237dd6e4d4d8b92d879661153062eeca0572cristy            }
5727fb12237dd6e4d4d8b92d879661153062eeca0572cristy      }
5728fb12237dd6e4d4d8b92d879661153062eeca0572cristy      if ((x-x_offset) >= 0.75)
5729fb12237dd6e4d4d8b92d879661153062eeca0572cristy        {
5730fb12237dd6e4d4d8b92d879661153062eeca0572cristy          alpha[0]=alpha[1];
5731fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[0]=pixels[1];
5732fb12237dd6e4d4d8b92d879661153062eeca0572cristy        }
5733fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
5734fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((x-x_offset) > 0.25)
5735fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
5736fb12237dd6e4d4d8b92d879661153062eeca0572cristy            gamma*=2.0;  /* blend both rows */
573758ee5018960b42b80b54398eacabe9ae5da89149cristy            alpha[0]+= alpha[1];  /* add up alpha weights */
5738fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].red+=pixels[1].red;
5739fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].green+=pixels[1].green;
5740fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].blue+=pixels[1].blue;
5741fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].black+=pixels[1].black;
5742fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].alpha+=pixels[1].alpha;
5743fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
5744fb12237dd6e4d4d8b92d879661153062eeca0572cristy      gamma=1.0/gamma;
57453e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      alpha[0]=PerceptibleReciprocal(alpha[0]);
5746fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red=alpha[0]*pixels[0].red;
5747fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green=alpha[0]*pixels[0].green;  /* divide by sum of alpha */
5748fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue=alpha[0]*pixels[0].blue;
5749fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->black=alpha[0]*pixels[0].black;
5750fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha=gamma*pixels[0].alpha;   /* divide by number of pixels */
5751cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5752cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5753cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
5754d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5755a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5756380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
5757380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cy[4];
5758d76c51ed30cf4084f4434ba08925d16001d1e340cristy
575942587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
576042587c577d5b808de94915f2388b88b05c3d43a3cristy        exception);
57614c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5762d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5763d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5764d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5765d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5766cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 16L; i++)
5767cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5768a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (x-x_offset),&cx);
5769a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (y-y_offset),&cy);
5770fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*pixels[1].red+cx[2]*
5771fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].red+cx[3]*pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5772fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].red+cx[2]*pixels[6].red+cx[3]*pixels[7].red)+cy[2]*(cx[0]*
5773fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].red+cx[1]*pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5774fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*pixels[13].red+cx[2]*
5775fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[14].red+cx[3]*pixels[15].red));
5776fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*pixels[1].green+cx[2]*
5777fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].green+cx[3]*pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+
5778fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].green+cx[2]*pixels[6].green+cx[3]*pixels[7].green)+
5779fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].green+cx[1]*pixels[9].green+cx[2]*
5780fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].green+cx[3]*pixels[11].green)+cy[3]*(cx[0]*
5781fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[12].green+cx[1]*pixels[13].green+cx[2]*pixels[14].green+cx[3]*
5782fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[15].green));
5783fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*pixels[1].blue+cx[2]*
5784fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].blue+cx[3]*pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5785fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*pixels[7].blue)+cy[2]*(cx[0]*
5786fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].blue+cx[1]*pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5787fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*pixels[13].blue+
5788fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5789380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      if (image->colorspace == CMYKColorspace)
5790fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*pixels[1].black+cx[2]*
5791fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[2].black+cx[3]*pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+
5792fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cx[1]*pixels[5].black+cx[2]*pixels[6].black+cx[3]*pixels[7].black)+
5793fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cy[2]*(cx[0]*pixels[8].black+cx[1]*pixels[9].black+cx[2]*
5794fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[10].black+cx[3]*pixels[11].black)+cy[3]*(cx[0]*
5795fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[12].black+cx[1]*pixels[13].black+cx[2]*pixels[14].black+cx[3]*
5796fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[15].black));
5797fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*pixels[1].alpha+cx[2]*
5798fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].alpha+cx[3]*pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+
5799fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*pixels[7].alpha)+
5800fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].alpha+cx[1]*pixels[9].alpha+cx[2]*
5801fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].alpha+cx[3]*pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+
5802fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5803d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5804d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5805d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case IntegerInterpolatePixel:
5806d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
580742587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
58084c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5809d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5810d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5811d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5812d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5813803640d20a6a664315eddfff6f8531d0c5e0871dcristy      GetPixelInfoPixel(image,p,pixel);
5814d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5815d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5816d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case MeshInterpolatePixel:
5817d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5818d76c51ed30cf4084f4434ba08925d16001d1e340cristy      PointInfo
5819d76c51ed30cf4084f4434ba08925d16001d1e340cristy        delta,
5820d76c51ed30cf4084f4434ba08925d16001d1e340cristy        luminance;
5821d76c51ed30cf4084f4434ba08925d16001d1e340cristy
582294ea1636709395774d7118ef56162d211904cfd2cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
58234c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5824d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5825d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5826d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5827d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
582894ea1636709395774d7118ef56162d211904cfd2cristy      delta.x=x-x_offset;
582994ea1636709395774d7118ef56162d211904cfd2cristy      delta.y=y-y_offset;
5830ebfaacf0542df42a5beaa9b81a017992e838df70cristy      luminance.x=GetPixelLuma(image,p)-(double)
5831ebfaacf0542df42a5beaa9b81a017992e838df70cristy        GetPixelLuma(image,p+3*GetPixelChannels(image));
5832ebfaacf0542df42a5beaa9b81a017992e838df70cristy      luminance.y=GetPixelLuma(image,p+GetPixelChannels(image))-(double)
5833ebfaacf0542df42a5beaa9b81a017992e838df70cristy        GetPixelLuma(image,p+2*GetPixelChannels(image));
58345ce8df84afcfec6dc33ee61ac2014edb3871c455cristy      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
583528474bfbda5ee2d4da2eb79f299cf1f692770b99cristy      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
5836ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
5837ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
5838d76c51ed30cf4084f4434ba08925d16001d1e340cristy      if (fabs(luminance.x) < fabs(luminance.y))
5839d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5840d76c51ed30cf4084f4434ba08925d16001d1e340cristy          /*
5841d76c51ed30cf4084f4434ba08925d16001d1e340cristy            Diagonal 0-3 NW-SE.
5842d76c51ed30cf4084f4434ba08925d16001d1e340cristy          */
5843d76c51ed30cf4084f4434ba08925d16001d1e340cristy          if (delta.x <= delta.y)
5844d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5845d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
584694ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-left triangle (pixel: 2, diagonal: 0-3).
5847d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5848d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.y=1.0-delta.y;
5849d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
58503e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5851d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
5852d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].red,pixels[0].red);
5853d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
5854d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].green,pixels[0].green);
5855d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
5856d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].blue,pixels[0].blue);
58575af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
58584c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black,
58594c08aed51c5899665ade97263692328eea4af106cristy                  pixels[3].black,pixels[0].black);
586094ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5861865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha,
5862865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[3].alpha,pixels[0].alpha);
5863d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5864d76c51ed30cf4084f4434ba08925d16001d1e340cristy          else
5865d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5866d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
586794ea1636709395774d7118ef56162d211904cfd2cristy                Top-right triangle (pixel:1 , diagonal: 0-3).
5868d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5869d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.x=1.0-delta.x;
5870d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
58713e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5872d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
5873d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].red,pixels[3].red);
5874d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
5875d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].green,pixels[3].green);
5876d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
5877d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].blue,pixels[3].blue);
58785af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
58794c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black,
58804c08aed51c5899665ade97263692328eea4af106cristy                  pixels[0].black,pixels[3].black);
588194ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5882865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha,
5883865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[0].alpha,pixels[3].alpha);
5884d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5885d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5886d76c51ed30cf4084f4434ba08925d16001d1e340cristy      else
5887d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5888d76c51ed30cf4084f4434ba08925d16001d1e340cristy          /*
5889d76c51ed30cf4084f4434ba08925d16001d1e340cristy            Diagonal 1-2 NE-SW.
5890d76c51ed30cf4084f4434ba08925d16001d1e340cristy          */
5891d76c51ed30cf4084f4434ba08925d16001d1e340cristy          if (delta.x <= (1.0-delta.y))
5892d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5893d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
589494ea1636709395774d7118ef56162d211904cfd2cristy                Top-left triangle (pixel: 0, diagonal: 1-2).
5895d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5896d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
58973e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5898d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
5899d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].red,pixels[2].red);
5900d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
5901d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].green,pixels[2].green);
5902d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
5903d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].blue,pixels[2].blue);
59045af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
59054c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black,
59064c08aed51c5899665ade97263692328eea4af106cristy                  pixels[1].black,pixels[2].black);
590794ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5908865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha,
5909865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[1].alpha,pixels[2].alpha);
5910d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5911d76c51ed30cf4084f4434ba08925d16001d1e340cristy          else
5912d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5913d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
5914d76c51ed30cf4084f4434ba08925d16001d1e340cristy                Bottom-right triangle (pixel: 3, diagonal: 1-2).
5915d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5916d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.x=1.0-delta.x;
5917d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.y=1.0-delta.y;
5918d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
59193e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5920d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
5921d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].red,pixels[1].red);
5922d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
5923d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].green,pixels[1].green);
5924d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
5925d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].blue,pixels[1].blue);
59265af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
59274c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black,
59284c08aed51c5899665ade97263692328eea4af106cristy                  pixels[2].black,pixels[1].black);
592994ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5930865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha,
5931865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[2].alpha,pixels[1].alpha);
5932d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5933d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5934d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5935d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5936cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
5937d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5938cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
5939cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
5940cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
59414c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5942d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5943d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5944d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5945d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5946803640d20a6a664315eddfff6f8531d0c5e0871dcristy      GetPixelInfoPixel(image,p,pixel);
5947d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5948d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5949d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case SplineInterpolatePixel:
5950d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5951a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5952d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
5953d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cy[4];
5954d76c51ed30cf4084f4434ba08925d16001d1e340cristy
595542587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
595642587c577d5b808de94915f2388b88b05c3d43a3cristy        exception);
59574c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5958d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5959d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5960d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5961d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5962cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 16L; i++)
5963cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5964a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (x-x_offset),&cx);
5965a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (y-y_offset),&cy);
5966fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*pixels[1].red+cx[2]*
5967fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].red+cx[3]*pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5968fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].red+cx[2]*pixels[6].red+cx[3]*pixels[7].red)+cy[2]*(cx[0]*
5969fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].red+cx[1]*pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5970fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*pixels[13].red+cx[2]*
5971fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[14].red+cx[3]*pixels[15].red));
5972fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*pixels[1].green+cx[2]*
5973fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].green+cx[3]*pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+
5974fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].green+cx[2]*pixels[6].green+cx[3]*pixels[7].green)+
5975fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].green+cx[1]*pixels[9].green+cx[2]*
5976fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].green+cx[3]*pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+
5977fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green));
5978fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*pixels[1].blue+cx[2]*
5979fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].blue+cx[3]*pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5980fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*pixels[7].blue)+cy[2]*(cx[0]*
5981fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].blue+cx[1]*pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5982fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*pixels[13].blue+
5983fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5984d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      if (image->colorspace == CMYKColorspace)
5985fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*pixels[1].black+cx[2]*
5986fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[2].black+cx[3]*pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+
5987fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cx[1]*pixels[5].black+cx[2]*pixels[6].black+cx[3]*pixels[7].black)+
5988fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cy[2]*(cx[0]*pixels[8].black+cx[1]*pixels[9].black+cx[2]*
5989fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[10].black+cx[3]*pixels[11].black)+cy[3]*(cx[0]*
5990fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[12].black+cx[1]*pixels[13].black+cx[2]*pixels[14].black+cx[3]*
5991fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[15].black));
5992fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*pixels[1].alpha+cx[2]*
5993fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].alpha+cx[3]*pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+
5994fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*pixels[7].alpha)+
5995fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].alpha+cx[1]*pixels[9].alpha+cx[2]*
5996fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].alpha+cx[3]*pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+
5997fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5998d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5999d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
6000d76c51ed30cf4084f4434ba08925d16001d1e340cristy  }
6001d76c51ed30cf4084f4434ba08925d16001d1e340cristy  return(status);
6002d76c51ed30cf4084f4434ba08925d16001d1e340cristy}
60034c08aed51c5899665ade97263692328eea4af106cristy
60044c08aed51c5899665ade97263692328eea4af106cristy/*
60054c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60064c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
60074c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
60084c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
60094c08aed51c5899665ade97263692328eea4af106cristy+   I s F u z z y E q u i v a l e n c e P i x e l                             %
60104c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
60114c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
60124c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
60134c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60144c08aed51c5899665ade97263692328eea4af106cristy%
60154c08aed51c5899665ade97263692328eea4af106cristy%  IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two
6016a060829f41c741d75c680e3a6863c9caae1009e4cristy%  pixels is less than the specified distance in a linear three (or four)
60174c08aed51c5899665ade97263692328eea4af106cristy%  dimensional color space.
60184c08aed51c5899665ade97263692328eea4af106cristy%
60194c08aed51c5899665ade97263692328eea4af106cristy%  The format of the IsFuzzyEquivalencePixel method is:
60204c08aed51c5899665ade97263692328eea4af106cristy%
6021e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%      void IsFuzzyEquivalencePixel(const Image *source,const Quantum *p,
6022e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%        const Image *destination,const Quantum *q)
60234c08aed51c5899665ade97263692328eea4af106cristy%
60244c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
60254c08aed51c5899665ade97263692328eea4af106cristy%
6026e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%    o source: the source image.
60274c08aed51c5899665ade97263692328eea4af106cristy%
60284c08aed51c5899665ade97263692328eea4af106cristy%    o p: Pixel p.
60294c08aed51c5899665ade97263692328eea4af106cristy%
6030e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%    o destination: the destination image.
6031e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%
60324c08aed51c5899665ade97263692328eea4af106cristy%    o q: Pixel q.
60334c08aed51c5899665ade97263692328eea4af106cristy%
60344c08aed51c5899665ade97263692328eea4af106cristy*/
6035e4a404711bf20d9062d11ab28bc12e5acd307f9ccristyMagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *source,
6036e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  const Quantum *p,const Image *destination,const Quantum *q)
60374c08aed51c5899665ade97263692328eea4af106cristy{
6038a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
60394c08aed51c5899665ade97263692328eea4af106cristy    fuzz,
60404c08aed51c5899665ade97263692328eea4af106cristy    pixel;
60414c08aed51c5899665ade97263692328eea4af106cristy
6042a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  register double
60434c08aed51c5899665ade97263692328eea4af106cristy    distance,
60444c08aed51c5899665ade97263692328eea4af106cristy    scale;
60454c08aed51c5899665ade97263692328eea4af106cristy
6046a664f96353375532d7b45e52e48d921a56d30580cristy  fuzz=GetFuzzyColorDistance(source,destination);
60474c08aed51c5899665ade97263692328eea4af106cristy  scale=1.0;
60484c08aed51c5899665ade97263692328eea4af106cristy  distance=0.0;
6049f0e5dc9d360bc60ac8c1b5e4fd60f27cc1b0e543dirk  if (source->alpha_trait != UndefinedPixelTrait ||
6050f0e5dc9d360bc60ac8c1b5e4fd60f27cc1b0e543dirk      destination->alpha_trait != UndefinedPixelTrait)
60514c08aed51c5899665ade97263692328eea4af106cristy    {
60524c08aed51c5899665ade97263692328eea4af106cristy      /*
60534c08aed51c5899665ade97263692328eea4af106cristy        Transparencies are involved - set alpha distance
60544c08aed51c5899665ade97263692328eea4af106cristy      */
605570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      pixel=GetPixelAlpha(source,p)-(double) GetPixelAlpha(destination,q);
60564c08aed51c5899665ade97263692328eea4af106cristy      distance=pixel*pixel;
60574c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
60584c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
60594c08aed51c5899665ade97263692328eea4af106cristy      /*
60604c08aed51c5899665ade97263692328eea4af106cristy        Generate a alpha scaling factor to generate a 4D cone on colorspace
60614c08aed51c5899665ade97263692328eea4af106cristy        Note that if one color is transparent, distance has no color component.
60624c08aed51c5899665ade97263692328eea4af106cristy      */
6063f0e5dc9d360bc60ac8c1b5e4fd60f27cc1b0e543dirk      if (source->alpha_trait != UndefinedPixelTrait)
6064f0e5dc9d360bc60ac8c1b5e4fd60f27cc1b0e543dirk        scale=QuantumScale*GetPixelAlpha(source,p);
6065f0e5dc9d360bc60ac8c1b5e4fd60f27cc1b0e543dirk      if (destination->alpha_trait != UndefinedPixelTrait)
6066f0e5dc9d360bc60ac8c1b5e4fd60f27cc1b0e543dirk        scale*=QuantumScale*GetPixelAlpha(destination,q);
60674c08aed51c5899665ade97263692328eea4af106cristy      if (scale <= MagickEpsilon)
60684c08aed51c5899665ade97263692328eea4af106cristy        return(MagickTrue);
60694c08aed51c5899665ade97263692328eea4af106cristy    }
60704c08aed51c5899665ade97263692328eea4af106cristy  /*
60714c08aed51c5899665ade97263692328eea4af106cristy    RGB or CMY color cube
60724c08aed51c5899665ade97263692328eea4af106cristy  */
60734c08aed51c5899665ade97263692328eea4af106cristy  distance*=3.0;  /* rescale appropriately */
60744c08aed51c5899665ade97263692328eea4af106cristy  fuzz*=3.0;
6075a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel=GetPixelRed(source,p)-(double) GetPixelRed(destination,q);
6076e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  if ((source->colorspace == HSLColorspace) ||
6077e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      (source->colorspace == HSBColorspace) ||
6078e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      (source->colorspace == HWBColorspace))
60794c08aed51c5899665ade97263692328eea4af106cristy    {
60804c08aed51c5899665ade97263692328eea4af106cristy      /*
60814c08aed51c5899665ade97263692328eea4af106cristy        Compute an arc distance for hue.  It should be a vector angle of
60824c08aed51c5899665ade97263692328eea4af106cristy        'S'/'W' length with 'L'/'B' forming appropriate cones.
60834c08aed51c5899665ade97263692328eea4af106cristy      */
60844c08aed51c5899665ade97263692328eea4af106cristy      if (fabs((double) pixel) > (QuantumRange/2))
60854c08aed51c5899665ade97263692328eea4af106cristy        pixel-=QuantumRange;
60864c08aed51c5899665ade97263692328eea4af106cristy      pixel*=2;
60874c08aed51c5899665ade97263692328eea4af106cristy    }
60884c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
60894c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
60904c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
6091a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel=GetPixelGreen(source,p)-(double) GetPixelGreen(destination,q);
60924c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
60934c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
60944c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
6095a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel=GetPixelBlue(source,p)-(double) GetPixelBlue(destination,q);
60964c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
60974c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
60984c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
60994c08aed51c5899665ade97263692328eea4af106cristy  return(MagickTrue);
61004c08aed51c5899665ade97263692328eea4af106cristy}
61014c08aed51c5899665ade97263692328eea4af106cristy
61024c08aed51c5899665ade97263692328eea4af106cristy/*
61034c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61044c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
61054c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
61064c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
61074c08aed51c5899665ade97263692328eea4af106cristy+   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                     %
61084c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
61094c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
61104c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
61114c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61124c08aed51c5899665ade97263692328eea4af106cristy%
61134c08aed51c5899665ade97263692328eea4af106cristy%  IsFuzzyEquivalencePixelInfo() returns true if the distance between two
61144c08aed51c5899665ade97263692328eea4af106cristy%  colors is less than the specified distance in a linear three (or four)
61154c08aed51c5899665ade97263692328eea4af106cristy%  dimensional color space.
61164c08aed51c5899665ade97263692328eea4af106cristy%
61175f95f4f77efc46ff53593d750491c8f60698c983cristy%  This implements the equivalent of:
61185f95f4f77efc46ff53593d750491c8f60698c983cristy%    fuzz < sqrt(color_distance^2 * u.a*v.a  + alpha_distance^2)
61194c08aed51c5899665ade97263692328eea4af106cristy%
61204c08aed51c5899665ade97263692328eea4af106cristy%  Which produces a multi-dimensional cone for that colorspace along the
61214c08aed51c5899665ade97263692328eea4af106cristy%  transparency vector.
61224c08aed51c5899665ade97263692328eea4af106cristy%
61235f95f4f77efc46ff53593d750491c8f60698c983cristy%  For example for an RGB:
61244c08aed51c5899665ade97263692328eea4af106cristy%    color_distance^2  = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3
61254c08aed51c5899665ade97263692328eea4af106cristy%
61264c08aed51c5899665ade97263692328eea4af106cristy%  See http://www.imagemagick.org/Usage/bugs/fuzz_distance/
61274c08aed51c5899665ade97263692328eea4af106cristy%
61284c08aed51c5899665ade97263692328eea4af106cristy%  Hue colorspace distances need more work.  Hue is not a distance, it is an
61294c08aed51c5899665ade97263692328eea4af106cristy%  angle!
61304c08aed51c5899665ade97263692328eea4af106cristy%
61314c08aed51c5899665ade97263692328eea4af106cristy%  A check that q is in the same color space as p should be made and the
61324c08aed51c5899665ade97263692328eea4af106cristy%  appropriate mapping made.  -- Anthony Thyssen  8 December 2010
61334c08aed51c5899665ade97263692328eea4af106cristy%
61344c08aed51c5899665ade97263692328eea4af106cristy%  The format of the IsFuzzyEquivalencePixelInfo method is:
61354c08aed51c5899665ade97263692328eea4af106cristy%
61364c08aed51c5899665ade97263692328eea4af106cristy%      MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
61374c08aed51c5899665ade97263692328eea4af106cristy%        const PixelInfo *q)
61384c08aed51c5899665ade97263692328eea4af106cristy%
61394c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
61404c08aed51c5899665ade97263692328eea4af106cristy%
61414c08aed51c5899665ade97263692328eea4af106cristy%    o p: Pixel p.
61424c08aed51c5899665ade97263692328eea4af106cristy%
61434c08aed51c5899665ade97263692328eea4af106cristy%    o q: Pixel q.
61444c08aed51c5899665ade97263692328eea4af106cristy%
61454c08aed51c5899665ade97263692328eea4af106cristy*/
61464c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
61474c08aed51c5899665ade97263692328eea4af106cristy  const PixelInfo *q)
61484c08aed51c5899665ade97263692328eea4af106cristy{
6149a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
61504c08aed51c5899665ade97263692328eea4af106cristy    fuzz,
61514c08aed51c5899665ade97263692328eea4af106cristy    pixel;
61524c08aed51c5899665ade97263692328eea4af106cristy
6153a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  register double
61544c08aed51c5899665ade97263692328eea4af106cristy    scale,
61554c08aed51c5899665ade97263692328eea4af106cristy    distance;
61564c08aed51c5899665ade97263692328eea4af106cristy
6157043a981a1f6b2393520e911594ce29ef5b060ee5cristy  fuzz=(double) MagickMax(MagickMax(p->fuzz,q->fuzz),(MagickRealType)
6158043a981a1f6b2393520e911594ce29ef5b060ee5cristy    MagickSQ1_2);
6159043a981a1f6b2393520e911594ce29ef5b060ee5cristy  fuzz*=fuzz;
61604c08aed51c5899665ade97263692328eea4af106cristy  scale=1.0;
61614c08aed51c5899665ade97263692328eea4af106cristy  distance=0.0;
616217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy  if ((p->alpha_trait != UndefinedPixelTrait) ||
616317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      (q->alpha_trait != UndefinedPixelTrait))
61644c08aed51c5899665ade97263692328eea4af106cristy    {
61654c08aed51c5899665ade97263692328eea4af106cristy      /*
61664c08aed51c5899665ade97263692328eea4af106cristy        Transparencies are involved - set alpha distance.
61674c08aed51c5899665ade97263692328eea4af106cristy      */
616817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      pixel=(p->alpha_trait != UndefinedPixelTrait ? p->alpha : OpaqueAlpha)-
616917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy        (q->alpha_trait != UndefinedPixelTrait ? q->alpha : OpaqueAlpha);
61704c08aed51c5899665ade97263692328eea4af106cristy      distance=pixel*pixel;
61714c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
61724c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
61734c08aed51c5899665ade97263692328eea4af106cristy      /*
61744c08aed51c5899665ade97263692328eea4af106cristy        Generate a alpha scaling factor to generate a 4D cone on colorspace.
61755f95f4f77efc46ff53593d750491c8f60698c983cristy        If one color is transparent, distance has no color component.
61764c08aed51c5899665ade97263692328eea4af106cristy      */
617717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      if (p->alpha_trait != UndefinedPixelTrait)
61784c08aed51c5899665ade97263692328eea4af106cristy        scale=(QuantumScale*p->alpha);
617917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      if (q->alpha_trait != UndefinedPixelTrait)
61804c08aed51c5899665ade97263692328eea4af106cristy        scale*=(QuantumScale*q->alpha);
61814c08aed51c5899665ade97263692328eea4af106cristy      if (scale <= MagickEpsilon )
61824c08aed51c5899665ade97263692328eea4af106cristy        return(MagickTrue);
61834c08aed51c5899665ade97263692328eea4af106cristy    }
61844c08aed51c5899665ade97263692328eea4af106cristy  /*
61854c08aed51c5899665ade97263692328eea4af106cristy    CMYK create a CMY cube with a multi-dimensional cone toward black.
61864c08aed51c5899665ade97263692328eea4af106cristy  */
61874c08aed51c5899665ade97263692328eea4af106cristy  if (p->colorspace == CMYKColorspace)
61884c08aed51c5899665ade97263692328eea4af106cristy    {
61894c08aed51c5899665ade97263692328eea4af106cristy      pixel=p->black-q->black;
61904c08aed51c5899665ade97263692328eea4af106cristy      distance+=pixel*pixel*scale;
61914c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
61924c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
6193a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      scale*=(double) (QuantumScale*(QuantumRange-p->black));
6194a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      scale*=(double) (QuantumScale*(QuantumRange-q->black));
61954c08aed51c5899665ade97263692328eea4af106cristy    }
61964c08aed51c5899665ade97263692328eea4af106cristy  /*
61974c08aed51c5899665ade97263692328eea4af106cristy    RGB or CMY color cube.
61984c08aed51c5899665ade97263692328eea4af106cristy  */
61994c08aed51c5899665ade97263692328eea4af106cristy  distance*=3.0;  /* rescale appropriately */
62004c08aed51c5899665ade97263692328eea4af106cristy  fuzz*=3.0;
62014c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->red-q->red;
62024c08aed51c5899665ade97263692328eea4af106cristy  if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) ||
62034c08aed51c5899665ade97263692328eea4af106cristy      (p->colorspace == HWBColorspace))
62044c08aed51c5899665ade97263692328eea4af106cristy    {
62055f95f4f77efc46ff53593d750491c8f60698c983cristy      /*
620658ee5018960b42b80b54398eacabe9ae5da89149cristy        This calculates a arc distance for hue-- it should be a vector
620758ee5018960b42b80b54398eacabe9ae5da89149cristy        angle of 'S'/'W' length with 'L'/'B' forming appropriate cones.
620858ee5018960b42b80b54398eacabe9ae5da89149cristy        In other words this is a hack - Anthony.
62094c08aed51c5899665ade97263692328eea4af106cristy      */
62104c08aed51c5899665ade97263692328eea4af106cristy      if (fabs((double) pixel) > (QuantumRange/2))
62114c08aed51c5899665ade97263692328eea4af106cristy        pixel-=QuantumRange;
62124c08aed51c5899665ade97263692328eea4af106cristy      pixel*=2;
62134c08aed51c5899665ade97263692328eea4af106cristy    }
62144c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
62154c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
62164c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
62174c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->green-q->green;
62184c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
62194c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
62204c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
62214c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->blue-q->blue;
62224c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
62234c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
62244c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
62254c08aed51c5899665ade97263692328eea4af106cristy  return(MagickTrue);
62264c08aed51c5899665ade97263692328eea4af106cristy}
62272b9582a27910c7baaeb04b7e969638328fa70095cristy
62282b9582a27910c7baaeb04b7e969638328fa70095cristy/*
62292b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62302b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
62312b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
62322b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
62337ae1654e7582dc87637de6302875d81607393efacristy%   S e t P i x e l C h a n n e l M a s k                                     %
62342b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
62352b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
62362b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
62372b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62382b9582a27910c7baaeb04b7e969638328fa70095cristy%
62397ae1654e7582dc87637de6302875d81607393efacristy%  SetPixelChannelMask() sets the pixel channel map from the specified channel
62407ae1654e7582dc87637de6302875d81607393efacristy%  mask.
62412b9582a27910c7baaeb04b7e969638328fa70095cristy%
6242cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy%  The format of the SetPixelChannelMask method is:
62432b9582a27910c7baaeb04b7e969638328fa70095cristy%
6244bcd59345f8bbe67289229b663d9bb487cc620e13cristy%      ChannelType SetPixelChannelMask(Image *image,
6245bcd59345f8bbe67289229b663d9bb487cc620e13cristy%        const ChannelType channel_mask)
62462b9582a27910c7baaeb04b7e969638328fa70095cristy%
62472b9582a27910c7baaeb04b7e969638328fa70095cristy%  A description of each parameter follows:
62482b9582a27910c7baaeb04b7e969638328fa70095cristy%
62492b9582a27910c7baaeb04b7e969638328fa70095cristy%    o image: the image.
62502b9582a27910c7baaeb04b7e969638328fa70095cristy%
6251dfdb19ea2c08296b31fef860352c0a6efe8e9cc6cristy%    o channel_mask: the channel mask.
62522b9582a27910c7baaeb04b7e969638328fa70095cristy%
62532b9582a27910c7baaeb04b7e969638328fa70095cristy*/
6254bcd59345f8bbe67289229b663d9bb487cc620e13cristyMagickExport ChannelType SetPixelChannelMask(Image *image,
625507a6785ad974f0631a83731fe5d7fb85751ca235cristy  const ChannelType channel_mask)
62562b9582a27910c7baaeb04b7e969638328fa70095cristy{
62576a917d6c8b1695012e26389d2ec303267676815fcristy#define GetChannelBit(mask,bit)  (((size_t) (mask) >> (size_t) (bit)) & 0x01)
6258dafd287faca4c8cd5415d13185973add9c02b2c4cristy
6259bcd59345f8bbe67289229b663d9bb487cc620e13cristy  ChannelType
6260bcd59345f8bbe67289229b663d9bb487cc620e13cristy    mask;
6261bcd59345f8bbe67289229b663d9bb487cc620e13cristy
62622b9582a27910c7baaeb04b7e969638328fa70095cristy  register ssize_t
62632b9582a27910c7baaeb04b7e969638328fa70095cristy    i;
62642b9582a27910c7baaeb04b7e969638328fa70095cristy
6265bcd59345f8bbe67289229b663d9bb487cc620e13cristy  assert(image != (Image *) NULL);
6266e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
6267177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy  if (image->debug != MagickFalse)
6268f30396d9ccce929573b0e23698b43c55e415bf46cristy    (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%08x]",
6269f30396d9ccce929573b0e23698b43c55e415bf46cristy      image->filename,channel_mask);
6270bcd59345f8bbe67289229b663d9bb487cc620e13cristy  mask=image->channel_mask;
62713c30981743f8543ca2ccc0d19de8fbda2b3639c6cristy  image->channel_mask=channel_mask;
6272dafd287faca4c8cd5415d13185973add9c02b2c4cristy  for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
6273e2a912b6c9086c98ec838baa0824cd8deca55538cristy  {
62745a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy    PixelChannel channel=GetPixelChannelChannel(image,i);
627517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy    if (GetChannelBit(channel_mask,channel) == 0)
627617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      {
627717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy        SetPixelChannelTraits(image,channel,CopyPixelTrait);
627817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy        continue;
627917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      }
628062cc94b542ffdb41cd62778530873f8babafb2b7cristy    if (channel == AlphaPixelChannel)
628117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      {
628217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy        if ((image->alpha_trait & CopyPixelTrait) != 0)
628317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy          {
628417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy            SetPixelChannelTraits(image,channel,CopyPixelTrait);
628517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy            continue;
628617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy          }
628717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy        SetPixelChannelTraits(image,channel,UpdatePixelTrait);
628817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy        continue;
628917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      }
629017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy    if (image->alpha_trait != UndefinedPixelTrait)
629117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      {
62923bdd925dbb0804df99e548c50667670319655816cristy        SetPixelChannelTraits(image,channel,(const PixelTrait)
62933bdd925dbb0804df99e548c50667670319655816cristy          (UpdatePixelTrait | BlendPixelTrait));
629417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy        continue;
629517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      }
629617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy    SetPixelChannelTraits(image,channel,UpdatePixelTrait);
6297e2a912b6c9086c98ec838baa0824cd8deca55538cristy  }
62981685e7216ce4e5fac701834cd7db6eee6d426234cristy  if (image->storage_class == PseudoClass)
6299297e3a450d4b95328fa0667d4910881e9787e608cristy    SetPixelChannelTraits(image,IndexPixelChannel,CopyPixelTrait);
6300883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->read_mask != MagickFalse)
6301883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelTraits(image,ReadMaskPixelChannel,CopyPixelTrait);
6302883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->write_mask != MagickFalse)
6303883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelTraits(image,WriteMaskPixelChannel,CopyPixelTrait);
63046dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy  if (image->debug != MagickFalse)
63056dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy    LogPixelChannels(image);
6306bcd59345f8bbe67289229b663d9bb487cc620e13cristy  return(mask);
63072b9582a27910c7baaeb04b7e969638328fa70095cristy}
63082b9582a27910c7baaeb04b7e969638328fa70095cristy
63092b9582a27910c7baaeb04b7e969638328fa70095cristy/*
63102b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
63112b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
63122b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
63132b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
6314322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%   S e t P i x e l M e t a C h a n n e l s                                   %
6315322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
6316322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
6317322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
6318322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6319322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6320322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  SetPixelMetaChannels() sets the image meta channels.
6321322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6322322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  The format of the SetPixelMetaChannels method is:
6323322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6324322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%      MagickBooleanType SetPixelMetaChannels(Image *image,
6325322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%        const size_t number_meta_channels,ExceptionInfo *exception)
6326322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6327322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  A description of each parameter follows:
6328322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6329322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o image: the image.
6330322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6331322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o number_meta_channels:  the number of meta channels.
6332322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6333322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o exception: return any errors or warnings in this structure.
6334322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6335322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy*/
6336322d07da43d795a7c3b9a2d068d9a9005591cbe4cristyMagickExport MagickBooleanType SetPixelMetaChannels(Image *image,
6337322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  const size_t number_meta_channels,ExceptionInfo *exception)
6338322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy{
6339322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  image->number_meta_channels=number_meta_channels;
6340322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  return(SyncImagePixelCache(image,exception));
6341322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy}
6342