pixel.c revision 1352acf3bec61a13875a2d020306ad6339686040
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                                 %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               John Cristy                                   %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               October 1998                                  %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1945ef08fd6a09813e4a8f5ddadf85ba9e0ec2cdc7cristy%  Copyright 1999-2013 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"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/draw.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/constitute.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/delegate.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/geometry.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
62380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy#include "MagickCore/pixel-private.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h"
664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h"
674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/statistic.h"
684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/stream.h"
694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/transform.h"
714c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
724c08aed51c5899665ade97263692328eea4af106cristy
73146a62b25d7466cceec79975894ce812e11f4625cristy/*
744c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
754c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
764c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
774c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
78ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   A c q u i r e P i x e l C h a n n e l M a p                               %
794c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
804c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
814c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
824c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
834c08aed51c5899665ade97263692328eea4af106cristy%
84ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  AcquirePixelChannelMap() acquires a pixel component map.
854c08aed51c5899665ade97263692328eea4af106cristy%
86ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the AcquirePixelChannelMap() method is:
874c08aed51c5899665ade97263692328eea4af106cristy%
88bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *AcquirePixelChannelMap(void)
894c08aed51c5899665ade97263692328eea4af106cristy%
904c08aed51c5899665ade97263692328eea4af106cristy*/
91bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *AcquirePixelChannelMap(void)
924c08aed51c5899665ade97263692328eea4af106cristy{
93ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  PixelChannelMap
94bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    *channel_map;
954c08aed51c5899665ade97263692328eea4af106cristy
964c08aed51c5899665ade97263692328eea4af106cristy  register ssize_t
974c08aed51c5899665ade97263692328eea4af106cristy    i;
984c08aed51c5899665ade97263692328eea4af106cristy
99bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels,
100bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    sizeof(*channel_map));
101bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (channel_map == (PixelChannelMap *) NULL)
1024c08aed51c5899665ade97263692328eea4af106cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
103bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map));
104bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  for (i=0; i < MaxPixelChannels; i++)
105bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    channel_map[i].channel=(PixelChannel) i;
106ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  return(channel_map);
1074c08aed51c5899665ade97263692328eea4af106cristy}
1084c08aed51c5899665ade97263692328eea4af106cristy
1094c08aed51c5899665ade97263692328eea4af106cristy/*
1104c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1114c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1124c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1134c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
114ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   C l o n e P i x e l C h a n n e l M a p                                   %
1154c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1164c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1174c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1184c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1194c08aed51c5899665ade97263692328eea4af106cristy%
120ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  ClonePixelChannelMap() clones a pixel component map.
1214c08aed51c5899665ade97263692328eea4af106cristy%
122ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the ClonePixelChannelMap() method is:
1234c08aed51c5899665ade97263692328eea4af106cristy%
124bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
1254c08aed51c5899665ade97263692328eea4af106cristy%
1264c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
1274c08aed51c5899665ade97263692328eea4af106cristy%
128ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%    o channel_map: the pixel component map.
1294c08aed51c5899665ade97263692328eea4af106cristy%
1304c08aed51c5899665ade97263692328eea4af106cristy*/
131bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
1324c08aed51c5899665ade97263692328eea4af106cristy{
133ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  PixelChannelMap
134bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    *clone_map;
1354c08aed51c5899665ade97263692328eea4af106cristy
136bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  assert(channel_map != (PixelChannelMap *) NULL);
137ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  clone_map=AcquirePixelChannelMap();
138bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (clone_map == (PixelChannelMap *) NULL)
139bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    return((PixelChannelMap *) NULL);
140bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels*
141bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    sizeof(*channel_map));
1424c08aed51c5899665ade97263692328eea4af106cristy  return(clone_map);
1434c08aed51c5899665ade97263692328eea4af106cristy}
1444c08aed51c5899665ade97263692328eea4af106cristy
1454c08aed51c5899665ade97263692328eea4af106cristy/*
1464c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1474c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1484c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1494c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1504c08aed51c5899665ade97263692328eea4af106cristy+   C l o n e P i x e l I n f o                                               %
1514c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1524c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1534c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1544c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1554c08aed51c5899665ade97263692328eea4af106cristy%
1564c08aed51c5899665ade97263692328eea4af106cristy%  ClonePixelInfo() makes a duplicate of the given pixel info structure, or if
1574c08aed51c5899665ade97263692328eea4af106cristy%  pixel info is NULL, a new one.
1584c08aed51c5899665ade97263692328eea4af106cristy%
1594c08aed51c5899665ade97263692328eea4af106cristy%  The format of the ClonePixelInfo method is:
1604c08aed51c5899665ade97263692328eea4af106cristy%
1614c08aed51c5899665ade97263692328eea4af106cristy%      PixelInfo *ClonePixelInfo(const PixelInfo *pixel_info)
1624c08aed51c5899665ade97263692328eea4af106cristy%
1634c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
1644c08aed51c5899665ade97263692328eea4af106cristy%
1654c08aed51c5899665ade97263692328eea4af106cristy%    o pixel_info: the pixel info.
1664c08aed51c5899665ade97263692328eea4af106cristy%
1674c08aed51c5899665ade97263692328eea4af106cristy*/
1684c08aed51c5899665ade97263692328eea4af106cristyMagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
1694c08aed51c5899665ade97263692328eea4af106cristy{
1704c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
1714c08aed51c5899665ade97263692328eea4af106cristy    *pixel_info;
1724c08aed51c5899665ade97263692328eea4af106cristy
173a64b85d7873d5e540fe6e2941aa98ec7653a4e2dcristy  pixel_info=(PixelInfo *) AcquireQuantumMemory(1,sizeof(*pixel_info));
1744c08aed51c5899665ade97263692328eea4af106cristy  if (pixel_info == (PixelInfo *) NULL)
1754c08aed51c5899665ade97263692328eea4af106cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1764c08aed51c5899665ade97263692328eea4af106cristy  *pixel_info=(*pixel);
1774c08aed51c5899665ade97263692328eea4af106cristy  return(pixel_info);
1784c08aed51c5899665ade97263692328eea4af106cristy}
1794c08aed51c5899665ade97263692328eea4af106cristy
1804c08aed51c5899665ade97263692328eea4af106cristy/*
1814c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1824c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1834c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1844c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
185c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%   D e c o d e P i x e l G a m m a                                           %
186c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
187c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
188c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
189c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
190c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
191c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  DecodePixelGamma() applies the expansive power-law nonlinearity to the pixel.
192c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
1933506059097340c6cdeff165058b5e18adfc89025cristy%  The format of the DecodePixelGamma method is:
194c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
195c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%      double DecodePixelGamma(const MagickRealType pixel)
196c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
197c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  A description of each parameter follows:
198c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
199c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%    o pixel: the pixel.
200c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
201c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy*/
202c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
203c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristystatic inline double DecodeGamma(const double x)
204c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy{
205c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  div_t
206c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    quotient;
207c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
208c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  double
209c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    p,
210c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    term[9];
211c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
212c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  int
213c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    exponent;
214c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
215c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double coefficient[] =  /* terms for x^(7/5), x=1.5 */
216c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
217c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.7917488588043277509,
218c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.82045614371976854984,
219c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.027694100686325412819,
220c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -0.00094244335181762134018,
221c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.000064355540911469709545,
222c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -5.7224404636060757485e-06,
223c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    5.8767669437311184313e-07,
224c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -6.6139920053589721168e-08,
225c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    7.9323242696227458163e-09
226c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
227c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
228c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double powers_of_two[] =  /* (2^x)^(7/5) */
229c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
230c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.0,
231c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    2.6390158215457883983,
232c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    6.9644045063689921093,
233c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.8379173679952558018e+01,
234c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    4.8502930128332728543e+01
235c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
236c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
237c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  /*
238c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    Compute x^2.4 == x*x^(7/5) == pow(x,2.4).
239c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  */
240c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[0]=1.0;
241c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[1]=4.0*frexp(x,&exponent)-3.0;
242c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[2]=2.0*term[1]*term[1]-term[0];
243c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[3]=2.0*term[1]*term[2]-term[1];
244c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[4]=2.0*term[1]*term[3]-term[2];
245c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[5]=2.0*term[1]*term[4]-term[3];
246c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[6]=2.0*term[1]*term[5]-term[4];
247c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[7]=2.0*term[1]*term[6]-term[5];
248c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[8]=2.0*term[1]*term[7]-term[6];
249c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  p=coefficient[0]*term[0]+coefficient[1]*term[1]+coefficient[2]*term[2]+
250c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[3]*term[3]+coefficient[4]*term[4]+coefficient[5]*term[5]+
251c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[6]*term[6]+coefficient[7]*term[7]+coefficient[8]*term[8];
252c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  quotient=div(exponent-1,5);
253c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  if (quotient.rem < 0)
254c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    {
255c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.quot-=1;
256c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.rem+=5;
257c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    }
258c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return(x*ldexp(powers_of_two[quotient.rem]*p,7*quotient.quot));
259c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy}
260c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
261c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristyMagickExport MagickRealType DecodePixelGamma(const MagickRealType pixel)
262c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy{
263c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy  if (pixel <= (0.0404482362771076*QuantumRange))
264c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy    return(pixel/12.92f);
265c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return((MagickRealType) (QuantumRange*DecodeGamma((double) (QuantumScale*
266c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    pixel+0.055)/1.055)));
267c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy}
268c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy
269c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy/*
270c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
271c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
272c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
273c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
274ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   D e s t r o y P i x e l C h a n n e l M a p                               %
2754c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2764c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2774c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2784c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2794c08aed51c5899665ade97263692328eea4af106cristy%
280ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  DestroyPixelChannelMap() deallocates memory associated with the pixel
281ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  channel map.
2824c08aed51c5899665ade97263692328eea4af106cristy%
283ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the DestroyPixelChannelMap() method is:
2844c08aed51c5899665ade97263692328eea4af106cristy%
285bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *DestroyPixelChannelMap(PixelChannelMap *channel_map)
2864c08aed51c5899665ade97263692328eea4af106cristy%
2874c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
2884c08aed51c5899665ade97263692328eea4af106cristy%
289ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%    o channel_map: the pixel component map.
2904c08aed51c5899665ade97263692328eea4af106cristy%
2914c08aed51c5899665ade97263692328eea4af106cristy*/
292bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *DestroyPixelChannelMap(
293bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  PixelChannelMap *channel_map)
2944c08aed51c5899665ade97263692328eea4af106cristy{
295bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  assert(channel_map != (PixelChannelMap *) NULL);
296bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  channel_map=(PixelChannelMap *) RelinquishMagickMemory(channel_map);
297bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  return((PixelChannelMap *) RelinquishMagickMemory(channel_map));
2984c08aed51c5899665ade97263692328eea4af106cristy}
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
305c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy+   E n c o d e P i x e l G a m m a                                           %
306c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
307c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
308c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
309c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
310c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
311c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  EncodePixelGamma() cancels any nonlinearity in the pixel.
312c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
3133506059097340c6cdeff165058b5e18adfc89025cristy%  The format of the EncodePixelGamma method is:
314c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
315c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%      MagickRealType EncodePixelGamma(const double MagickRealType)
316c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
317c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%  A description of each parameter follows:
318c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
319c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%    o pixel: the pixel.
320c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%
321c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy*/
322c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
323c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristystatic inline double EncodeGamma(const double x)
324c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy{
325c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  div_t
326c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    quotient;
327c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
328c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  double
329c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    p,
330c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    term[9];
331c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
332c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  int
333c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    exponent;
334c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
335c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double coefficient[] =  /* Chebychevi poly: x^(5/12), x=1.5 */
336c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
337c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.1758200232996901923,
338c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.16665763094889061230,
339c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -0.0083154894939042125035,
340c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.00075187976780420279038,
341c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -0.000083240178519391795367,
342c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    0.000010229209410070008679,
343c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -1.3400466409860246e-06,
344c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.8333422241635376682e-07,
345c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    -2.5878596761348859722e-08
346c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
347c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
348c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  static const double powers_of_two[] =  /* (2^N)^(5/12) */
349c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  {
350c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.0,
351c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.3348398541700343678,
352c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.7817974362806785482,
353c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    2.3784142300054420538,
354c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    3.1748021039363991669,
355c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    4.2378523774371812394,
356c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    5.6568542494923805819,
357c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    7.5509945014535482244,
358c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.0079368399158985525e1,
359c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.3454342644059433809e1,
360c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    1.7959392772949968275e1,
361c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    2.3972913230026907883e1
362c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  };
363c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
364c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  /*
365c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    Compute x^(1/2.4) == x^(5/12) == pow(x,1.0/2.4).
366c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  */
367c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[0]=1.0;
368c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[1]=4.0*frexp(x,&exponent)-3.0;
369c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[2]=2.0*term[1]*term[1]-term[0];
370c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[3]=2.0*term[1]*term[2]-term[1];
371c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[4]=2.0*term[1]*term[3]-term[2];
372c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[5]=2.0*term[1]*term[4]-term[3];
373c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[6]=2.0*term[1]*term[5]-term[4];
374c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[7]=2.0*term[1]*term[6]-term[5];
375c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  term[8]=2.0*term[1]*term[7]-term[6];
376c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  p=coefficient[0]*term[0]+coefficient[1]*term[1]+coefficient[2]*term[2]+
377c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[3]*term[3]+coefficient[4]*term[4]+coefficient[5]*term[5]+
378c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    coefficient[6]*term[6]+coefficient[7]*term[7]+coefficient[8]*term[8];
379c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  quotient=div(exponent-1,12);
380c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  if (quotient.rem < 0)
381c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    {
382c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.quot-=1;
383c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy      quotient.rem+=12;
384c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy    }
385c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return(ldexp(powers_of_two[quotient.rem]*p,5*quotient.quot));
386c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy}
387c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy
388c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristyMagickExport MagickRealType EncodePixelGamma(const MagickRealType pixel)
389c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy{
390c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy  if (pixel <= (0.0031306684425005883*QuantumRange))
391c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy    return(12.92f*pixel);
392c29824a8a311026fa6d88675fdbb7fdf28a8b93dcristy  return((MagickRealType) QuantumRange*(1.055*EncodeGamma((double) QuantumScale*
3932a13aa6938f7e40986908f79a54a32958bf0fc81cristy    pixel)-0.055));
394c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy}
395c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy
396c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy/*
397c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
398c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
399c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
400c8aff84439d0f36504f110e6f7ab49f8ad312c0fcristy%                                                                             %
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E x p o r t I m a g e P i x e l s                                         %
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ExportImagePixels() extracts pixel data from an image and returns it to you.
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The method returns MagickTrue on success otherwise MagickFalse if an error is
409b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  encountered.  The data is returned as char, short int, Quantum, unsigned int,
410cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%  unsigned long long, float, or double in the order specified by map.
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Suppose you want to extract the first scanline of a 640x480 image as
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  character data in red-green-blue order:
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ExportImagePixels method is:
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
419cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%      MagickBooleanType ExportImagePixels(const Image *image,const ssize_t x,
420cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const ssize_t y,const size_t width,const size_t height,
421cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const char *map,const StorageType type,void *pixels,
42246f4be29828ab7588745336d46ab11611c847933cristy%        ExceptionInfo *exception)
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
428cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%    o x,y,width,height:  These values define the perimeter
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      of a region of pixels you want to extract.
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map:  This string reflects the expected ordering of the pixel array.
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      It can be any combination or order of R = red, G = green, B = blue,
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      P = pad.
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o type: Define the data type of the pixels.  Float and double types are
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
4396c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
440ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy%      LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
4416c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixels: This array of values contain the pixel components as defined by
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      map and type.  You must preallocate this array where the expected
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      length varies depending on the values of width, height, map, and type.
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
4512dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportCharPixel(Image *image,const RectangleInfo *roi,
45246f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
45346f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
458bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned char
4623fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
46414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
46514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
46614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
4679d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
4689d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
4699d314ff2c17a77996c05413c2013880387e50f0ecristy
47046f4be29828ab7588745336d46ab11611c847933cristy  q=(unsigned char *) pixels;
471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
473cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
475cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
478cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
490cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
492cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
495cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
504e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
508cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
510cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
513cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar((Quantum) 0);
519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
526cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
528cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
531cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
53370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p)));
534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
541cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
543cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
546cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
558cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
560cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
563cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
576cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
578cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
581cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar((Quantum) 0);
587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
590e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
59214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
593cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
595cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
598cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
60314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelRed(image,p));
612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelGreen(image,p));
618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelBlue(image,p));
624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=ScaleQuantumToChar(GetPixelBlack(image,p));
640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
64470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ScaleQuantumToChar(ClampToQuantum(GetPixelIntensity(image,p)));
645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
6572dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportDoublePixel(Image *image,const RectangleInfo *roi,
65846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
65946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register double
6653fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
67014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
67114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
67214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(double *) pixels;
677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
679cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
681cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
6824c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
684cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
689ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
696cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
698cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
701cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
714cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
716cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
7174c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
719cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
725ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
732cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
734cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
737cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelIntensity(image,p));
740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
747cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
749cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
752cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
764cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
766cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
769cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
782cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
784cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
7854c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
787cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
793ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
79814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
799cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
801cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
804cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
80914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelRed(image,p));
818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelGreen(image,p));
824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
827e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelBlue(image,p));
830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelAlpha(image,p));
835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelAlpha(image,p));
840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=(double) (QuantumScale*
846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy                GetPixelBlack(image,p));
847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelIntensity(image,p));
852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=0;
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
8642dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportFloatPixel(Image *image,const RectangleInfo *roi,
86546f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
86646f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register float
8723fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
87714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
87814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
87914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(float *) pixels;
884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
886cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
888cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
8894c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
891cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
896ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
903cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
905cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
908cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
921cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
923cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
9244c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
926cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
932ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
939cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
941cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
944cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelIntensity(image,p));
947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
954cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
956cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
959cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
971cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
973cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
976cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
989cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
991cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
9924c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
994cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
1000ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
100514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1006cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1008cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1011cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
101614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelRed(image,p));
1025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelGreen(image,p));
1031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelBlue(image,p));
1037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p))));
1042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelAlpha(image,p));
1047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=(float) (QuantumScale* GetPixelBlack(image,p));
1053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelIntensity(image,p));
1058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=0;
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
10702dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportLongPixel(Image *image,const RectangleInfo *roi,
107146f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
107246f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
1075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
1076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned int
10813fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
1082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
108314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
108414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
108514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(unsigned int *) pixels;
1090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1092cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1094cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
10954c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1097cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
10996c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11006c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11016c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1102ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1109cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1111cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1113e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1114cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
11166c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11176c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11186c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
11196c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1127cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1129cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1132cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1133e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
11346c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11356c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11366c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
11376c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=0;
1138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1145cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1147cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1150cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
115270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p)));
1153e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1160cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1162cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1165cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1166e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
11676c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
11686c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11696c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1173e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1176e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1177cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1179cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1182cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
11846c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
11856c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11866c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11876c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1191e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1192e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1193e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1194e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1195cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1197cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1199e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1200cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
12026c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
12036c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
12046c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
12056c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=0;
1206e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1207e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1209e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
121114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1212cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1214cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1217cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1219e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
122214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1223e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1224e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1225e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1226e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1228e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1229e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
12306c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelRed(image,p));
1231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1233e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
12366c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelGreen(image,p));
1237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1238e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1241e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
12426c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelBlue(image,p));
1243e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1244e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1245e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1246e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
12476c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1248e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1249e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1250e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
12526c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1253e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1254e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1256e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1257e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
12586c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy              *q=ScaleQuantumToLong(GetPixelBlack(image,p));
1259e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1260e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1261e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1262e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
126370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ScaleQuantumToLong(ClampToQuantum(GetPixelIntensity(image,p)));
1264e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1265e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1266e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
12676c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            break;
1268e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1269e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1271e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1273e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
12762dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportLongLongPixel(Image *image,const RectangleInfo *roi,
127746f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
127846f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
1281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
1282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1284e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1286b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  register MagickSizeType
12873fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
1288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
128914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
129014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
129114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1292e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1295b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  q=(MagickSizeType *) pixels;
1296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1297e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1298cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1300cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1301e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1303cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1305b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1306b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1307b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1310e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1311e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1315cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1316e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1317cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1318e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1320cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1322b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1323b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1324b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1325b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1326e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1327e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1333cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1335cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1337e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1338cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1340b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1341b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1342b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1344e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1345e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1346e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1348e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1351cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1353cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1355e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1356cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1357e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
135870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ScaleQuantumToLongLong(ClampToQuantum(GetPixelIntensity(image,p)));
1359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1362e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1363e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1366cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1368cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1371cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1373b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1374b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1375b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1376e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1383cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1385cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1388cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1390b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1391b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1392b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1393b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1394e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1399e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1401cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1403cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1406cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1408b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1409b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1410b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1412e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1413e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1415e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
141714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1418cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1420cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1423cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
142814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1430e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1431e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1432e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1433e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1436b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelRed(image,p));
1437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1442b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1445e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1448b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1449e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1452e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1453b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1458b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1464b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy              *q=ScaleQuantumToLongLong(GetPixelBlack(image,p));
1465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1466e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
146958ee5018960b42b80b54398eacabe9ae5da89149cristy            *q=ScaleQuantumToLongLong(ClampToQuantum(
147058ee5018960b42b80b54398eacabe9ae5da89149cristy              GetPixelIntensity(image,p)));
1471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1472e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
14832dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportQuantumPixel(Image *image,const RectangleInfo *roi,
148446f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
148546f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
1488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
1489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
14913fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
1492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
149614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
149714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
149814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(Quantum *) pixels;
1503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1504e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1505cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1507cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1510cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1522cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1524cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1527cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) (GetPixelAlpha(image,p));
1533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1540cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1542cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1545cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) 0;
1551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1558cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1560cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1563cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
156570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ClampToQuantum(GetPixelIntensity(image,p));
1566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1573cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1575cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1578cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1590cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1592cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1595cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) (GetPixelAlpha(image,p));
1601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1608cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1610cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1613cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) 0;
1619e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
162414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1625cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1627cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1630cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
163514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=(Quantum) 0;
1638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelRed(image,p);
1644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelGreen(image,p);
1650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelBlue(image,p);
1656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelAlpha(image,p);
1661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelAlpha(image,p);
1666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=GetPixelBlack(image,p);
1672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
167670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ClampToQuantum(GetPixelIntensity(image,p));
1677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(Quantum) 0;
1682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
16922dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportShortPixel(Image *image,const RectangleInfo *roi,
169346f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
169446f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
1697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
1698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned short
17033fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
1704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
170514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
170614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
170714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
170814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  ssize_t
170914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    y;
171014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(unsigned short *) pixels;
1712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1714cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1716cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1719cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1731cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1733cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1736cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1749cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1751cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1754cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1767cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1769cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1772cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
177470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          *q++=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p)));
1775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1782cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1784cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1786e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1787cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1788e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1793e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1799cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1801cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1804cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1808e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1817cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1819cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1822cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1827e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
183314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1834cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1836cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1839cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
184414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelRed(image,p));
1853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelGreen(image,p));
1859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelBlue(image,p));
1865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=ScaleQuantumToShort(GetPixelBlack(image,p));
1881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
188570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy            *q=ScaleQuantumToShort(ClampToQuantum(GetPixelIntensity(image,p)));
1886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
189858ee5018960b42b80b54398eacabe9ae5da89149cristyMagickExport MagickBooleanType ExportImagePixels(Image *image,const ssize_t x,
189958ee5018960b42b80b54398eacabe9ae5da89149cristy  const ssize_t y,const size_t width,const size_t height,const char *map,
190058ee5018960b42b80b54398eacabe9ae5da89149cristy  const StorageType type,void *pixels,ExceptionInfo *exception)
1901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  QuantumType
1903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *quantum_map;
1904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1905cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  RectangleInfo
1906cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    roi;
1907cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy
1908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    i;
1910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
191114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
191214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
191314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image != (Image *) NULL);
1915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image->signature == MagickSignature);
1916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image->debug != MagickFalse)
1917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
191814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
191914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
1920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (quantum_map == (QuantumType *) NULL)
1921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      (void) ThrowMagickException(exception,GetMagickModule(),
1923efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy        ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
1924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return(MagickFalse);
1925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
192614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  for (i=0; i < (ssize_t) length; i++)
1927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    switch (map[i])
1929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'A':
1931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'a':
1932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=AlphaQuantum;
1934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1936e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'B':
1937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'b':
1938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlueQuantum;
1940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'C':
1943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'c':
1944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1945e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=CyanQuantum;
1946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
1947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1950efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
1951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'g':
1954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'G':
1955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=GreenQuantum;
1957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'I':
1960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'i':
1961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=IndexQuantum;
1963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'K':
1966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'k':
1967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlackQuantum;
1969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
1970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1973efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
1974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'M':
1977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'm':
1978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=MagentaQuantum;
1980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
1981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1983e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1984efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
1985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'o':
1988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'O':
1989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=OpacityQuantum;
1991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'P':
1994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'p':
1995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=UndefinedQuantum;
1997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'R':
2000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'r':
2001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2002e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=RedQuantum;
2003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
2004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'Y':
2006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'y':
2007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=YellowQuantum;
2009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
2010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
2013efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "ColorSeparatedImageRequired","`%s'",map);
2014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
2015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      default:
2017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
2020efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "UnrecognizedPixelMap","`%s'",map);
2021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
2022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
2025cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.width=width;
2026cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.height=height;
2027cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.x=x;
2028cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.y=y;
2029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  switch (type)
2030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case CharPixel:
2032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2033cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportCharPixel(image,&roi,map,quantum_map,pixels,exception);
2034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case DoublePixel:
2037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2038cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
2039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case FloatPixel:
2042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2043cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
2044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
20466c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongPixel:
2047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2048cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportLongPixel(image,&roi,map,quantum_map,pixels,exception);
2049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
20516c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongLongPixel:
2052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2053cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
2054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case QuantumPixel:
2057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2058cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
2059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case ShortPixel:
2062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2063cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportShortPixel(image,&roi,map,quantum_map,pixels,exception);
2064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    default:
2067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
2070efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy        "UnrecognizedPixelMap","`%s'",map);
20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
20733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
2075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  return(MagickTrue);
2076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/*
2079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%   G e t P i x e l I n f o                                                   %
2084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2085e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  GetPixelInfo() initializes the PixelInfo structure.
2090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  The format of the GetPixelInfo method is:
2092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      GetPixelInfo(const Image *image,PixelInfo *pixel)
2094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  A description of each parameter follows:
2096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2097a322a839a56b8d9fa40751b1906ce2a4780a24d6anthony%    o image: the image. (optional - may be NULL)
2098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o pixel: Specifies a pointer to a PixelInfo structure.
2100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/
2102e5370944fabb7afa477ab1325d400731b1e5d5e8cristyMagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel)
2103e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->storage_class=DirectClass;
21057020ae6594690c03a4f73784fd41a7131a5b22c6cristy  pixel->colorspace=sRGBColorspace;
21068a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  pixel->alpha_trait=UndefinedPixelTrait;
2107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->fuzz=0.0;
2108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->depth=MAGICKCORE_QUANTUM_DEPTH;
2109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->red=0.0;
2110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->green=0.0;
2111e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->blue=0.0;
2112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->black=0.0;
2113a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel->alpha=(double) OpaqueAlpha;
2114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->index=0.0;
2115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image == (const Image *) NULL)
2116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    return;
2117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->storage_class=image->storage_class;
2118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->colorspace=image->colorspace;
21198a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  pixel->alpha_trait=image->alpha_trait;
2120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->depth=image->depth;
2121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->fuzz=image->fuzz;
2122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/*
2125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
21299731df786aef53bf0482896bcdf9af7011880042cristy%   G e t P i x e l I n t e n s i t y                                         %
21309731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
21319731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
21329731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
21339731df786aef53bf0482896bcdf9af7011880042cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
21349731df786aef53bf0482896bcdf9af7011880042cristy%
21350c5c889633982c1b29bfaacf17092343544d6c8bcristy%  GetPixelIntensity() returns a single sample intensity value from the red,
213670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy%  green, and blue components of a pixel based on the selected method:
213770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy%
21382cf5d375fa7abe962164b39a35948fe76b4d239acristy%    Rec601Luma       0.298839R' + 0.586811G' + 0.114350B'
21392cf5d375fa7abe962164b39a35948fe76b4d239acristy%    Rec601Luminance  0.298839R + 0.586811G + 0.114350B
21401352acf3bec61a13875a2d020306ad6339686040cristy%    Rec709Luma       0.212656R' + 0.715158G' + 0.072186B'
21411352acf3bec61a13875a2d020306ad6339686040cristy%    Rec709Luminance  0.212656R + 0.715158G + 0.072186B
214209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    Brightness       max(R', G', B')
214309bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    Lightness        (min(R', G', B') + max(R', G', B')) / 2.0
214409bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%
214509bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    MS               (R^2 + G^2 + B^2) / 3.0
214609bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    RMS              sqrt((R^2 + G^2 + B^2) / 3.0
214709bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy%    Average          (R + G + B') / 3.0
21489731df786aef53bf0482896bcdf9af7011880042cristy%
21499731df786aef53bf0482896bcdf9af7011880042cristy%  The format of the GetPixelIntensity method is:
21509731df786aef53bf0482896bcdf9af7011880042cristy%
21512cf5d375fa7abe962164b39a35948fe76b4d239acristy%      MagickRealType GetPixelIntensity(const Image *image,
21522cf5d375fa7abe962164b39a35948fe76b4d239acristy%        const Quantum *pixel)
21539731df786aef53bf0482896bcdf9af7011880042cristy%
21549731df786aef53bf0482896bcdf9af7011880042cristy%  A description of each parameter follows:
21559731df786aef53bf0482896bcdf9af7011880042cristy%
21569731df786aef53bf0482896bcdf9af7011880042cristy%    o image: the image.
21579731df786aef53bf0482896bcdf9af7011880042cristy%
21589731df786aef53bf0482896bcdf9af7011880042cristy%    o pixel: Specifies a pointer to a Quantum structure.
21599731df786aef53bf0482896bcdf9af7011880042cristy%
21609731df786aef53bf0482896bcdf9af7011880042cristy*/
216170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy
216270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristystatic inline MagickRealType MagickMax(const MagickRealType x,
216370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  const MagickRealType y)
216470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy{
216570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  if (x > y)
216670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    return(x);
216770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  return(y);
216870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy}
216970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy
217070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristystatic inline MagickRealType MagickMin(const MagickRealType x,
217170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  const MagickRealType y)
217270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy{
217370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  if (x < y)
217470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    return(x);
217570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  return(y);
217670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy}
217770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy
21789731df786aef53bf0482896bcdf9af7011880042cristyMagickExport MagickRealType GetPixelIntensity(const Image *restrict image,
21799731df786aef53bf0482896bcdf9af7011880042cristy  const Quantum *restrict pixel)
21809731df786aef53bf0482896bcdf9af7011880042cristy{
21819731df786aef53bf0482896bcdf9af7011880042cristy  MagickRealType
21829731df786aef53bf0482896bcdf9af7011880042cristy    blue,
21839731df786aef53bf0482896bcdf9af7011880042cristy    green,
218470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    red,
218570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    intensity;
21869731df786aef53bf0482896bcdf9af7011880042cristy
21879731df786aef53bf0482896bcdf9af7011880042cristy  if (image->colorspace == GRAYColorspace)
2188592d6bbf607f36bbae8ca1391570534e3b72087ccristy    return((MagickRealType) GetPixelGray(image,pixel));
2189592d6bbf607f36bbae8ca1391570534e3b72087ccristy  red=(MagickRealType) GetPixelRed(image,pixel);
2190592d6bbf607f36bbae8ca1391570534e3b72087ccristy  green=(MagickRealType) GetPixelGreen(image,pixel);
2191592d6bbf607f36bbae8ca1391570534e3b72087ccristy  blue=(MagickRealType) GetPixelBlue(image,pixel);
219270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  switch (image->intensity)
219370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  {
2194bf02d73b29c613944ea22e2acc8b830aa4700871cristy    case AveragePixelIntensityMethod:
2195bf02d73b29c613944ea22e2acc8b830aa4700871cristy    {
2196bf02d73b29c613944ea22e2acc8b830aa4700871cristy      intensity=(red+green+blue)/3.0;
2197bf02d73b29c613944ea22e2acc8b830aa4700871cristy      break;
2198bf02d73b29c613944ea22e2acc8b830aa4700871cristy    }
2199bf02d73b29c613944ea22e2acc8b830aa4700871cristy    case BrightnessPixelIntensityMethod:
2200bf02d73b29c613944ea22e2acc8b830aa4700871cristy    {
2201bf02d73b29c613944ea22e2acc8b830aa4700871cristy      intensity=MagickMax(MagickMax(red,green),blue);
2202bf02d73b29c613944ea22e2acc8b830aa4700871cristy      break;
2203bf02d73b29c613944ea22e2acc8b830aa4700871cristy    }
2204bf02d73b29c613944ea22e2acc8b830aa4700871cristy    case LightnessPixelIntensityMethod:
2205bf02d73b29c613944ea22e2acc8b830aa4700871cristy    {
220609bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy      intensity=(MagickMin(MagickMin(red,green),blue)+
2207ce326724341c443b3c813774b0cc3b4ce4b425cbcristy        MagickMax(MagickMax(red,green),blue))/2.0;
2208bf02d73b29c613944ea22e2acc8b830aa4700871cristy      break;
2209bf02d73b29c613944ea22e2acc8b830aa4700871cristy    }
2210462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy    case MSPixelIntensityMethod:
2211462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy    {
2212462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy      intensity=(MagickRealType) (((double) red*red+green*green+blue*blue)/
2213462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy        (3.0*QuantumRange));
2214462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy      break;
2215462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy    }
221670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    case Rec601LumaPixelIntensityMethod:
221770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    {
221809bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy      if (image->colorspace == RGBColorspace)
221909bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        {
222009bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          red=EncodePixelGamma(red);
222109bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          green=EncodePixelGamma(green);
222209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          blue=EncodePixelGamma(blue);
222309bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        }
22249e2436a78bdabef900e018dc77c0cc497bf6fbafcristy      intensity=0.298839*red+0.586811*green+0.114350*blue;
22252cf5d375fa7abe962164b39a35948fe76b4d239acristy      break;
22262cf5d375fa7abe962164b39a35948fe76b4d239acristy    }
22272cf5d375fa7abe962164b39a35948fe76b4d239acristy    case Rec601LuminancePixelIntensityMethod:
22282cf5d375fa7abe962164b39a35948fe76b4d239acristy    {
222970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      if (image->colorspace == sRGBColorspace)
223070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        {
223170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          red=DecodePixelGamma(red);
223270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          green=DecodePixelGamma(green);
223370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          blue=DecodePixelGamma(blue);
223470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        }
22359e2436a78bdabef900e018dc77c0cc497bf6fbafcristy      intensity=0.298839*red+0.586811*green+0.114350*blue;
223670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      break;
223770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    }
223870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    case Rec709LumaPixelIntensityMethod:
2239c94210c7c054e663026a776edfa1e2d6b79a00a5cristy    default:
224070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    {
224109bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy      if (image->colorspace == RGBColorspace)
224209bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        {
224309bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          red=EncodePixelGamma(red);
224409bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          green=EncodePixelGamma(green);
224509bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy          blue=EncodePixelGamma(blue);
224609bb043b5d7ce21f9eb1067d6e9bc80365852b98cristy        }
22471352acf3bec61a13875a2d020306ad6339686040cristy      intensity=0.212656*red+0.715158*green+0.072186*blue;
22482cf5d375fa7abe962164b39a35948fe76b4d239acristy      break;
22492cf5d375fa7abe962164b39a35948fe76b4d239acristy    }
22502cf5d375fa7abe962164b39a35948fe76b4d239acristy    case Rec709LuminancePixelIntensityMethod:
22512cf5d375fa7abe962164b39a35948fe76b4d239acristy    {
225270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      if (image->colorspace == sRGBColorspace)
225370e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        {
225470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          red=DecodePixelGamma(red);
225570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          green=DecodePixelGamma(green);
225670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy          blue=DecodePixelGamma(blue);
225770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy        }
22581352acf3bec61a13875a2d020306ad6339686040cristy      intensity=0.212656*red+0.715158*green+0.072186*blue;
225970e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      break;
226070e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    }
226170e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    case RMSPixelIntensityMethod:
226270e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    {
2263462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy      intensity=(MagickRealType) (sqrt((double) red*red+green*green+blue*blue)/
2264462c1ca063d4cb0f06b05b657caf4d1bb81c616ccristy        sqrt(3.0));
226570e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      break;
226670e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy    }
226770e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  }
226870e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy  return(intensity);
22699731df786aef53bf0482896bcdf9af7011880042cristy}
22709731df786aef53bf0482896bcdf9af7011880042cristy
22719731df786aef53bf0482896bcdf9af7011880042cristy/*
22729731df786aef53bf0482896bcdf9af7011880042cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
22739731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
22749731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
22759731df786aef53bf0482896bcdf9af7011880042cristy%                                                                             %
2276e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%   I m p o r t I m a g e P i x e l s                                         %
2277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  ImportImagePixels() accepts pixel data and stores in the image at the
2283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  location you specify.  The method returns MagickTrue on success otherwise
2284e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  MagickFalse if an error is encountered.  The pixel data can be either char,
2285b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  Quantum, short int, unsigned int, unsigned long long, float, or double in
2286b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  the order specified by map.
2287e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  Suppose your want to upload the first scanline of a 640x480 image from
2289e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  character data in red-green-blue order:
2290e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels);
2292e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  The format of the ImportImagePixels method is:
2294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2295cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%      MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
2296cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const ssize_t y,const size_t width,const size_t height,
2297cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const char *map,const StorageType type,const void *pixels,
2298cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        ExceptionInfo *exception)
2299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2300e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  A description of each parameter follows:
2301e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o image: the image.
2303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2304cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%    o x,y,width,height:  These values define the perimeter
2305e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      of a region of pixels you want to define.
2306e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o map:  This string reflects the expected ordering of the pixel array.
2308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      It can be any combination or order of R = red, G = green, B = blue,
2309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
2310e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
2311e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      P = pad.
2312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o type: Define the data type of the pixels.  Float and double types are
2314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
23156c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
2316ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy%      LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
23176c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
2318e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o pixels: This array of values contain the pixel components as defined by
2320e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      map and type.  You must preallocate this array where the expected
2321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      length varies depending on the values of width, height, map, and type.
2322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o exception: return any errors or warnings in this structure.
2324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/
2326e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2327cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportCharPixel(Image *image,const RectangleInfo *roi,
232846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
232946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
2330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned char
2332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
2333e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
23353fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
2336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2337e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
234014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
234114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
234214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2344e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2345e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2346e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned char *) pixels;
2347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2348e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2349cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2351cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2353e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2354cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2355e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2356e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2357e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2362e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2363e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2366e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2368cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2370cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2373cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2374e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2375e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2376e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRO") == 0)
2387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2388cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2390cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2392e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2393cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2394e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2399e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2408cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2410cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2412e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2413cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2415e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2428cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2430cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2431e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2432e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2433cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleCharToQuantum(*p++),q);
2436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2445cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2447cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2448e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2449e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2450cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2452e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2453e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2464cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2466cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2469cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2472e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBO") == 0)
2483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2484cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2486cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2489cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2504cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2506cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2509cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
252214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
2523cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
2524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2525cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
2527e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2528cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
2529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
2531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
2532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
253314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
2534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
2536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
2538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
2539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleCharToQuantum(*p),q);
2541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
2544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
2545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleCharToQuantum(*p),q);
2547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
2550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
2551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleCharToQuantum(*p),q);
2553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
2556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
2561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
2566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleCharToQuantum(*p),q);
2568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
2571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleCharToQuantum(*p),q);
2573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
2576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
2579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
2581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
2583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
2585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2587cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportDoublePixel(Image *image,const RectangleInfo *roi,
258846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
258946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
2590e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const double
2592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
2593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
25953fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
2596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
260014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
260114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
260214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const double *) pixels;
2607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2609cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2611cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2614cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
26168cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
26188cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2619e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
26208cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2631cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2633cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2636cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
26388cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
26408cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
26428cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
26448cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2655cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2657cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2660cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
26628cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
26648cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
26668cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2678cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2680cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2683cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
26858cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2696cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2698cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2701cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
27038cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27058cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27078cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2714e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2718cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2720cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2723cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
27258cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27278cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27298cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27318cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2742cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2744cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2747cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
27498cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27518cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
27538cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
276214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy   length=strlen(map);
2763cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
2764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2765cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
2767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2768cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
2769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
2771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
2772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
277314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
2774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
2776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
2778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
2779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
27808cd03c32d039162196906ff36501f3543019b56acristy            SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
2784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
2785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
27868cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2788e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
2790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
2791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
27928cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2793e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
2796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
27978cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
2801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
28028cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
2806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
28078cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q);
2808e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
2811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
28128cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
2816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
2819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
2821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
2823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
28253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2827cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportFloatPixel(Image *image,const RectangleInfo *roi,
282846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
282946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
28303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const float
2832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
2833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
28353fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
2836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
284014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
284114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
284214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const float *) pixels;
2847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2849cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2851cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2854cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
28568cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28588cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28608cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2871cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2873cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2876cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
28788cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28808cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28828cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
28848cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(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,"BGRP") == 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          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29048cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29068cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2918cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2920cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2923cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
29258cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
2926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2936cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2938cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2941cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
29438cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29458cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29478cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2958cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2960cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2963cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
29658cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29678cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29698cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29718cd03c32d039162196906ff36501f3543019b56acristy          SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
2972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2982cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2983e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2984cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2987cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
29898cd03c32d039162196906ff36501f3543019b56acristy          SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
2990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29918cd03c32d039162196906ff36501f3543019b56acristy          SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
2992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
29938cd03c32d039162196906ff36501f3543019b56acristy          SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
2994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
300214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3003cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3005cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3008cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
3009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
3012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
301314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
3016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
3019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
30208cd03c32d039162196906ff36501f3543019b56acristy            SetPixelRed(image,ClampToQuantum(QuantumRange*(*p)),q);
3021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
3025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
30268cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGreen(image,ClampToQuantum(QuantumRange*(*p)),q);
3027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
3031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
30328cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlue(image,ClampToQuantum(QuantumRange*(*p)),q);
3033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
3036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
30378cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
3038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
3041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
30428cd03c32d039162196906ff36501f3543019b56acristy            SetPixelAlpha(image,ClampToQuantum(QuantumRange*(*p)),q);
3043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
3046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
30478cd03c32d039162196906ff36501f3543019b56acristy            SetPixelBlack(image,ClampToQuantum(QuantumRange*(*p)),q);
3048e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
3051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
30528cd03c32d039162196906ff36501f3543019b56acristy            SetPixelGray(image,ClampToQuantum(QuantumRange*(*p)),q);
3053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3067cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongPixel(Image *image,const RectangleInfo *roi,
306846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
306946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
30703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned int
3072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
30733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
30744c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
30753fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
30763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3077bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
30783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
30793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
308014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
308114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
308214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
30839d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
30849d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
30859d314ff2c17a77996c05413c2013880387e50f0ecristy
3086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned int *) pixels;
3087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
30883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3089cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
30903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3091cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3094cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
31033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3108cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
31093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3110cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3111e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3112e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3113cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
31233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3128cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
31293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3130cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3133cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
31433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
3147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3148cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
31493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3150cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3153cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleLongToQuantum(*p++),q);
3156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
31603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3165cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
31663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3167cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3168e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3170cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3171e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3173e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3176e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
31793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3184cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
31853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3186cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3189cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3191e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3192e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3193e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3194e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3195e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3197e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
31993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3202e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3203e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3204cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
32053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3206cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3207e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3209cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3211e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3214e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3217e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
32193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
322214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3223cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3224e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3225cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3226e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3228cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
3229e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3230e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
3232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
323314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
32343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
3236e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3238e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
3239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleLongToQuantum(*p),q);
3241e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3243e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3244e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
3245e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3246e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleLongToQuantum(*p),q);
3247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3248e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3249e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3250e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
3251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3252e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleLongToQuantum(*p),q);
3253e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3254e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
3256e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3257e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3258e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3259e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3260e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
3261e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3262e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3263e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3264e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3265e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
3266e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3267e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleLongToQuantum(*p),q);
3268e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3269e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
3271e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleLongToQuantum(*p),q);
3273e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3276e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3284e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3286e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3287cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongLongPixel(Image *image,const RectangleInfo *roi,
328846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
328946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
3290e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3291b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  register const MagickSizeType
3292e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
3293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
32953fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
3296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3297e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3298e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
330014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
330114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
330214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3305e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3306b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  p=(const MagickSizeType *) pixels;
3307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3309cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3310e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3311cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3314cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3315e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3316b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3317b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3318b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3320e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3326e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3327e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3328cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3330cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3333cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3335b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3336b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3337b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3338b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3344e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3345e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3346e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3348cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3350cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3351e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3353cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3355b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3356b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3357b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3362e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3366e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
3367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3368cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3370cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3373cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3374e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3375b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGray(image,ScaleLongLongToQuantum(*p++),q);
3376e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3385cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3387cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3390cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3392b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3393b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3394b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
33993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3404cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
34053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3406cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3409cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3410e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3411b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3412b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3413b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3414b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3415e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
34193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3424cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3426cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3428e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3429cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3430e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3431b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3432b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3433b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
34393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
34413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
344214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3443cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
34443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3445cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3448cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
34493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
34523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
345314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
34563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
34593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3460b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelRed(image,ScaleLongLongToQuantum(*p),q);
3461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
34653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3466b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelGreen(image,ScaleLongLongToQuantum(*p),q);
3467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3469e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
34713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3472b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelBlue(image,ScaleLongLongToQuantum(*p),q);
3473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
34763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3477b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
34813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3482b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
34863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3487b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelBlack(image,ScaleLongLongToQuantum(*p),q);
3488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
34913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3492b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelGray(image,ScaleLongLongToQuantum(*p),q);
3493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
34973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3504e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3507cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportQuantumPixel(Image *image,const RectangleInfo *roi,
350846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
350946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
3510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
3512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
3513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
35153fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
3516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
352014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
352114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
352214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const Quantum *) pixels;
3527e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3529cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3531cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
35333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3534cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
35353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3548cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3550cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
35523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3553cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,*p++,q);
3559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
35603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3568cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
35693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3570cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
35714c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
35723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3573cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
35743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3579ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
35803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
35813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
35823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
35853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
35873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3588cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3590cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
35923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3593cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,*p++,q);
3596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
35973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3605cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
36063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3607cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
36084c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
36093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3610cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
36113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3615ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
36163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
36173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
36183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
36193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
36213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
36233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3624cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3626cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
36283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3629cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,*p++,q);
3635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
36363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3644cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
36453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3646cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
36474c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
36483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3649cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
36503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3655ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
36563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
36573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
36583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
36593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
36613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
366214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3663cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3665cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3668cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
36693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
36723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
367314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
36763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
36793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,*p,q);
3681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
36853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,*p,q);
3687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
36913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,*p,q);
3693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,*p,q);
3698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
36993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
37013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,*p,q);
3703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
37063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,*p,q);
3708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,*p,q);
3713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3727cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportShortPixel(Image *image,const RectangleInfo *roi,
372846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
372946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
3730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned short
3732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
3733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
37353fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
3736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
374014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
374114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
374214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned short *) pixels;
3747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3749cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3751cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
37524c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
37533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3754cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3759ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3768cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3770cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
37723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3773cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
37803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
37823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3786e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3788cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
37893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3790cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
37914c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
37923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3793cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
37943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3799ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
38003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
38013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
38023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
38033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
38053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
38073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3808cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3810cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
38123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3813cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
38143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleShortToQuantum(*p++),q);
3816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
38173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
38193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3825cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3827cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
38293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3830cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
38313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
38363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
38383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3844cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3846cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
38483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3849cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
38563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3864cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
38653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3866cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
38674c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
38683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3869cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
38703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3875ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
38773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
38783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
38793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
38813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
388214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3883cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3885cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3888cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
38893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
38923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
389314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
38963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
38993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3900e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleShortToQuantum(*p),q);
3901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
39053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleShortToQuantum(*p),q);
3907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
39113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleShortToQuantum(*p),q);
3913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
39163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
39213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
39263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleShortToQuantum(*p),q);
3928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3930e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
39313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleShortToQuantum(*p),q);
3933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3936e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3945e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3947cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristyMagickExport MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
3948cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const ssize_t y,const size_t width,const size_t height,const char *map,
3949cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const StorageType type,const void *pixels,ExceptionInfo *exception)
3950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  QuantumType
3952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *quantum_map;
3953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3954cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  RectangleInfo
3955cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    roi;
3956cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy
3957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    i;
3959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
396014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
396114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
396214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  /*
3964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    Allocate image structure.
3965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  */
3966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image != (Image *) NULL);
3967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image->signature == MagickSignature);
3968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image->debug != MagickFalse)
3969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
397014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
397114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
3972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (quantum_map == (QuantumType *) NULL)
3973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
3974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      image->filename);
397514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  for (i=0; i < (ssize_t) length; i++)
3976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    switch (map[i])
3978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'a':
3980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'A':
39813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=AlphaQuantum;
39838a46d827a124555f0c48fb2368ec1bba8e079ab6cristy        image->alpha_trait=BlendPixelTrait;
3984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'B':
3987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'b':
3988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlueQuantum;
3990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'C':
3993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'c':
3994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=CyanQuantum;
3996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
3997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'g':
4000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'G':
4001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4002e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=GreenQuantum;
4003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'K':
4006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'k':
4007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlackQuantum;
4009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
4010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'I':
4013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'i':
4014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=IndexQuantum;
4016b7b3da6aa145fe62d107c4b4c1a25bcc24bd1006cristy        (void) SetImageColorspace(image,GRAYColorspace,exception);
4017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'm':
4020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'M':
4021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=MagentaQuantum;
4023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
4024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'O':
4027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'o':
4028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=OpacityQuantum;
40308a46d827a124555f0c48fb2368ec1bba8e079ab6cristy        image->alpha_trait=BlendPixelTrait;
4031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'P':
4034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'p':
4035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=UndefinedQuantum;
4037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'R':
4040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'r':
4041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=RedQuantum;
4043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
40443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'Y':
4046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'y':
4047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4048e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=YellowQuantum;
4049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
4050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
4051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      default:
4053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
4054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
4055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
4056efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy          "UnrecognizedPixelMap","`%s'",map);
4057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
4058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
4059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
4061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
4062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    return(MagickFalse);
4063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  /*
4064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    Transfer the pixels from the pixel data to the image.
4065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  */
4066cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.width=width;
4067cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.height=height;
4068cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.x=x;
4069cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.y=y;
4070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  switch (type)
4071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
4072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case CharPixel:
4073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4074cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportCharPixel(image,&roi,map,quantum_map,pixels,exception);
4075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case DoublePixel:
4078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4079cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
4080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case FloatPixel:
4083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4084cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
4085e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
40876c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongPixel:
4088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4089cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportLongPixel(image,&roi,map,quantum_map,pixels,exception);
4090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
40926c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongLongPixel:
4093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4094cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
4095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case QuantumPixel:
4098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4099cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
4100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
4101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
4102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case ShortPixel:
4103e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4104cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportShortPixel(image,&roi,map,quantum_map,pixels,exception);
41053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
4110c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
4111efe601ce9ea5ad34ad0e8ad6e61d9be9b148b2a3cristy        "UnrecognizedPixelMap","`%s'",map);
41123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
41133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
41163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
41173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4118d76c51ed30cf4084f4434ba08925d16001d1e340cristy
4119d76c51ed30cf4084f4434ba08925d16001d1e340cristy/*
4120d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4121a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4122a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4123a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4124bd5a96cd2b69f218f85a7adc306296a736f91a56cristy+   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                         %
4125bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4126bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4127bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4128bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4129bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4130bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  InitializePixelChannelMap() defines the standard pixel component map.
4131bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4132bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  The format of the InitializePixelChannelMap() method is:
4133bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4134bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      void InitializePixelChannelMap(Image *image)
4135bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4136bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  A description of each parameter follows:
4137bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4138bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%    o image: the image.
4139bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
4140bd5a96cd2b69f218f85a7adc306296a736f91a56cristy*/
4141021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4142021216a8b35ea91ef1f12713ed41da843bbaee7bcristystatic void LogPixelChannels(const Image *image)
4143021216a8b35ea91ef1f12713ed41da843bbaee7bcristy{
4144021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  register ssize_t
4145021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    i;
4146021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4147021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%.20g]",
4148021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    image->filename,(double) image->number_channels);
4149021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  for (i=0; i < (ssize_t) image->number_channels; i++)
4150021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  {
4151021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    char
4152021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      traits[MaxTextExtent];
4153021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4154021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    const char
4155021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      *name;
4156021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4157021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    PixelChannel
4158021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      channel;
4159021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4160021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    switch (GetPixelChannelChannel(image,i))
4161021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    {
4162021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case RedPixelChannel:
4163021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4164021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="red";
4165021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == CMYKColorspace)
4166021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="cyan";
4167021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == GRAYColorspace)
4168021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="gray";
4169021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4170021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4171021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case GreenPixelChannel:
4172021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4173021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="green";
4174021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == CMYKColorspace)
4175021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="magenta";
4176021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4177021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4178021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case BluePixelChannel:
4179021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4180021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="blue";
4181021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->colorspace == CMYKColorspace)
4182021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="yellow";
4183021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4184021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4185021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case BlackPixelChannel:
4186021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4187021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="black";
4188021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        if (image->storage_class == PseudoClass)
4189021216a8b35ea91ef1f12713ed41da843bbaee7bcristy          name="index";
4190021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4191021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4192021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case IndexPixelChannel:
4193021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4194021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="index";
4195021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4196021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4197021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case AlphaPixelChannel:
4198021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4199021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="alpha";
4200021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4201021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4202021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case ReadMaskPixelChannel:
4203021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
42040481714f03ee904233a3aa1a5ed8c7690c9d361dcristy        name="read-mask";
4205021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4206021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4207021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case WriteMaskPixelChannel:
4208021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
42090481714f03ee904233a3aa1a5ed8c7690c9d361dcristy        name="write-mask";
4210021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4211021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4212021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      case MetaPixelChannel:
4213021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      {
4214021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="meta";
4215021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        break;
4216021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      }
4217021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      default:
4218021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        name="undefined";
4219021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    }
4220021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    channel=GetPixelChannelChannel(image,i);
4221021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    *traits='\0';
4222021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if ((GetPixelChannelTraits(image,channel) & UpdatePixelTrait) != 0)
4223021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      (void) ConcatenateMagickString(traits,"update,",MaxTextExtent);
4224021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if ((GetPixelChannelTraits(image,channel) & BlendPixelTrait) != 0)
4225021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      (void) ConcatenateMagickString(traits,"blend,",MaxTextExtent);
4226021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if ((GetPixelChannelTraits(image,channel) & CopyPixelTrait) != 0)
4227021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      (void) ConcatenateMagickString(traits,"copy,",MaxTextExtent);
4228021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    if (*traits == '\0')
4229021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      (void) ConcatenateMagickString(traits,"undefined,",MaxTextExtent);
4230021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    traits[strlen(traits)-1]='\0';
4231021216a8b35ea91ef1f12713ed41da843bbaee7bcristy    (void) LogMagickEvent(PixelEvent,GetMagickModule(),"  %.20g: %s (%s)",
4232021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      (double) i,name,traits);
4233021216a8b35ea91ef1f12713ed41da843bbaee7bcristy  }
4234021216a8b35ea91ef1f12713ed41da843bbaee7bcristy}
4235021216a8b35ea91ef1f12713ed41da843bbaee7bcristy
4236e2a912b6c9086c98ec838baa0824cd8deca55538cristyMagickExport void InitializePixelChannelMap(Image *image)
423777c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy{
4238e2a912b6c9086c98ec838baa0824cd8deca55538cristy  PixelTrait
4239e2a912b6c9086c98ec838baa0824cd8deca55538cristy    trait;
4240e2a912b6c9086c98ec838baa0824cd8deca55538cristy
424177c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  register ssize_t
424277c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    i;
424377c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy
4244d26338ffb761a86f047d7bbb9a596800f53c8649cristy  ssize_t
424577c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    n;
424677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy
424777c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  assert(image != (Image *) NULL);
424877c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  assert(image->signature == MagickSignature);
4249e2a912b6c9086c98ec838baa0824cd8deca55538cristy  (void) ResetMagickMemory(image->channel_map,0,MaxPixelChannels*
4250e2a912b6c9086c98ec838baa0824cd8deca55538cristy    sizeof(*image->channel_map));
4251e2a912b6c9086c98ec838baa0824cd8deca55538cristy  trait=UpdatePixelTrait;
42528a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  if (image->alpha_trait == BlendPixelTrait)
425361f18adcc41fdd05d57e50544cdb9d321bb18953cristy    trait=(PixelTrait) (trait | BlendPixelTrait);
425477c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  n=0;
4255c06c58036e12a41593f1c7a984f1fdb4e9cc434bcristy  if (image->colorspace == GRAYColorspace)
425677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    {
4257cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,BluePixelChannel,trait,n);
4258cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,GreenPixelChannel,trait,n);
4259cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,RedPixelChannel,trait,n++);
42603c3162882db2814a5b709072cd03b8d18c80d6afcristy    }
42613c3162882db2814a5b709072cd03b8d18c80d6afcristy  else
42623c3162882db2814a5b709072cd03b8d18c80d6afcristy    {
4263cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,RedPixelChannel,trait,n++);
4264cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,GreenPixelChannel,trait,n++);
4265cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      SetPixelChannelAttributes(image,BluePixelChannel,trait,n++);
426677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    }
426777c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  if (image->colorspace == CMYKColorspace)
4268cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,BlackPixelChannel,trait,n++);
42698a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  if (image->alpha_trait != UndefinedPixelTrait)
4270cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,AlphaPixelChannel,CopyPixelTrait,n++);
4271bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (image->storage_class == PseudoClass)
4272cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,IndexPixelChannel,CopyPixelTrait,n++);
4273883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->read_mask != MagickFalse)
4274883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelAttributes(image,ReadMaskPixelChannel,CopyPixelTrait,n++);
4275883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->write_mask != MagickFalse)
4276883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelAttributes(image,WriteMaskPixelChannel,CopyPixelTrait,n++);
4277e2a912b6c9086c98ec838baa0824cd8deca55538cristy  assert((n+image->number_meta_channels) < MaxPixelChannels);
4278e2a912b6c9086c98ec838baa0824cd8deca55538cristy  for (i=0; i < (ssize_t) image->number_meta_channels; i++)
4279cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy    SetPixelChannelAttributes(image,(PixelChannel) (MetaPixelChannel+i),
4280cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy      CopyPixelTrait,n++);
4281d26338ffb761a86f047d7bbb9a596800f53c8649cristy  image->number_channels=(size_t) n;
42826dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy  if (image->debug != MagickFalse)
42836dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy    LogPixelChannels(image);
4284cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy  (void) SetImageChannelMask(image,image->channel_mask);
4285bd5a96cd2b69f218f85a7adc306296a736f91a56cristy}
4286bd5a96cd2b69f218f85a7adc306296a736f91a56cristy
4287bd5a96cd2b69f218f85a7adc306296a736f91a56cristy/*
4288bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4289bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4290bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4291bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4292a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%   I n t e r p o l a t e P i x e l C h a n n e l                             %
4293a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4294a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4295a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4296a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4297a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4298884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  InterpolatePixelChannel() applies a pixel interpolation method between a
4299884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
4300884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  pixel area resampling, or scaling of the result is performed.
4301a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4302cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just the specified channel.
4303cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
4304a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%  The format of the InterpolatePixelChannel method is:
4305a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4306a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%      MagickBooleanType InterpolatePixelChannel(const Image *image,
4307444eda6285b2191e662c3d375c86770da70a83b0cristy%        const CacheView *image_view,const PixelChannel channel,
43085c4e2586d27d4299a742d170d41105de1689aa46cristy%        const PixelInterpolateMethod method,const double x,const double y,
4309a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%        double *pixel,ExceptionInfo *exception)
4310a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4311a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%  A description of each parameter follows:
4312a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4313a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o image: the image.
4314a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4315a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o image_view: the image view.
4316a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4317a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o channel: the pixel channel to interpolate.
4318a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4319a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o method: the pixel color interpolation method.
4320a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4321a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o x,y: A double representing the current (x,y) position of the pixel.
4322a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4323a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o pixel: return the interpolated pixel here.
4324a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4325a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o exception: return any errors or warnings in this structure.
4326a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4327a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy*/
432894ea1636709395774d7118ef56162d211904cfd2cristy
4329b0a657e13c4aefba39c51292005427b47277869dcristystatic inline void CatromWeights(const double x,double (*weights)[4])
4330884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{
4331a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
4332884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    alpha,
4333d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    beta,
4334884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    gamma;
4335884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
43365a5e4d97bc9afa4660902954d2eed4f23582dfeccristy  /*
43375a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    Nicolas Robidoux' 10 flops (4* + 5- + 1+) refactoring of the computation
43385a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    of the standard four 1D Catmull-Rom weights. The sampling location is
43395a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    assumed between the second and third input pixel locations, and x is the
43405a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    position relative to the second input pixel location. Formulas originally
43415a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    derived for the VIPS (Virtual Image Processing System) library.
43425a5e4d97bc9afa4660902954d2eed4f23582dfeccristy  */
4343a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  alpha=(double) 1.0-x;
4344a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  beta=(double) (-0.5)*x*alpha;
4345d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[0]=alpha*beta;
4346d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[3]=x*beta;
4347d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  /*
43485a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    The following computation of the inner weights from the outer ones work
43495a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    for all Keys cubics.
4350d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  */
4351d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  gamma=(*weights)[3]-(*weights)[0];
4352d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[1]=alpha-(*weights)[0]+gamma;
4353d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[2]=x-(*weights)[3]-gamma;
4354d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas}
4355d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas
4356b0a657e13c4aefba39c51292005427b47277869dcristystatic inline void SplineWeights(const double x,double (*weights)[4])
4357d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas{
43585a5e4d97bc9afa4660902954d2eed4f23582dfeccristy  double
43595a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    alpha,
43605a5e4d97bc9afa4660902954d2eed4f23582dfeccristy    beta;
43615a5e4d97bc9afa4660902954d2eed4f23582dfeccristy
4362d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  /*
436358ee5018960b42b80b54398eacabe9ae5da89149cristy    Nicolas Robidoux' 12 flops (6* + 5- + 1+) refactoring of the computation
436458ee5018960b42b80b54398eacabe9ae5da89149cristy    of the standard four 1D cubic B-spline smoothing weights. The sampling
436558ee5018960b42b80b54398eacabe9ae5da89149cristy    location is assumed between the second and third input pixel locations,
436658ee5018960b42b80b54398eacabe9ae5da89149cristy    and x is the position relative to the second input pixel location.
4367d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  */
4368a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  alpha=(double) 1.0-x;
4369a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  (*weights)[3]=(double) (1.0/6.0)*x*x*x;
4370a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  (*weights)[0]=(double) (1.0/6.0)*alpha*alpha*alpha;
4371d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  beta=(*weights)[3]-(*weights)[0];
4372d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[1]=alpha-(*weights)[0]+beta;
4373d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[2]=x-(*weights)[3]-beta;
4374884f600898ca6935a7981b4d56bf3d2c4ec17011cristy}
4375884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
437694ea1636709395774d7118ef56162d211904cfd2cristystatic inline double MeshInterpolate(const PointInfo *delta,const double p,
437794ea1636709395774d7118ef56162d211904cfd2cristy  const double x,const double y)
437894ea1636709395774d7118ef56162d211904cfd2cristy{
437994ea1636709395774d7118ef56162d211904cfd2cristy  return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
438094ea1636709395774d7118ef56162d211904cfd2cristy}
438194ea1636709395774d7118ef56162d211904cfd2cristy
4382cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony/*
4383a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristystatic inline ssize_t NearestNeighbor(const double x)
4384884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{
4385884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  if (x >= 0.0)
4386884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    return((ssize_t) (x+0.5));
4387884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  return((ssize_t) (x-0.5));
4388884f600898ca6935a7981b4d56bf3d2c4ec17011cristy}
4389cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony*/
4390884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4391a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristyMagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
4392a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  const CacheView *image_view,const PixelChannel channel,
43935c4e2586d27d4299a742d170d41105de1689aa46cristy  const PixelInterpolateMethod method,const double x,const double y,
4394a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  double *pixel,ExceptionInfo *exception)
4395a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy{
4396a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
439794ea1636709395774d7118ef56162d211904cfd2cristy    alpha[16],
4398884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    gamma,
4399884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    pixels[16];
440094ea1636709395774d7118ef56162d211904cfd2cristy
440158ee5018960b42b80b54398eacabe9ae5da89149cristy  MagickBooleanType
440258ee5018960b42b80b54398eacabe9ae5da89149cristy    status;
440358ee5018960b42b80b54398eacabe9ae5da89149cristy
440458ee5018960b42b80b54398eacabe9ae5da89149cristy  PixelInterpolateMethod
440558ee5018960b42b80b54398eacabe9ae5da89149cristy    interpolate;
440658ee5018960b42b80b54398eacabe9ae5da89149cristy
440794ea1636709395774d7118ef56162d211904cfd2cristy  PixelTrait
440894ea1636709395774d7118ef56162d211904cfd2cristy    traits;
440994ea1636709395774d7118ef56162d211904cfd2cristy
441094ea1636709395774d7118ef56162d211904cfd2cristy  register const Quantum
441194ea1636709395774d7118ef56162d211904cfd2cristy    *p;
441294ea1636709395774d7118ef56162d211904cfd2cristy
441350e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
441494ea1636709395774d7118ef56162d211904cfd2cristy    i;
441594ea1636709395774d7118ef56162d211904cfd2cristy
4416a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  ssize_t
4417a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    x_offset,
4418a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    y_offset;
4419a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy
4420a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image != (Image *) NULL);
4421a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image != (Image *) NULL);
4422a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image->signature == MagickSignature);
4423a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image_view != (CacheView *) NULL);
4424a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  status=MagickTrue;
4425884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  *pixel=0.0;
4426cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy  traits=GetPixelChannelTraits(image,channel);
4427a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  x_offset=(ssize_t) floor(x);
4428a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  y_offset=(ssize_t) floor(y);
4429cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  interpolate = method;
4430cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  if ( interpolate == UndefinedInterpolatePixel )
4431cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate = image->interpolate;
4432cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
4433a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  {
443458ee5018960b42b80b54398eacabe9ae5da89149cristy    case AverageInterpolatePixel:  /* nearest 4 neighbours */
443558ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average9InterpolatePixel:  /* nearest 9 neighbours */
443658ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average16InterpolatePixel:  /* nearest 16 neighbours */
4437884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4438fb12237dd6e4d4d8b92d879661153062eeca0572cristy      ssize_t
4439fb12237dd6e4d4d8b92d879661153062eeca0572cristy        count;
4440cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4441fb12237dd6e4d4d8b92d879661153062eeca0572cristy      count=2;  /* size of the area to average - default nearest 4 */
4442cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
4443cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4444cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
4445cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
4446cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
4447cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4448fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
4449fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if (interpolate == Average16InterpolatePixel)
4450fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
4451fb12237dd6e4d4d8b92d879661153062eeca0572cristy            count=4;
4452fb12237dd6e4d4d8b92d879661153062eeca0572cristy            x_offset--;
4453fb12237dd6e4d4d8b92d879661153062eeca0572cristy            y_offset--;
4454fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
4455021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count,
4456021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        (size_t) count,exception);
4457884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4458884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4459884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4460884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4461884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
446258ee5018960b42b80b54398eacabe9ae5da89149cristy      count*=count;  /* Number of pixels to average */
4463222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
446450e64b85215ce366ca50af1ba16326c784221f92cristy        for (i=0; i < (ssize_t) count; i++)
4465884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4466884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4467a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4468884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4469884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
447050e64b85215ce366ca50af1ba16326c784221f92cristy        for (i=0; i < (ssize_t) count; i++)
4471884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4472884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4473884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4474884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4475884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
447650e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) count; i++)
4477884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      {
44783e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        gamma=PerceptibleReciprocal(alpha[i])/count;
4479cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        *pixel+=gamma*pixels[i];
4480884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      }
4481884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4482884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4483cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
4484cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
4485cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
4486cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      PointInfo
4487cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta,
4488cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon;
4489cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4490cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4491cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
4492cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4493cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
4494cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
4495cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4496cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if ((traits & BlendPixelTrait) == 0)
4497cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        for (i=0; i < 4; i++)
4498cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4499cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]=1.0;
4500a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4501cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4502cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else
4503cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        for (i=0; i < 4; i++)
4504cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4505cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4506cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            GetPixelChannels(image));
4507cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4508cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4509cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.x=x-x_offset;
4510cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.y=y-y_offset;
4511cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.x=1.0-delta.x;
4512cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.y=1.0-delta.y;
4513cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4514cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*alpha[2]+delta.x*alpha[3])));
45153e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      gamma=PerceptibleReciprocal(gamma);
4516cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*
4517cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*pixels[2]+delta.x*pixels[3]));
4518cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
4519cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
45205f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    case BlendInterpolatePixel:
45215f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    {
45225f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
45235f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if (p == (const Quantum *) NULL)
45245f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
45255f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          status=MagickFalse;
45265f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          break;
45275f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
45285f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if ((traits & BlendPixelTrait) == 0)
45295f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        for (i=0; i < 4; i++)
45305f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
45315f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          alpha[i]=1.0;
45325f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
45335f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
45345f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      else
45355f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        for (i=0; i < 4; i++)
45365f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
45375f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
45385f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            GetPixelChannels(image));
45395f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
45405f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
454158ee5018960b42b80b54398eacabe9ae5da89149cristy      gamma=1.0;  /* number of pixels blended together (its variable) */
45425f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      for (i=0; i <= 1L; i++) {
4543fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((y-y_offset) >= 0.75)
4544fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
4545fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[i]=alpha[i+2];  /* take right pixels */
4546fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[i]=pixels[i+2];
4547fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
4548fb12237dd6e4d4d8b92d879661153062eeca0572cristy        else
4549fb12237dd6e4d4d8b92d879661153062eeca0572cristy          if ((y-y_offset) > 0.25)
4550fb12237dd6e4d4d8b92d879661153062eeca0572cristy            {
4551fb12237dd6e4d4d8b92d879661153062eeca0572cristy              gamma=2.0;  /* blend both pixels in row */
4552fb12237dd6e4d4d8b92d879661153062eeca0572cristy              alpha[i]+=alpha[i+2];  /* add up alpha weights */
4553fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i]+=pixels[i+2];
4554fb12237dd6e4d4d8b92d879661153062eeca0572cristy            }
45555f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      }
4556fb12237dd6e4d4d8b92d879661153062eeca0572cristy      if ((x-x_offset) >= 0.75)
4557fb12237dd6e4d4d8b92d879661153062eeca0572cristy        {
4558fb12237dd6e4d4d8b92d879661153062eeca0572cristy          alpha[0]=alpha[1];  /* take bottom row blend */
4559fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[0]=pixels[1];
4560fb12237dd6e4d4d8b92d879661153062eeca0572cristy        }
4561fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
4562fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((x-x_offset) > 0.25)
4563fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
4564fb12237dd6e4d4d8b92d879661153062eeca0572cristy            gamma*=2.0;  /* blend both rows */
4565fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[0]+=alpha[1];  /* add up alpha weights */
4566fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0]+=pixels[1];
4567fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
45685f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if (channel != AlphaPixelChannel)
456958ee5018960b42b80b54398eacabe9ae5da89149cristy        gamma=PerceptibleReciprocal(alpha[0]);  /* (color) 1/alpha_weights */
45705f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      else
457158ee5018960b42b80b54398eacabe9ae5da89149cristy        gamma=PerceptibleReciprocal(gamma);  /* (alpha) 1/number_of_pixels */
45725f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      *pixel=gamma*pixels[0];
45735f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      break;
45745f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    }
4575cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
4576884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4577a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
4578380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
45796676f5a461ba75c5f4a927218cb3577dd29d70aenicolas        cy[4];
4580884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4581884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4582884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        exception);
4583884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4584884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4585884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4586884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4587884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4588222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
4589884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4590884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4591884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4592a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4593884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4594884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
4595884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4596884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4597884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4598884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4599884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4600884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4601a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (x-x_offset),&cx);
4602a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (y-y_offset),&cy);
4603a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      gamma=(channel == AlphaPixelChannel ? (double) 1.0 :
46043e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4605d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4606d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4607d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4608d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*alpha[14]+cx[3]*alpha[15])));
4609380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4610d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4611d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4612d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4613d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4614884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4615884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4616884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case IntegerInterpolatePixel:
4617884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4618884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4619884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4620884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4621884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4622884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4623884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
46240beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy      *pixel=(double) GetPixelChannel(image,channel,p);
4625884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4626884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4627cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
4628884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4629cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
4630cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
4631cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4632884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4633884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4634884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4635884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4636884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
46370beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy      *pixel=(double) GetPixelChannel(image,channel,p);
4638884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4639884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4640884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case MeshInterpolatePixel:
4641884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4642884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      PointInfo
4643884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        delta,
4644884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        luminance;
4645884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4646884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4647884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4648884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4649884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4650884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4651884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4652222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
465394ea1636709395774d7118ef56162d211904cfd2cristy        for (i=0; i < 4; i++)
465494ea1636709395774d7118ef56162d211904cfd2cristy        {
465594ea1636709395774d7118ef56162d211904cfd2cristy          alpha[i]=1.0;
4656a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
465794ea1636709395774d7118ef56162d211904cfd2cristy        }
465894ea1636709395774d7118ef56162d211904cfd2cristy      else
465994ea1636709395774d7118ef56162d211904cfd2cristy        for (i=0; i < 4; i++)
466094ea1636709395774d7118ef56162d211904cfd2cristy        {
466194ea1636709395774d7118ef56162d211904cfd2cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
466294ea1636709395774d7118ef56162d211904cfd2cristy            GetPixelChannels(image));
466394ea1636709395774d7118ef56162d211904cfd2cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
466494ea1636709395774d7118ef56162d211904cfd2cristy        }
4665884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      delta.x=x-x_offset;
4666884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      delta.y=y-y_offset;
4667884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      luminance.x=GetPixelLuminance(image,p)-(double)
4668884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        GetPixelLuminance(image,p+3*GetPixelChannels(image));
466928474bfbda5ee2d4da2eb79f299cf1f692770b99cristy      luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4670884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        GetPixelLuminance(image,p+2*GetPixelChannels(image));
467194ea1636709395774d7118ef56162d211904cfd2cristy      if (fabs(luminance.x) < fabs(luminance.y))
467294ea1636709395774d7118ef56162d211904cfd2cristy        {
467394ea1636709395774d7118ef56162d211904cfd2cristy          /*
467494ea1636709395774d7118ef56162d211904cfd2cristy            Diagonal 0-3 NW-SE.
467594ea1636709395774d7118ef56162d211904cfd2cristy          */
467694ea1636709395774d7118ef56162d211904cfd2cristy          if (delta.x <= delta.y)
467794ea1636709395774d7118ef56162d211904cfd2cristy            {
467894ea1636709395774d7118ef56162d211904cfd2cristy              /*
467994ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-left triangle (pixel: 2, diagonal: 0-3).
468094ea1636709395774d7118ef56162d211904cfd2cristy              */
468194ea1636709395774d7118ef56162d211904cfd2cristy              delta.y=1.0-delta.y;
468294ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
46833e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
468494ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3],
468594ea1636709395774d7118ef56162d211904cfd2cristy                pixels[0]);
468694ea1636709395774d7118ef56162d211904cfd2cristy            }
468794ea1636709395774d7118ef56162d211904cfd2cristy          else
468894ea1636709395774d7118ef56162d211904cfd2cristy            {
468994ea1636709395774d7118ef56162d211904cfd2cristy              /*
469094ea1636709395774d7118ef56162d211904cfd2cristy                Top-right triangle (pixel: 1, diagonal: 0-3).
469194ea1636709395774d7118ef56162d211904cfd2cristy              */
469294ea1636709395774d7118ef56162d211904cfd2cristy              delta.x=1.0-delta.x;
469394ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
46943e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
469594ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0],
469694ea1636709395774d7118ef56162d211904cfd2cristy                pixels[3]);
469794ea1636709395774d7118ef56162d211904cfd2cristy            }
469894ea1636709395774d7118ef56162d211904cfd2cristy        }
469994ea1636709395774d7118ef56162d211904cfd2cristy      else
470094ea1636709395774d7118ef56162d211904cfd2cristy        {
470194ea1636709395774d7118ef56162d211904cfd2cristy          /*
470294ea1636709395774d7118ef56162d211904cfd2cristy            Diagonal 1-2 NE-SW.
470394ea1636709395774d7118ef56162d211904cfd2cristy          */
470494ea1636709395774d7118ef56162d211904cfd2cristy          if (delta.x <= (1.0-delta.y))
470594ea1636709395774d7118ef56162d211904cfd2cristy            {
470694ea1636709395774d7118ef56162d211904cfd2cristy              /*
470794ea1636709395774d7118ef56162d211904cfd2cristy                Top-left triangle (pixel: 0, diagonal: 1-2).
470894ea1636709395774d7118ef56162d211904cfd2cristy              */
470994ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
47103e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
471194ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1],
471294ea1636709395774d7118ef56162d211904cfd2cristy                pixels[2]);
471394ea1636709395774d7118ef56162d211904cfd2cristy            }
471494ea1636709395774d7118ef56162d211904cfd2cristy          else
471594ea1636709395774d7118ef56162d211904cfd2cristy            {
471694ea1636709395774d7118ef56162d211904cfd2cristy              /*
471794ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-right triangle (pixel: 3, diagonal: 1-2).
471894ea1636709395774d7118ef56162d211904cfd2cristy              */
471994ea1636709395774d7118ef56162d211904cfd2cristy              delta.x=1.0-delta.x;
472094ea1636709395774d7118ef56162d211904cfd2cristy              delta.y=1.0-delta.y;
472194ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
47223e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
472394ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2],
472494ea1636709395774d7118ef56162d211904cfd2cristy                pixels[1]);
472594ea1636709395774d7118ef56162d211904cfd2cristy            }
472694ea1636709395774d7118ef56162d211904cfd2cristy        }
4727a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy      break;
4728a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    }
4729884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case SplineInterpolatePixel:
4730884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4731a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
4732d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
47336676f5a461ba75c5f4a927218cb3577dd29d70aenicolas        cy[4];
4734884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4735884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4736884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        exception);
4737884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4738884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4739884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4740884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4741884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4742222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
4743884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4744884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4745884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4746a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[i]=(double) p[i*GetPixelChannels(image)+channel];
4747884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4748884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
4749884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4750884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4751884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4752884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4753884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4754884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4755a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (x-x_offset),&cx);
4756a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (y-y_offset),&cy);
4757a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      gamma=(channel == AlphaPixelChannel ? (double) 1.0 :
47583e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4759d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4760d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4761d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4762d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*alpha[14]+cx[3]*alpha[15])));
4763d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4764d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4765d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4766d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4767d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4768884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4769884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4770a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  }
4771a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  return(status);
4772a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy}
4773a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy
4774a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy/*
4775a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4776d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
4777d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
4778d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
47795c4e2586d27d4299a742d170d41105de1689aa46cristy%   I n t e r p o l a t e P i x e l C h a n n e l s                           %
47805c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
47815c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
47825c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
47835c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47845c4e2586d27d4299a742d170d41105de1689aa46cristy%
47855c4e2586d27d4299a742d170d41105de1689aa46cristy%  InterpolatePixelChannels() applies a pixel interpolation method between a
47865c4e2586d27d4299a742d170d41105de1689aa46cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
47875c4e2586d27d4299a742d170d41105de1689aa46cristy%  pixel area resampling, or scaling of the result is performed.
47885c4e2586d27d4299a742d170d41105de1689aa46cristy%
4789cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just the current channel setting of the
4790cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  destination image into which the color is to be stored
4791cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
47925c4e2586d27d4299a742d170d41105de1689aa46cristy%  The format of the InterpolatePixelChannels method is:
47935c4e2586d27d4299a742d170d41105de1689aa46cristy%
47945c4e2586d27d4299a742d170d41105de1689aa46cristy%      MagickBooleanType InterpolatePixelChannels(const Image *source,
47955c4e2586d27d4299a742d170d41105de1689aa46cristy%        const CacheView *source_view,const Image *destination,
47965c4e2586d27d4299a742d170d41105de1689aa46cristy%        const PixelInterpolateMethod method,const double x,const double y,
47975c4e2586d27d4299a742d170d41105de1689aa46cristy%        Quantum *pixel,ExceptionInfo *exception)
47985c4e2586d27d4299a742d170d41105de1689aa46cristy%
47995c4e2586d27d4299a742d170d41105de1689aa46cristy%  A description of each parameter follows:
48005c4e2586d27d4299a742d170d41105de1689aa46cristy%
48015c4e2586d27d4299a742d170d41105de1689aa46cristy%    o source: the source.
48025c4e2586d27d4299a742d170d41105de1689aa46cristy%
48035c4e2586d27d4299a742d170d41105de1689aa46cristy%    o source_view: the source view.
48045c4e2586d27d4299a742d170d41105de1689aa46cristy%
4805cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%    o destination: the destination image, for the interpolated color
48065c4e2586d27d4299a742d170d41105de1689aa46cristy%
48075c4e2586d27d4299a742d170d41105de1689aa46cristy%    o method: the pixel color interpolation method.
48085c4e2586d27d4299a742d170d41105de1689aa46cristy%
48095c4e2586d27d4299a742d170d41105de1689aa46cristy%    o x,y: A double representing the current (x,y) position of the pixel.
48105c4e2586d27d4299a742d170d41105de1689aa46cristy%
48115c4e2586d27d4299a742d170d41105de1689aa46cristy%    o pixel: return the interpolated pixel here.
48125c4e2586d27d4299a742d170d41105de1689aa46cristy%
48135c4e2586d27d4299a742d170d41105de1689aa46cristy%    o exception: return any errors or warnings in this structure.
48145c4e2586d27d4299a742d170d41105de1689aa46cristy%
48155c4e2586d27d4299a742d170d41105de1689aa46cristy*/
48165c4e2586d27d4299a742d170d41105de1689aa46cristyMagickExport MagickBooleanType InterpolatePixelChannels(const Image *source,
48175c4e2586d27d4299a742d170d41105de1689aa46cristy  const CacheView *source_view,const Image *destination,
48185c4e2586d27d4299a742d170d41105de1689aa46cristy  const PixelInterpolateMethod method,const double x,const double y,
48195c4e2586d27d4299a742d170d41105de1689aa46cristy  Quantum *pixel,ExceptionInfo *exception)
48205c4e2586d27d4299a742d170d41105de1689aa46cristy{
48215c4e2586d27d4299a742d170d41105de1689aa46cristy  MagickBooleanType
48225c4e2586d27d4299a742d170d41105de1689aa46cristy    status;
48235c4e2586d27d4299a742d170d41105de1689aa46cristy
4824a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
48255c4e2586d27d4299a742d170d41105de1689aa46cristy    alpha[16],
48265c4e2586d27d4299a742d170d41105de1689aa46cristy    gamma,
48275c4e2586d27d4299a742d170d41105de1689aa46cristy    pixels[16];
48285c4e2586d27d4299a742d170d41105de1689aa46cristy
48295c4e2586d27d4299a742d170d41105de1689aa46cristy  register const Quantum
48305c4e2586d27d4299a742d170d41105de1689aa46cristy    *p;
48315c4e2586d27d4299a742d170d41105de1689aa46cristy
483250e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
48335c4e2586d27d4299a742d170d41105de1689aa46cristy    i;
48345c4e2586d27d4299a742d170d41105de1689aa46cristy
48355c4e2586d27d4299a742d170d41105de1689aa46cristy  ssize_t
48365c4e2586d27d4299a742d170d41105de1689aa46cristy    x_offset,
48375c4e2586d27d4299a742d170d41105de1689aa46cristy    y_offset;
48385c4e2586d27d4299a742d170d41105de1689aa46cristy
4839cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  PixelInterpolateMethod
4840cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate;
4841cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
48425c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source != (Image *) NULL);
48435c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source != (Image *) NULL);
48445c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source->signature == MagickSignature);
48455c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source_view != (CacheView *) NULL);
48465c4e2586d27d4299a742d170d41105de1689aa46cristy  status=MagickTrue;
48475c4e2586d27d4299a742d170d41105de1689aa46cristy  x_offset=(ssize_t) floor(x);
48485c4e2586d27d4299a742d170d41105de1689aa46cristy  y_offset=(ssize_t) floor(y);
4849cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  interpolate = method;
4850cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  if ( interpolate == UndefinedInterpolatePixel )
4851cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate = source->interpolate;
4852cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
48535c4e2586d27d4299a742d170d41105de1689aa46cristy  {
485458ee5018960b42b80b54398eacabe9ae5da89149cristy    case AverageInterpolatePixel:  /* nearest 4 neighbours */
485558ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average9InterpolatePixel:  /* nearest 9 neighbours */
485658ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average16InterpolatePixel:  /* nearest 16 neighbours */
48575c4e2586d27d4299a742d170d41105de1689aa46cristy    {
4858fb12237dd6e4d4d8b92d879661153062eeca0572cristy      ssize_t
4859fb12237dd6e4d4d8b92d879661153062eeca0572cristy        count;
4860cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4861fb12237dd6e4d4d8b92d879661153062eeca0572cristy      count=2;  /* size of the area to average - default nearest 4 */
4862cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
4863cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4864cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
4865cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
4866cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
4867cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4868fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
4869fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if (interpolate == Average16InterpolatePixel)
4870fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
4871fb12237dd6e4d4d8b92d879661153062eeca0572cristy            count=4;
4872fb12237dd6e4d4d8b92d879661153062eeca0572cristy            x_offset--;
4873fb12237dd6e4d4d8b92d879661153062eeca0572cristy            y_offset--;
4874fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
48751b72b8194b7d3f274bebf9e176192fd29e385481cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,(size_t) count,
48761b72b8194b7d3f274bebf9e176192fd29e385481cristy        (size_t) count,exception);
48775c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
48785c4e2586d27d4299a742d170d41105de1689aa46cristy        {
48795c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
48805c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
48815c4e2586d27d4299a742d170d41105de1689aa46cristy        }
488258ee5018960b42b80b54398eacabe9ae5da89149cristy      count*=count;  /* Number of pixels to average */
488350e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
48845c4e2586d27d4299a742d170d41105de1689aa46cristy      {
48855c4e2586d27d4299a742d170d41105de1689aa46cristy        double
48865c4e2586d27d4299a742d170d41105de1689aa46cristy          sum;
48875c4e2586d27d4299a742d170d41105de1689aa46cristy
488850e64b85215ce366ca50af1ba16326c784221f92cristy        register ssize_t
48895c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
48905c4e2586d27d4299a742d170d41105de1689aa46cristy
48915a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
48925a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
48935a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
48945a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
48955c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
48965c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
48975c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
489850e64b85215ce366ca50af1ba16326c784221f92cristy        for (j=0; j < (ssize_t) count; j++)
4899a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          pixels[j]=(double) p[j*GetPixelChannels(source)+i];
49004a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        sum=0.0;
49015c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
49025c4e2586d27d4299a742d170d41105de1689aa46cristy          {
490350e64b85215ce366ca50af1ba16326c784221f92cristy            for (j=0; j < (ssize_t) count; j++)
4904cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              sum+=pixels[j];
4905cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            sum/=count;
49064a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy            SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
49075c4e2586d27d4299a742d170d41105de1689aa46cristy            continue;
49085c4e2586d27d4299a742d170d41105de1689aa46cristy          }
490950e64b85215ce366ca50af1ba16326c784221f92cristy        for (j=0; j < (ssize_t) count; j++)
49105c4e2586d27d4299a742d170d41105de1689aa46cristy        {
49115c4e2586d27d4299a742d170d41105de1689aa46cristy          alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
49125c4e2586d27d4299a742d170d41105de1689aa46cristy            GetPixelChannels(source));
49135c4e2586d27d4299a742d170d41105de1689aa46cristy          pixels[j]*=alpha[j];
49143e3ec3afbb0782697f201cbe30a56794c10dc7efcristy          gamma=PerceptibleReciprocal(alpha[j]);
4915cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          sum+=gamma*pixels[j];
49165c4e2586d27d4299a742d170d41105de1689aa46cristy        }
4917cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        sum/=count;
49184a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
49195c4e2586d27d4299a742d170d41105de1689aa46cristy      }
49205c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
49215c4e2586d27d4299a742d170d41105de1689aa46cristy    }
4922cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
4923cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
4924cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
4925cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4926cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
4927cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4928cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
4929cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
4930cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
493150e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4932cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      {
4933cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        PointInfo
4934cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          delta,
4935cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          epsilon;
4936cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
49375a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
49385a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
49395a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
49405a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
4941cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if ((traits == UndefinedPixelTrait) ||
4942cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            (destination_traits == UndefinedPixelTrait))
4943cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          continue;
4944cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta.x=x-x_offset;
4945cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta.y=y-y_offset;
4946cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon.x=1.0-delta.x;
4947cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon.y=1.0-delta.y;
4948a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[0]=(double) p[i];
4949a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[1]=(double) p[GetPixelChannels(source)+i];
4950a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[2]=(double) p[2*GetPixelChannels(source)+i];
4951a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[3]=(double) p[3*GetPixelChannels(source)+i];
4952cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if ((traits & BlendPixelTrait) == 0)
4953cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          {
4954cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
49553e3ec3afbb0782697f201cbe30a56794c10dc7efcristy            gamma=PerceptibleReciprocal(gamma);
4956cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4957cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*
4958cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              pixels[2]+delta.x*pixels[3]))),pixel);
4959cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            continue;
4960cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          }
4961cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4962cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source));
4963cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4964cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          GetPixelChannels(source));
4965cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4966cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          GetPixelChannels(source));
4967cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0]*=alpha[0];
4968cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1]*=alpha[1];
4969cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[2]*=alpha[2];
4970cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3]*=alpha[3];
4971cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4972cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          (epsilon.x*alpha[2]+delta.x*alpha[3])));
49733e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        gamma=PerceptibleReciprocal(gamma);
4974cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4975cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+
4976cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          delta.x*pixels[3]))),pixel);
4977cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
4978cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
4979cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
49805f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    case BlendInterpolatePixel:
49815f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    {
49825f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
49835f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      if (p == (const Quantum *) NULL)
49845f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        {
49855f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          status=MagickFalse;
49865f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          break;
49875f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
49885f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
49895f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      {
49905f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        register ssize_t
49915f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          j;
49925f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony
49935a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
49945a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
49955a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
49965a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
49975f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        if ((traits == UndefinedPixelTrait) ||
49985f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            (destination_traits == UndefinedPixelTrait))
49995f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          continue;
50005f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        if ((traits & BlendPixelTrait) == 0)
50015f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          for (j=0; j < 4; j++)
50025f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          {
50035f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            alpha[j]=1.0;
50045f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+channel];
50055f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          }
50065f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        else
50075f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          for (j=0; j < 4; j++)
50085f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          {
50095f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
50105f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony              GetPixelChannels(source));
50115f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+channel];
50125f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony          }
5013fb12237dd6e4d4d8b92d879661153062eeca0572cristy        gamma=1.0;  /* number of pixels blended together (its variable) */
5014fb12237dd6e4d4d8b92d879661153062eeca0572cristy        for (j=0; j <= 1L; j++)
5015fb12237dd6e4d4d8b92d879661153062eeca0572cristy        {
5016fb12237dd6e4d4d8b92d879661153062eeca0572cristy          if ((y-y_offset) >= 0.75)
5017fb12237dd6e4d4d8b92d879661153062eeca0572cristy            {
5018fb12237dd6e4d4d8b92d879661153062eeca0572cristy              alpha[j]=alpha[j+2];  /* take right pixels */
5019fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[j]=pixels[j+2];
5020fb12237dd6e4d4d8b92d879661153062eeca0572cristy            }
5021fb12237dd6e4d4d8b92d879661153062eeca0572cristy          else
5022fb12237dd6e4d4d8b92d879661153062eeca0572cristy            if ((y-y_offset) > 0.25)
5023fb12237dd6e4d4d8b92d879661153062eeca0572cristy              {
502458ee5018960b42b80b54398eacabe9ae5da89149cristy                gamma=2.0;  /* blend both pixels in row */
5025fb12237dd6e4d4d8b92d879661153062eeca0572cristy                alpha[j]+=alpha[j+2];  /* add up alpha weights */
5026fb12237dd6e4d4d8b92d879661153062eeca0572cristy                pixels[j]+=pixels[j+2];
5027fb12237dd6e4d4d8b92d879661153062eeca0572cristy              }
50285f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        }
5029fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((x-x_offset) >= 0.75)
5030fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
5031fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[0]=alpha[1];  /* take bottom row blend */
5032fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0]=pixels[1];
5033fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
5034fb12237dd6e4d4d8b92d879661153062eeca0572cristy        else
5035fb12237dd6e4d4d8b92d879661153062eeca0572cristy           if ((x-x_offset) > 0.25)
5036fb12237dd6e4d4d8b92d879661153062eeca0572cristy             {
5037fb12237dd6e4d4d8b92d879661153062eeca0572cristy               gamma*=2.0;  /* blend both rows */
5038fb12237dd6e4d4d8b92d879661153062eeca0572cristy               alpha[0]+=alpha[1];  /* add up alpha weights */
5039fb12237dd6e4d4d8b92d879661153062eeca0572cristy               pixels[0]+=pixels[1];
5040fb12237dd6e4d4d8b92d879661153062eeca0572cristy             }
50415f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        if ((traits & BlendPixelTrait) == 0)
504258ee5018960b42b80b54398eacabe9ae5da89149cristy          gamma=PerceptibleReciprocal(alpha[0]);  /* (color) 1/alpha_weights */
50435f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        else
504458ee5018960b42b80b54398eacabe9ae5da89149cristy          gamma=PerceptibleReciprocal(gamma);  /* (alpha) 1/number_of_pixels */
50455f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony        SetPixelChannel(destination,channel,ClampToQuantum(gamma*pixels[0]),
5046fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixel);
50475f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      }
50485f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony      break;
50495f78bca6fa8560aadf0ba215d657bf7dd00f0646anthony    }
5050cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
50515c4e2586d27d4299a742d170d41105de1689aa46cristy    {
5052a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5053380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
5054380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cy[4];
50555c4e2586d27d4299a742d170d41105de1689aa46cristy
50565c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
50575c4e2586d27d4299a742d170d41105de1689aa46cristy        exception);
50585c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
50595c4e2586d27d4299a742d170d41105de1689aa46cristy        {
50605c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
50615c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
50625c4e2586d27d4299a742d170d41105de1689aa46cristy        }
506350e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
50645c4e2586d27d4299a742d170d41105de1689aa46cristy      {
50655c4e2586d27d4299a742d170d41105de1689aa46cristy        register ssize_t
50665c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
50675c4e2586d27d4299a742d170d41105de1689aa46cristy
50685a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
50695a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
50705a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
50715a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
50725c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
50735c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
50745c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
50755c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
50765c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
50775c4e2586d27d4299a742d170d41105de1689aa46cristy          {
50785c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=1.0;
5079a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy            pixels[j]=(double) p[j*GetPixelChannels(source)+i];
50805c4e2586d27d4299a742d170d41105de1689aa46cristy          }
50815c4e2586d27d4299a742d170d41105de1689aa46cristy        else
50825c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
50835c4e2586d27d4299a742d170d41105de1689aa46cristy          {
50845c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
50855c4e2586d27d4299a742d170d41105de1689aa46cristy              GetPixelChannels(source));
50865c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
50875c4e2586d27d4299a742d170d41105de1689aa46cristy          }
5088a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        CatromWeights((double) (x-x_offset),&cx);
5089a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        CatromWeights((double) (y-y_offset),&cy);
5090a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        gamma=((traits & BlendPixelTrait) ? (double) (1.0) :
50913e3ec3afbb0782697f201cbe30a56794c10dc7efcristy          PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
5092d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
5093d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
5094d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
5095d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cx[2]*alpha[14]+cx[3]*alpha[15])));
5096380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
5097380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
5098380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
5099380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
5100d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
5101d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[14]+cx[3]*pixels[15]))),pixel);
51025c4e2586d27d4299a742d170d41105de1689aa46cristy      }
51035c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
51045c4e2586d27d4299a742d170d41105de1689aa46cristy    }
51055c4e2586d27d4299a742d170d41105de1689aa46cristy    case IntegerInterpolatePixel:
51065c4e2586d27d4299a742d170d41105de1689aa46cristy    {
51075c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
51085c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
51095c4e2586d27d4299a742d170d41105de1689aa46cristy        {
51105c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
51115c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
51125c4e2586d27d4299a742d170d41105de1689aa46cristy        }
511350e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
51145c4e2586d27d4299a742d170d41105de1689aa46cristy      {
51155a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
51165a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
51175a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
51185a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
51195c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
51205c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
51215c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
51224a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,p[i],pixel);
51235c4e2586d27d4299a742d170d41105de1689aa46cristy      }
51245c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
51255c4e2586d27d4299a742d170d41105de1689aa46cristy    }
5126cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
51275c4e2586d27d4299a742d170d41105de1689aa46cristy    {
5128cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
5129cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
5130cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
51315c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
51325c4e2586d27d4299a742d170d41105de1689aa46cristy        {
51335c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
51345c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
51355c4e2586d27d4299a742d170d41105de1689aa46cristy        }
513650e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
51375c4e2586d27d4299a742d170d41105de1689aa46cristy      {
51385a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
51395a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
51405a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
51415a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
51425c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
51435c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
51445c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
51454a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,p[i],pixel);
51465c4e2586d27d4299a742d170d41105de1689aa46cristy      }
51475c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
51485c4e2586d27d4299a742d170d41105de1689aa46cristy    }
51495c4e2586d27d4299a742d170d41105de1689aa46cristy    case MeshInterpolatePixel:
51505c4e2586d27d4299a742d170d41105de1689aa46cristy    {
51515c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
51525c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
51535c4e2586d27d4299a742d170d41105de1689aa46cristy        {
51545c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
51555c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
51565c4e2586d27d4299a742d170d41105de1689aa46cristy        }
515750e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
51585c4e2586d27d4299a742d170d41105de1689aa46cristy      {
51595c4e2586d27d4299a742d170d41105de1689aa46cristy        PointInfo
51605c4e2586d27d4299a742d170d41105de1689aa46cristy          delta,
51615c4e2586d27d4299a742d170d41105de1689aa46cristy          luminance;
51625c4e2586d27d4299a742d170d41105de1689aa46cristy
51635a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
51645a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
51655a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
51665a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
51675c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
51685c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
51695c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
5170a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[0]=(double) p[i];
5171a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[1]=(double) p[GetPixelChannels(source)+i];
5172a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[2]=(double) p[2*GetPixelChannels(source)+i];
5173a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixels[3]=(double) p[3*GetPixelChannels(source)+i];
51741861c90c5c8c4ceb56885dd86377412aae0f4526cristy        if ((traits & BlendPixelTrait) == 0)
51751861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
51761861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[0]=1.0;
51771861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[1]=1.0;
51781861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[2]=1.0;
51791861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[3]=1.0;
51801861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
51811861c90c5c8c4ceb56885dd86377412aae0f4526cristy        else
51821861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
51831861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[0]=QuantumScale*GetPixelAlpha(source,p);
51841861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[1]=QuantumScale*GetPixelAlpha(source,p+
51851861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
51861861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
51871861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
51881861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
51891861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
51901861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
51911861c90c5c8c4ceb56885dd86377412aae0f4526cristy        delta.x=x-x_offset;
51921861c90c5c8c4ceb56885dd86377412aae0f4526cristy        delta.y=y-y_offset;
5193fb12237dd6e4d4d8b92d879661153062eeca0572cristy        luminance.x=fabs((double) (GetPixelLuminance(source,p)-
5194fb12237dd6e4d4d8b92d879661153062eeca0572cristy          GetPixelLuminance(source,p+3*GetPixelChannels(source))));
5195fb12237dd6e4d4d8b92d879661153062eeca0572cristy        luminance.y=fabs((double) (GetPixelLuminance(source,p+
5196fb12237dd6e4d4d8b92d879661153062eeca0572cristy          GetPixelChannels(source))-GetPixelLuminance(source,p+2*
5197fb12237dd6e4d4d8b92d879661153062eeca0572cristy          GetPixelChannels(source))));
5198cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if (luminance.x < luminance.y)
51991861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
52001861c90c5c8c4ceb56885dd86377412aae0f4526cristy            /*
52011861c90c5c8c4ceb56885dd86377412aae0f4526cristy              Diagonal 0-3 NW-SE.
52021861c90c5c8c4ceb56885dd86377412aae0f4526cristy            */
52031861c90c5c8c4ceb56885dd86377412aae0f4526cristy            if (delta.x <= delta.y)
52041861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
52051861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
52061861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Bottom-left triangle (pixel: 2, diagonal: 0-3).
52071861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
52081861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.y=1.0-delta.y;
52091861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
52103e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
52114a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
52124a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[2],pixels[3],pixels[0])),pixel);
52131861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
52141861c90c5c8c4ceb56885dd86377412aae0f4526cristy            else
52151861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
52161861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
52171861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Top-right triangle (pixel: 1, diagonal: 0-3).
52181861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
52191861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.x=1.0-delta.x;
52201861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
52213e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
52224a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
52234a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[1],pixels[0],pixels[3])),pixel);
52241861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
52251861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
52261861c90c5c8c4ceb56885dd86377412aae0f4526cristy        else
52271861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
52281861c90c5c8c4ceb56885dd86377412aae0f4526cristy            /*
52291861c90c5c8c4ceb56885dd86377412aae0f4526cristy              Diagonal 1-2 NE-SW.
52301861c90c5c8c4ceb56885dd86377412aae0f4526cristy            */
52311861c90c5c8c4ceb56885dd86377412aae0f4526cristy            if (delta.x <= (1.0-delta.y))
52321861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
52331861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
52341861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Top-left triangle (pixel: 0, diagonal: 1-2).
52351861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
52361861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
52373e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
52384a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
52394a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[0],pixels[1],pixels[2])),pixel);
52401861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
52411861c90c5c8c4ceb56885dd86377412aae0f4526cristy            else
52421861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
52431861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
52441861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Bottom-right triangle (pixel: 3, diagonal: 1-2).
52451861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
52461861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.x=1.0-delta.x;
52471861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.y=1.0-delta.y;
52481861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
52493e3ec3afbb0782697f201cbe30a56794c10dc7efcristy                gamma=PerceptibleReciprocal(gamma);
52504a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
52514a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[3],pixels[2],pixels[1])),pixel);
52521861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
52531861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
52545c4e2586d27d4299a742d170d41105de1689aa46cristy      }
52555c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
52565c4e2586d27d4299a742d170d41105de1689aa46cristy    }
52575c4e2586d27d4299a742d170d41105de1689aa46cristy    case SplineInterpolatePixel:
52585c4e2586d27d4299a742d170d41105de1689aa46cristy    {
5259a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5260d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
5261d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cy[4];
5262d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas
52635c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
52645c4e2586d27d4299a742d170d41105de1689aa46cristy        exception);
52655c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
52665c4e2586d27d4299a742d170d41105de1689aa46cristy        {
52675c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
52685c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
52695c4e2586d27d4299a742d170d41105de1689aa46cristy        }
527050e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
52715c4e2586d27d4299a742d170d41105de1689aa46cristy      {
52725c4e2586d27d4299a742d170d41105de1689aa46cristy        register ssize_t
52735c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
52745c4e2586d27d4299a742d170d41105de1689aa46cristy
52755a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(source,i);
52765a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(source,channel);
52775a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait destination_traits=GetPixelChannelTraits(destination,
52785a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy          channel);
52795c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
52805c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
52815c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
52825c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
52835c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
52845c4e2586d27d4299a742d170d41105de1689aa46cristy          {
52855c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=1.0;
5286a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy            pixels[j]=(double) p[j*GetPixelChannels(source)+i];
52875c4e2586d27d4299a742d170d41105de1689aa46cristy          }
52885c4e2586d27d4299a742d170d41105de1689aa46cristy        else
52895c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
52905c4e2586d27d4299a742d170d41105de1689aa46cristy          {
52915c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
52925c4e2586d27d4299a742d170d41105de1689aa46cristy              GetPixelChannels(source));
52935c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
52945c4e2586d27d4299a742d170d41105de1689aa46cristy          }
5295a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        SplineWeights((double) (x-x_offset),&cx);
5296a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        SplineWeights((double) (y-y_offset),&cy);
5297a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        gamma=((traits & BlendPixelTrait) ? (double) (1.0) :
52983e3ec3afbb0782697f201cbe30a56794c10dc7efcristy          PerceptibleReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
5299d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
5300d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
5301d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
5302d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cx[2]*alpha[14]+cx[3]*alpha[15])));
5303d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
5304d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
5305d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
5306d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
5307d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
5308d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[14]+cx[3]*pixels[15]))),pixel);
53095c4e2586d27d4299a742d170d41105de1689aa46cristy      }
53105c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
53115c4e2586d27d4299a742d170d41105de1689aa46cristy    }
53125c4e2586d27d4299a742d170d41105de1689aa46cristy  }
53135c4e2586d27d4299a742d170d41105de1689aa46cristy  return(status);
53145c4e2586d27d4299a742d170d41105de1689aa46cristy}
53155c4e2586d27d4299a742d170d41105de1689aa46cristy
53165c4e2586d27d4299a742d170d41105de1689aa46cristy/*
53175c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53185c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
53195c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
53205c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
53219075cdb062fda00666ab37b0ba7df4b8cc2e8eaccristy%   I n t e r p o l a t e P i x e l I n f o                                   %
5322d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5323d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5324d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5325d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5326d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5327884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  InterpolatePixelInfo() applies a pixel interpolation method between a
5328884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
5329884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  pixel area resampling, or scaling of the result is performed.
5330d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5331cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just RGBKA channels.
5332cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
53334c08aed51c5899665ade97263692328eea4af106cristy%  The format of the InterpolatePixelInfo method is:
5334d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
53354c08aed51c5899665ade97263692328eea4af106cristy%      MagickBooleanType InterpolatePixelInfo(const Image *image,
53365c4e2586d27d4299a742d170d41105de1689aa46cristy%        const CacheView *image_view,const PixelInterpolateMethod method,
53374c08aed51c5899665ade97263692328eea4af106cristy%        const double x,const double y,PixelInfo *pixel,
5338d76c51ed30cf4084f4434ba08925d16001d1e340cristy%        ExceptionInfo *exception)
5339d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5340d76c51ed30cf4084f4434ba08925d16001d1e340cristy%  A description of each parameter follows:
5341d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5342d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o image: the image.
5343d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5344d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o image_view: the image view.
5345d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5346d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o method: the pixel color interpolation method.
5347d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5348d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o x,y: A double representing the current (x,y) position of the pixel.
5349d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5350d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o pixel: return the interpolated pixel here.
5351d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5352d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o exception: return any errors or warnings in this structure.
5353d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5354d76c51ed30cf4084f4434ba08925d16001d1e340cristy*/
5355d76c51ed30cf4084f4434ba08925d16001d1e340cristy
53564c08aed51c5899665ade97263692328eea4af106cristystatic inline void AlphaBlendPixelInfo(const Image *image,
5357a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  const Quantum *pixel,PixelInfo *pixel_info,double *alpha)
5358d76c51ed30cf4084f4434ba08925d16001d1e340cristy{
53598a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  if (image->alpha_trait != BlendPixelTrait)
5360241310d359ef6893f4d0c1e43eeb39f34991fd2acristy    {
5361241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      *alpha=1.0;
5362a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->red=(double) GetPixelRed(image,pixel);
5363a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->green=(double) GetPixelGreen(image,pixel);
5364a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->blue=(double) GetPixelBlue(image,pixel);
53654c08aed51c5899665ade97263692328eea4af106cristy      pixel_info->black=0.0;
53664c08aed51c5899665ade97263692328eea4af106cristy      if (image->colorspace == CMYKColorspace)
5367a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        pixel_info->black=(double) GetPixelBlack(image,pixel);
5368a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      pixel_info->alpha=(double) GetPixelAlpha(image,pixel);
5369241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      return;
5370241310d359ef6893f4d0c1e43eeb39f34991fd2acristy    }
53714c08aed51c5899665ade97263692328eea4af106cristy  *alpha=QuantumScale*GetPixelAlpha(image,pixel);
53724c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->red=(*alpha*GetPixelRed(image,pixel));
53734c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->green=(*alpha*GetPixelGreen(image,pixel));
53744c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->blue=(*alpha*GetPixelBlue(image,pixel));
53754c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->black=0.0;
53764c08aed51c5899665ade97263692328eea4af106cristy  if (image->colorspace == CMYKColorspace)
53774c08aed51c5899665ade97263692328eea4af106cristy    pixel_info->black=(*alpha*GetPixelBlack(image,pixel));
5378a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel_info->alpha=(double) GetPixelAlpha(image,pixel);
5379d76c51ed30cf4084f4434ba08925d16001d1e340cristy}
5380d76c51ed30cf4084f4434ba08925d16001d1e340cristy
53814c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
53825c4e2586d27d4299a742d170d41105de1689aa46cristy  const CacheView *image_view,const PixelInterpolateMethod method,
53834c08aed51c5899665ade97263692328eea4af106cristy  const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception)
5384d76c51ed30cf4084f4434ba08925d16001d1e340cristy{
5385d76c51ed30cf4084f4434ba08925d16001d1e340cristy  MagickBooleanType
5386d76c51ed30cf4084f4434ba08925d16001d1e340cristy    status;
5387d76c51ed30cf4084f4434ba08925d16001d1e340cristy
5388a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
538942587c577d5b808de94915f2388b88b05c3d43a3cristy    alpha[16],
539042587c577d5b808de94915f2388b88b05c3d43a3cristy    gamma;
539142587c577d5b808de94915f2388b88b05c3d43a3cristy
5392865d58d60e5fc755d47771eab37ce5159531629dcristy  PixelInfo
5393865d58d60e5fc755d47771eab37ce5159531629dcristy    pixels[16];
5394865d58d60e5fc755d47771eab37ce5159531629dcristy
53954c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
5396d76c51ed30cf4084f4434ba08925d16001d1e340cristy    *p;
5397d76c51ed30cf4084f4434ba08925d16001d1e340cristy
539850e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
5399d76c51ed30cf4084f4434ba08925d16001d1e340cristy    i;
5400d76c51ed30cf4084f4434ba08925d16001d1e340cristy
540142587c577d5b808de94915f2388b88b05c3d43a3cristy  ssize_t
540242587c577d5b808de94915f2388b88b05c3d43a3cristy    x_offset,
540342587c577d5b808de94915f2388b88b05c3d43a3cristy    y_offset;
540442587c577d5b808de94915f2388b88b05c3d43a3cristy
5405cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  PixelInterpolateMethod
5406cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate;
5407cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5408d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image != (Image *) NULL);
5409d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image->signature == MagickSignature);
5410d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image_view != (CacheView *) NULL);
5411d76c51ed30cf4084f4434ba08925d16001d1e340cristy  status=MagickTrue;
541242587c577d5b808de94915f2388b88b05c3d43a3cristy  x_offset=(ssize_t) floor(x);
541342587c577d5b808de94915f2388b88b05c3d43a3cristy  y_offset=(ssize_t) floor(y);
5414cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  interpolate = method;
5415cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  if ( interpolate == UndefinedInterpolatePixel )
5416cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate = image->interpolate;
5417cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
5418d76c51ed30cf4084f4434ba08925d16001d1e340cristy  {
541958ee5018960b42b80b54398eacabe9ae5da89149cristy    case AverageInterpolatePixel:  /* nearest 4 neighbours */
542058ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average9InterpolatePixel:  /* nearest 9 neighbours */
542158ee5018960b42b80b54398eacabe9ae5da89149cristy    case Average16InterpolatePixel:  /* nearest 16 neighbours */
5422d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5423fb12237dd6e4d4d8b92d879661153062eeca0572cristy      ssize_t
5424fb12237dd6e4d4d8b92d879661153062eeca0572cristy        count;
5425cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5426fb12237dd6e4d4d8b92d879661153062eeca0572cristy      count=2;  /* size of the area to average - default nearest 4 */
5427cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
5428cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5429cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
5430cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
5431cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
5432cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5433cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else if (interpolate == Average16InterpolatePixel)
5434cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5435cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=4;
5436cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset--;
5437cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset--;
5438cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5439021216a8b35ea91ef1f12713ed41da843bbaee7bcristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,(size_t) count,
5440021216a8b35ea91ef1f12713ed41da843bbaee7bcristy        (size_t) count,exception);
54414c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5442d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5443d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5444d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5445d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5446241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->red=0.0;
5447241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->green=0.0;
5448241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->blue=0.0;
54494c08aed51c5899665ade97263692328eea4af106cristy      pixel->black=0.0;
5450865d58d60e5fc755d47771eab37ce5159531629dcristy      pixel->alpha=0.0;
545158ee5018960b42b80b54398eacabe9ae5da89149cristy      count*=count;  /* number of pixels - square of size */
545250e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) count; i++)
5453cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      {
5454cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p,pixels,alpha);
54553e3ec3afbb0782697f201cbe30a56794c10dc7efcristy        gamma=PerceptibleReciprocal(alpha[0]);
5456fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->red+=gamma*pixels[0].red;
5457fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->green+=gamma*pixels[0].green;
5458fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->blue+=gamma*pixels[0].blue;
5459fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->black+=gamma*pixels[0].black;
5460fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->alpha+=pixels[0].alpha;
5461cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        p += GetPixelChannels(image);
5462cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
5463cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=1.0/count;   /* average weighting of each pixel in area */
5464fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red*=gamma;
5465fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green*=gamma;
5466fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue*=gamma;
5467fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->black*=gamma;
5468fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha*=gamma;
5469cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5470cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5471cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BackgroundInterpolatePixel:
5472cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5473fb12237dd6e4d4d8b92d879661153062eeca0572cristy      *pixel=image->background_color;  /* Copy PixelInfo Structure  */
5474d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5475d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5476cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
5477cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
5478cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5479cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      PointInfo
5480cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta,
5481cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon;
5482cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5483cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5484cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
5485cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5486cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
5487cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
5488cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5489cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 4L; i++)
5490cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5491cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.x=x-x_offset;
5492cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.y=y-y_offset;
5493cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.x=1.0-delta.x;
5494cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.y=1.0-delta.y;
5495cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
5496cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*alpha[2]+delta.x*alpha[3])));
54973e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      gamma=PerceptibleReciprocal(gamma);
5498cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x*
5499cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red));
5500cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x*
5501cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x*
5502cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].green));
5503cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x*
5504cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x*
5505cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].blue));
5506cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (image->colorspace == CMYKColorspace)
5507cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x*
5508cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x*
5509cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[3].black));
5510cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
55113e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      gamma=PerceptibleReciprocal(gamma);
5512cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->alpha=(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x*
5513cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x*
5514cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].alpha));
5515cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5516cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5517cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BlendInterpolatePixel:
5518cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5519cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5520cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
5521cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5522cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
5523cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
5524cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5525cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 4L; i++)
5526cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5527fb12237dd6e4d4d8b92d879661153062eeca0572cristy      gamma=1.0;  /* number of pixels blended together (its variable) */
5528fb12237dd6e4d4d8b92d879661153062eeca0572cristy      for (i=0; i <= 1L; i++)
5529fb12237dd6e4d4d8b92d879661153062eeca0572cristy      {
5530fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((y-y_offset) >= 0.75)
5531fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
5532fb12237dd6e4d4d8b92d879661153062eeca0572cristy            alpha[i]=alpha[i+2];  /* take right pixels */
5533fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[i]=pixels[i+2];
5534fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
5535fb12237dd6e4d4d8b92d879661153062eeca0572cristy        else
5536fb12237dd6e4d4d8b92d879661153062eeca0572cristy          if ((y-y_offset) > 0.25)
5537fb12237dd6e4d4d8b92d879661153062eeca0572cristy            {
5538fb12237dd6e4d4d8b92d879661153062eeca0572cristy              gamma=2.0;  /* blend both pixels in row */
5539fb12237dd6e4d4d8b92d879661153062eeca0572cristy              alpha[i]+=alpha[i+2];  /* add up alpha weights */
5540fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].red+=pixels[i+2].red;
5541fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].green+=pixels[i+2].green;
5542fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].blue+=pixels[i+2].blue;
5543fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].black+=pixels[i+2].black;
5544fb12237dd6e4d4d8b92d879661153062eeca0572cristy              pixels[i].alpha+=pixels[i+2].alpha;
5545fb12237dd6e4d4d8b92d879661153062eeca0572cristy            }
5546fb12237dd6e4d4d8b92d879661153062eeca0572cristy      }
5547fb12237dd6e4d4d8b92d879661153062eeca0572cristy      if ((x-x_offset) >= 0.75)
5548fb12237dd6e4d4d8b92d879661153062eeca0572cristy        {
5549fb12237dd6e4d4d8b92d879661153062eeca0572cristy          alpha[0]=alpha[1];
5550fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[0]=pixels[1];
5551fb12237dd6e4d4d8b92d879661153062eeca0572cristy        }
5552fb12237dd6e4d4d8b92d879661153062eeca0572cristy      else
5553fb12237dd6e4d4d8b92d879661153062eeca0572cristy        if ((x-x_offset) > 0.25)
5554fb12237dd6e4d4d8b92d879661153062eeca0572cristy          {
5555fb12237dd6e4d4d8b92d879661153062eeca0572cristy            gamma*=2.0;  /* blend both rows */
555658ee5018960b42b80b54398eacabe9ae5da89149cristy            alpha[0]+= alpha[1];  /* add up alpha weights */
5557fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].red+=pixels[1].red;
5558fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].green+=pixels[1].green;
5559fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].blue+=pixels[1].blue;
5560fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].black+=pixels[1].black;
5561fb12237dd6e4d4d8b92d879661153062eeca0572cristy            pixels[0].alpha+=pixels[1].alpha;
5562fb12237dd6e4d4d8b92d879661153062eeca0572cristy          }
5563fb12237dd6e4d4d8b92d879661153062eeca0572cristy      gamma=1.0/gamma;
55643e3ec3afbb0782697f201cbe30a56794c10dc7efcristy      alpha[0]=PerceptibleReciprocal(alpha[0]);
5565fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red=alpha[0]*pixels[0].red;
5566fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green=alpha[0]*pixels[0].green;  /* divide by sum of alpha */
5567fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue=alpha[0]*pixels[0].blue;
5568fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->black=alpha[0]*pixels[0].black;
5569fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha=gamma*pixels[0].alpha;   /* divide by number of pixels */
5570cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5571cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5572cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
5573d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5574a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5575380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
5576380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cy[4];
5577d76c51ed30cf4084f4434ba08925d16001d1e340cristy
557842587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
557942587c577d5b808de94915f2388b88b05c3d43a3cristy        exception);
55804c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5581d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5582d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5583d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5584d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5585cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 16L; i++)
5586cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5587a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (x-x_offset),&cx);
5588a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      CatromWeights((double) (y-y_offset),&cy);
5589fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*pixels[1].red+cx[2]*
5590fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].red+cx[3]*pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5591fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].red+cx[2]*pixels[6].red+cx[3]*pixels[7].red)+cy[2]*(cx[0]*
5592fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].red+cx[1]*pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5593fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*pixels[13].red+cx[2]*
5594fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[14].red+cx[3]*pixels[15].red));
5595fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*pixels[1].green+cx[2]*
5596fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].green+cx[3]*pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+
5597fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].green+cx[2]*pixels[6].green+cx[3]*pixels[7].green)+
5598fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].green+cx[1]*pixels[9].green+cx[2]*
5599fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].green+cx[3]*pixels[11].green)+cy[3]*(cx[0]*
5600fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[12].green+cx[1]*pixels[13].green+cx[2]*pixels[14].green+cx[3]*
5601fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[15].green));
5602fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*pixels[1].blue+cx[2]*
5603fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].blue+cx[3]*pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5604fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*pixels[7].blue)+cy[2]*(cx[0]*
5605fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].blue+cx[1]*pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5606fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*pixels[13].blue+
5607fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5608380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      if (image->colorspace == CMYKColorspace)
5609fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*pixels[1].black+cx[2]*
5610fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[2].black+cx[3]*pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+
5611fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cx[1]*pixels[5].black+cx[2]*pixels[6].black+cx[3]*pixels[7].black)+
5612fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cy[2]*(cx[0]*pixels[8].black+cx[1]*pixels[9].black+cx[2]*
5613fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[10].black+cx[3]*pixels[11].black)+cy[3]*(cx[0]*
5614fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[12].black+cx[1]*pixels[13].black+cx[2]*pixels[14].black+cx[3]*
5615fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[15].black));
5616fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*pixels[1].alpha+cx[2]*
5617fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].alpha+cx[3]*pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+
5618fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*pixels[7].alpha)+
5619fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].alpha+cx[1]*pixels[9].alpha+cx[2]*
5620fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].alpha+cx[3]*pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+
5621fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5622d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5623d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5624d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case IntegerInterpolatePixel:
5625d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
562642587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
56274c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5628d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5629d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5630d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5631d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5632803640d20a6a664315eddfff6f8531d0c5e0871dcristy      GetPixelInfoPixel(image,p,pixel);
5633d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5634d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5635d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case MeshInterpolatePixel:
5636d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5637d76c51ed30cf4084f4434ba08925d16001d1e340cristy      PointInfo
5638d76c51ed30cf4084f4434ba08925d16001d1e340cristy        delta,
5639d76c51ed30cf4084f4434ba08925d16001d1e340cristy        luminance;
5640d76c51ed30cf4084f4434ba08925d16001d1e340cristy
564194ea1636709395774d7118ef56162d211904cfd2cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
56424c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5643d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5644d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5645d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5646d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
564794ea1636709395774d7118ef56162d211904cfd2cristy      delta.x=x-x_offset;
564894ea1636709395774d7118ef56162d211904cfd2cristy      delta.y=y-y_offset;
5649884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      luminance.x=GetPixelLuminance(image,p)-(double)
565094ea1636709395774d7118ef56162d211904cfd2cristy        GetPixelLuminance(image,p+3*GetPixelChannels(image));
565128474bfbda5ee2d4da2eb79f299cf1f692770b99cristy      luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
565294ea1636709395774d7118ef56162d211904cfd2cristy        GetPixelLuminance(image,p+2*GetPixelChannels(image));
56535ce8df84afcfec6dc33ee61ac2014edb3871c455cristy      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
565428474bfbda5ee2d4da2eb79f299cf1f692770b99cristy      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
5655ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
5656ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
5657d76c51ed30cf4084f4434ba08925d16001d1e340cristy      if (fabs(luminance.x) < fabs(luminance.y))
5658d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5659d76c51ed30cf4084f4434ba08925d16001d1e340cristy          /*
5660d76c51ed30cf4084f4434ba08925d16001d1e340cristy            Diagonal 0-3 NW-SE.
5661d76c51ed30cf4084f4434ba08925d16001d1e340cristy          */
5662d76c51ed30cf4084f4434ba08925d16001d1e340cristy          if (delta.x <= delta.y)
5663d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5664d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
566594ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-left triangle (pixel: 2, diagonal: 0-3).
5666d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5667d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.y=1.0-delta.y;
5668d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
56693e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5670d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
5671d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].red,pixels[0].red);
5672d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
5673d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].green,pixels[0].green);
5674d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
5675d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].blue,pixels[0].blue);
56765af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
56774c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black,
56784c08aed51c5899665ade97263692328eea4af106cristy                  pixels[3].black,pixels[0].black);
567994ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5680865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha,
5681865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[3].alpha,pixels[0].alpha);
5682d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5683d76c51ed30cf4084f4434ba08925d16001d1e340cristy          else
5684d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5685d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
568694ea1636709395774d7118ef56162d211904cfd2cristy                Top-right triangle (pixel:1 , diagonal: 0-3).
5687d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5688d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.x=1.0-delta.x;
5689d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
56903e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5691d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
5692d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].red,pixels[3].red);
5693d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
5694d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].green,pixels[3].green);
5695d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
5696d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].blue,pixels[3].blue);
56975af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
56984c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black,
56994c08aed51c5899665ade97263692328eea4af106cristy                  pixels[0].black,pixels[3].black);
570094ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5701865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha,
5702865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[0].alpha,pixels[3].alpha);
5703d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5704d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5705d76c51ed30cf4084f4434ba08925d16001d1e340cristy      else
5706d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5707d76c51ed30cf4084f4434ba08925d16001d1e340cristy          /*
5708d76c51ed30cf4084f4434ba08925d16001d1e340cristy            Diagonal 1-2 NE-SW.
5709d76c51ed30cf4084f4434ba08925d16001d1e340cristy          */
5710d76c51ed30cf4084f4434ba08925d16001d1e340cristy          if (delta.x <= (1.0-delta.y))
5711d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5712d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
571394ea1636709395774d7118ef56162d211904cfd2cristy                Top-left triangle (pixel: 0, diagonal: 1-2).
5714d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5715d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
57163e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5717d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
5718d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].red,pixels[2].red);
5719d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
5720d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].green,pixels[2].green);
5721d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
5722d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].blue,pixels[2].blue);
57235af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
57244c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black,
57254c08aed51c5899665ade97263692328eea4af106cristy                  pixels[1].black,pixels[2].black);
572694ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5727865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha,
5728865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[1].alpha,pixels[2].alpha);
5729d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5730d76c51ed30cf4084f4434ba08925d16001d1e340cristy          else
5731d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5732d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
5733d76c51ed30cf4084f4434ba08925d16001d1e340cristy                Bottom-right triangle (pixel: 3, diagonal: 1-2).
5734d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5735d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.x=1.0-delta.x;
5736d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.y=1.0-delta.y;
5737d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
57383e3ec3afbb0782697f201cbe30a56794c10dc7efcristy              gamma=PerceptibleReciprocal(gamma);
5739d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
5740d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].red,pixels[1].red);
5741d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
5742d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].green,pixels[1].green);
5743d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
5744d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].blue,pixels[1].blue);
57455af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
57464c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black,
57474c08aed51c5899665ade97263692328eea4af106cristy                  pixels[2].black,pixels[1].black);
574894ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5749865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha,
5750865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[2].alpha,pixels[1].alpha);
5751d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5752d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5753d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5754d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5755cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
5756d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5757cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
5758cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
5759cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
57604c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5761d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5762d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5763d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5764d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5765803640d20a6a664315eddfff6f8531d0c5e0871dcristy      GetPixelInfoPixel(image,p,pixel);
5766d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5767d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5768d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case SplineInterpolatePixel:
5769d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5770a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      double
5771d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
5772d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cy[4];
5773d76c51ed30cf4084f4434ba08925d16001d1e340cristy
577442587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
577542587c577d5b808de94915f2388b88b05c3d43a3cristy        exception);
57764c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5777d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5778d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5779d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5780d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5781cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 16L; i++)
5782cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5783a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (x-x_offset),&cx);
5784a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      SplineWeights((double) (y-y_offset),&cy);
5785fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*pixels[1].red+cx[2]*
5786fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].red+cx[3]*pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5787fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].red+cx[2]*pixels[6].red+cx[3]*pixels[7].red)+cy[2]*(cx[0]*
5788fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].red+cx[1]*pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5789fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*pixels[13].red+cx[2]*
5790fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[14].red+cx[3]*pixels[15].red));
5791fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*pixels[1].green+cx[2]*
5792fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].green+cx[3]*pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+
5793fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].green+cx[2]*pixels[6].green+cx[3]*pixels[7].green)+
5794fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].green+cx[1]*pixels[9].green+cx[2]*
5795fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].green+cx[3]*pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+
5796fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green));
5797fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*pixels[1].blue+cx[2]*
5798fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].blue+cx[3]*pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5799fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*pixels[7].blue)+cy[2]*(cx[0]*
5800fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[8].blue+cx[1]*pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5801fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*pixels[13].blue+
5802fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5803d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      if (image->colorspace == CMYKColorspace)
5804fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*pixels[1].black+cx[2]*
5805fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[2].black+cx[3]*pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+
5806fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cx[1]*pixels[5].black+cx[2]*pixels[6].black+cx[3]*pixels[7].black)+
5807fb12237dd6e4d4d8b92d879661153062eeca0572cristy          cy[2]*(cx[0]*pixels[8].black+cx[1]*pixels[9].black+cx[2]*
5808fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[10].black+cx[3]*pixels[11].black)+cy[3]*(cx[0]*
5809fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[12].black+cx[1]*pixels[13].black+cx[2]*pixels[14].black+cx[3]*
5810fb12237dd6e4d4d8b92d879661153062eeca0572cristy          pixels[15].black));
5811fb12237dd6e4d4d8b92d879661153062eeca0572cristy      pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*pixels[1].alpha+cx[2]*
5812fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[2].alpha+cx[3]*pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+
5813fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*pixels[7].alpha)+
5814fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cy[2]*(cx[0]*pixels[8].alpha+cx[1]*pixels[9].alpha+cx[2]*
5815fb12237dd6e4d4d8b92d879661153062eeca0572cristy        pixels[10].alpha+cx[3]*pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+
5816fb12237dd6e4d4d8b92d879661153062eeca0572cristy        cx[1]*pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5817d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5818d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5819d76c51ed30cf4084f4434ba08925d16001d1e340cristy  }
5820d76c51ed30cf4084f4434ba08925d16001d1e340cristy  return(status);
5821d76c51ed30cf4084f4434ba08925d16001d1e340cristy}
58224c08aed51c5899665ade97263692328eea4af106cristy
58234c08aed51c5899665ade97263692328eea4af106cristy/*
58244c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58254c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
58264c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
58274c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
58284c08aed51c5899665ade97263692328eea4af106cristy+   I s F u z z y E q u i v a l e n c e P i x e l                             %
58294c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
58304c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
58314c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
58324c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58334c08aed51c5899665ade97263692328eea4af106cristy%
58344c08aed51c5899665ade97263692328eea4af106cristy%  IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two
58354c08aed51c5899665ade97263692328eea4af106cristy%  pixels is less than the specified distance in a linear three (or four)u
58364c08aed51c5899665ade97263692328eea4af106cristy%  dimensional color space.
58374c08aed51c5899665ade97263692328eea4af106cristy%
58384c08aed51c5899665ade97263692328eea4af106cristy%  The format of the IsFuzzyEquivalencePixel method is:
58394c08aed51c5899665ade97263692328eea4af106cristy%
5840e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%      void IsFuzzyEquivalencePixel(const Image *source,const Quantum *p,
5841e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%        const Image *destination,const Quantum *q)
58424c08aed51c5899665ade97263692328eea4af106cristy%
58434c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
58444c08aed51c5899665ade97263692328eea4af106cristy%
5845e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%    o source: the source image.
58464c08aed51c5899665ade97263692328eea4af106cristy%
58474c08aed51c5899665ade97263692328eea4af106cristy%    o p: Pixel p.
58484c08aed51c5899665ade97263692328eea4af106cristy%
5849e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%    o destination: the destination image.
5850e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%
58514c08aed51c5899665ade97263692328eea4af106cristy%    o q: Pixel q.
58524c08aed51c5899665ade97263692328eea4af106cristy%
58534c08aed51c5899665ade97263692328eea4af106cristy*/
5854e4a404711bf20d9062d11ab28bc12e5acd307f9ccristyMagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *source,
5855e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  const Quantum *p,const Image *destination,const Quantum *q)
58564c08aed51c5899665ade97263692328eea4af106cristy{
5857a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
58584c08aed51c5899665ade97263692328eea4af106cristy    fuzz,
58594c08aed51c5899665ade97263692328eea4af106cristy    pixel;
58604c08aed51c5899665ade97263692328eea4af106cristy
5861a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  register double
58624c08aed51c5899665ade97263692328eea4af106cristy    distance,
58634c08aed51c5899665ade97263692328eea4af106cristy    scale;
58644c08aed51c5899665ade97263692328eea4af106cristy
5865a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  fuzz=MagickMax(source->fuzz,(double) MagickSQ1_2)*MagickMax(
5866a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy    destination->fuzz,(double) MagickSQ1_2);
58674c08aed51c5899665ade97263692328eea4af106cristy  scale=1.0;
58684c08aed51c5899665ade97263692328eea4af106cristy  distance=0.0;
58698a46d827a124555f0c48fb2368ec1bba8e079ab6cristy  if (source->alpha_trait == BlendPixelTrait)
58704c08aed51c5899665ade97263692328eea4af106cristy    {
58714c08aed51c5899665ade97263692328eea4af106cristy      /*
58724c08aed51c5899665ade97263692328eea4af106cristy        Transparencies are involved - set alpha distance
58734c08aed51c5899665ade97263692328eea4af106cristy      */
587470e9f6802bd2c8ab71b3aa9c59d7e2b8936d5710cristy      pixel=GetPixelAlpha(source,p)-(double) GetPixelAlpha(destination,q);
58754c08aed51c5899665ade97263692328eea4af106cristy      distance=pixel*pixel;
58764c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
58774c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
58784c08aed51c5899665ade97263692328eea4af106cristy      /*
58794c08aed51c5899665ade97263692328eea4af106cristy        Generate a alpha scaling factor to generate a 4D cone on colorspace
58804c08aed51c5899665ade97263692328eea4af106cristy        Note that if one color is transparent, distance has no color component.
58814c08aed51c5899665ade97263692328eea4af106cristy      */
5882e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      scale=QuantumScale*GetPixelAlpha(source,p);
5883e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      scale*=QuantumScale*GetPixelAlpha(destination,q);
58844c08aed51c5899665ade97263692328eea4af106cristy      if (scale <= MagickEpsilon)
58854c08aed51c5899665ade97263692328eea4af106cristy        return(MagickTrue);
58864c08aed51c5899665ade97263692328eea4af106cristy    }
58874c08aed51c5899665ade97263692328eea4af106cristy  /*
58884c08aed51c5899665ade97263692328eea4af106cristy    RGB or CMY color cube
58894c08aed51c5899665ade97263692328eea4af106cristy  */
58904c08aed51c5899665ade97263692328eea4af106cristy  distance*=3.0;  /* rescale appropriately */
58914c08aed51c5899665ade97263692328eea4af106cristy  fuzz*=3.0;
5892a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel=GetPixelRed(source,p)-(double) GetPixelRed(destination,q);
5893e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  if ((source->colorspace == HSLColorspace) ||
5894e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      (source->colorspace == HSBColorspace) ||
5895e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      (source->colorspace == HWBColorspace))
58964c08aed51c5899665ade97263692328eea4af106cristy    {
58974c08aed51c5899665ade97263692328eea4af106cristy      /*
58984c08aed51c5899665ade97263692328eea4af106cristy        Compute an arc distance for hue.  It should be a vector angle of
58994c08aed51c5899665ade97263692328eea4af106cristy        'S'/'W' length with 'L'/'B' forming appropriate cones.
59004c08aed51c5899665ade97263692328eea4af106cristy      */
59014c08aed51c5899665ade97263692328eea4af106cristy      if (fabs((double) pixel) > (QuantumRange/2))
59024c08aed51c5899665ade97263692328eea4af106cristy        pixel-=QuantumRange;
59034c08aed51c5899665ade97263692328eea4af106cristy      pixel*=2;
59044c08aed51c5899665ade97263692328eea4af106cristy    }
59054c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
59064c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
59074c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
5908a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel=GetPixelGreen(source,p)-(double) GetPixelGreen(destination,q);
59094c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
59104c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
59114c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
5912a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  pixel=GetPixelBlue(source,p)-(double) GetPixelBlue(destination,q);
59134c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
59144c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
59154c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
59164c08aed51c5899665ade97263692328eea4af106cristy  return(MagickTrue);
59174c08aed51c5899665ade97263692328eea4af106cristy}
59184c08aed51c5899665ade97263692328eea4af106cristy
59194c08aed51c5899665ade97263692328eea4af106cristy/*
59204c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59214c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
59224c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
59234c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
59244c08aed51c5899665ade97263692328eea4af106cristy+   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                     %
59254c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
59264c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
59274c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
59284c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59294c08aed51c5899665ade97263692328eea4af106cristy%
59304c08aed51c5899665ade97263692328eea4af106cristy%  IsFuzzyEquivalencePixelInfo() returns true if the distance between two
59314c08aed51c5899665ade97263692328eea4af106cristy%  colors is less than the specified distance in a linear three (or four)
59324c08aed51c5899665ade97263692328eea4af106cristy%  dimensional color space.
59334c08aed51c5899665ade97263692328eea4af106cristy%
59345f95f4f77efc46ff53593d750491c8f60698c983cristy%  This implements the equivalent of:
59355f95f4f77efc46ff53593d750491c8f60698c983cristy%    fuzz < sqrt(color_distance^2 * u.a*v.a  + alpha_distance^2)
59364c08aed51c5899665ade97263692328eea4af106cristy%
59374c08aed51c5899665ade97263692328eea4af106cristy%  Which produces a multi-dimensional cone for that colorspace along the
59384c08aed51c5899665ade97263692328eea4af106cristy%  transparency vector.
59394c08aed51c5899665ade97263692328eea4af106cristy%
59405f95f4f77efc46ff53593d750491c8f60698c983cristy%  For example for an RGB:
59414c08aed51c5899665ade97263692328eea4af106cristy%    color_distance^2  = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3
59424c08aed51c5899665ade97263692328eea4af106cristy%
59434c08aed51c5899665ade97263692328eea4af106cristy%  See http://www.imagemagick.org/Usage/bugs/fuzz_distance/
59444c08aed51c5899665ade97263692328eea4af106cristy%
59454c08aed51c5899665ade97263692328eea4af106cristy%  Hue colorspace distances need more work.  Hue is not a distance, it is an
59464c08aed51c5899665ade97263692328eea4af106cristy%  angle!
59474c08aed51c5899665ade97263692328eea4af106cristy%
59484c08aed51c5899665ade97263692328eea4af106cristy%  A check that q is in the same color space as p should be made and the
59494c08aed51c5899665ade97263692328eea4af106cristy%  appropriate mapping made.  -- Anthony Thyssen  8 December 2010
59504c08aed51c5899665ade97263692328eea4af106cristy%
59514c08aed51c5899665ade97263692328eea4af106cristy%  The format of the IsFuzzyEquivalencePixelInfo method is:
59524c08aed51c5899665ade97263692328eea4af106cristy%
59534c08aed51c5899665ade97263692328eea4af106cristy%      MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
59544c08aed51c5899665ade97263692328eea4af106cristy%        const PixelInfo *q)
59554c08aed51c5899665ade97263692328eea4af106cristy%
59564c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
59574c08aed51c5899665ade97263692328eea4af106cristy%
59584c08aed51c5899665ade97263692328eea4af106cristy%    o p: Pixel p.
59594c08aed51c5899665ade97263692328eea4af106cristy%
59604c08aed51c5899665ade97263692328eea4af106cristy%    o q: Pixel q.
59614c08aed51c5899665ade97263692328eea4af106cristy%
59624c08aed51c5899665ade97263692328eea4af106cristy*/
59634c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
59644c08aed51c5899665ade97263692328eea4af106cristy  const PixelInfo *q)
59654c08aed51c5899665ade97263692328eea4af106cristy{
5966a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  double
59674c08aed51c5899665ade97263692328eea4af106cristy    fuzz,
59684c08aed51c5899665ade97263692328eea4af106cristy    pixel;
59694c08aed51c5899665ade97263692328eea4af106cristy
5970a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  register double
59714c08aed51c5899665ade97263692328eea4af106cristy    scale,
59724c08aed51c5899665ade97263692328eea4af106cristy    distance;
59734c08aed51c5899665ade97263692328eea4af106cristy
59744c08aed51c5899665ade97263692328eea4af106cristy  if ((p->fuzz == 0.0) && (q->fuzz == 0.0))
59754c08aed51c5899665ade97263692328eea4af106cristy    return(IsPixelInfoEquivalent(p,q));
59764c08aed51c5899665ade97263692328eea4af106cristy  if (p->fuzz == 0.0)
597724dc972bafd1a9610638308dea587bc94df338abcristy    fuzz=MagickMax(q->fuzz,(double) MagickSQ1_2)*MagickMax(q->fuzz,MagickSQ1_2);
59784c08aed51c5899665ade97263692328eea4af106cristy  else if (q->fuzz == 0.0)
597924dc972bafd1a9610638308dea587bc94df338abcristy    fuzz=MagickMax(p->fuzz,(double) MagickSQ1_2)*MagickMax(p->fuzz,MagickSQ1_2);
59804c08aed51c5899665ade97263692328eea4af106cristy  else
598124dc972bafd1a9610638308dea587bc94df338abcristy    fuzz=MagickMax(p->fuzz,(double) MagickSQ1_2)*MagickMax(q->fuzz,MagickSQ1_2);
59824c08aed51c5899665ade97263692328eea4af106cristy  scale=1.0;
59834c08aed51c5899665ade97263692328eea4af106cristy  distance=0.0;
598424dc972bafd1a9610638308dea587bc94df338abcristy  if ((p->alpha_trait == BlendPixelTrait) ||
598524dc972bafd1a9610638308dea587bc94df338abcristy      (q->alpha_trait == BlendPixelTrait))
59864c08aed51c5899665ade97263692328eea4af106cristy    {
59874c08aed51c5899665ade97263692328eea4af106cristy      /*
59884c08aed51c5899665ade97263692328eea4af106cristy        Transparencies are involved - set alpha distance.
59894c08aed51c5899665ade97263692328eea4af106cristy      */
59908a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      pixel=(p->alpha_trait == BlendPixelTrait ? p->alpha : OpaqueAlpha)-
59918a46d827a124555f0c48fb2368ec1bba8e079ab6cristy        (q->alpha_trait == BlendPixelTrait ? q->alpha : OpaqueAlpha);
59924c08aed51c5899665ade97263692328eea4af106cristy      distance=pixel*pixel;
59934c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
59944c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
59954c08aed51c5899665ade97263692328eea4af106cristy      /*
59964c08aed51c5899665ade97263692328eea4af106cristy        Generate a alpha scaling factor to generate a 4D cone on colorspace.
59975f95f4f77efc46ff53593d750491c8f60698c983cristy        If one color is transparent, distance has no color component.
59984c08aed51c5899665ade97263692328eea4af106cristy      */
59998a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      if (p->alpha_trait == BlendPixelTrait)
60004c08aed51c5899665ade97263692328eea4af106cristy        scale=(QuantumScale*p->alpha);
60018a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      if (q->alpha_trait == BlendPixelTrait)
60024c08aed51c5899665ade97263692328eea4af106cristy        scale*=(QuantumScale*q->alpha);
60034c08aed51c5899665ade97263692328eea4af106cristy      if (scale <= MagickEpsilon )
60044c08aed51c5899665ade97263692328eea4af106cristy        return(MagickTrue);
60054c08aed51c5899665ade97263692328eea4af106cristy    }
60064c08aed51c5899665ade97263692328eea4af106cristy  /*
60074c08aed51c5899665ade97263692328eea4af106cristy    CMYK create a CMY cube with a multi-dimensional cone toward black.
60084c08aed51c5899665ade97263692328eea4af106cristy  */
60094c08aed51c5899665ade97263692328eea4af106cristy  if (p->colorspace == CMYKColorspace)
60104c08aed51c5899665ade97263692328eea4af106cristy    {
60114c08aed51c5899665ade97263692328eea4af106cristy      pixel=p->black-q->black;
60124c08aed51c5899665ade97263692328eea4af106cristy      distance+=pixel*pixel*scale;
60134c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
60144c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
6015a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      scale*=(double) (QuantumScale*(QuantumRange-p->black));
6016a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy      scale*=(double) (QuantumScale*(QuantumRange-q->black));
60174c08aed51c5899665ade97263692328eea4af106cristy    }
60184c08aed51c5899665ade97263692328eea4af106cristy  /*
60194c08aed51c5899665ade97263692328eea4af106cristy    RGB or CMY color cube.
60204c08aed51c5899665ade97263692328eea4af106cristy  */
60214c08aed51c5899665ade97263692328eea4af106cristy  distance*=3.0;  /* rescale appropriately */
60224c08aed51c5899665ade97263692328eea4af106cristy  fuzz*=3.0;
60234c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->red-q->red;
60244c08aed51c5899665ade97263692328eea4af106cristy  if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) ||
60254c08aed51c5899665ade97263692328eea4af106cristy      (p->colorspace == HWBColorspace))
60264c08aed51c5899665ade97263692328eea4af106cristy    {
60275f95f4f77efc46ff53593d750491c8f60698c983cristy      /*
602858ee5018960b42b80b54398eacabe9ae5da89149cristy        This calculates a arc distance for hue-- it should be a vector
602958ee5018960b42b80b54398eacabe9ae5da89149cristy        angle of 'S'/'W' length with 'L'/'B' forming appropriate cones.
603058ee5018960b42b80b54398eacabe9ae5da89149cristy        In other words this is a hack - Anthony.
60314c08aed51c5899665ade97263692328eea4af106cristy      */
60324c08aed51c5899665ade97263692328eea4af106cristy      if (fabs((double) pixel) > (QuantumRange/2))
60334c08aed51c5899665ade97263692328eea4af106cristy        pixel-=QuantumRange;
60344c08aed51c5899665ade97263692328eea4af106cristy      pixel*=2;
60354c08aed51c5899665ade97263692328eea4af106cristy    }
60364c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
60374c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
60384c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
60394c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->green-q->green;
60404c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
60414c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
60424c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
60434c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->blue-q->blue;
60444c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
60454c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
60464c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
60474c08aed51c5899665ade97263692328eea4af106cristy  return(MagickTrue);
60484c08aed51c5899665ade97263692328eea4af106cristy}
60492b9582a27910c7baaeb04b7e969638328fa70095cristy
60502b9582a27910c7baaeb04b7e969638328fa70095cristy/*
60512b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60522b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
60532b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
60542b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
60557ae1654e7582dc87637de6302875d81607393efacristy%   S e t P i x e l C h a n n e l M a s k                                     %
60562b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
60572b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
60582b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
60592b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
60602b9582a27910c7baaeb04b7e969638328fa70095cristy%
60617ae1654e7582dc87637de6302875d81607393efacristy%  SetPixelChannelMask() sets the pixel channel map from the specified channel
60627ae1654e7582dc87637de6302875d81607393efacristy%  mask.
60632b9582a27910c7baaeb04b7e969638328fa70095cristy%
6064cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy%  The format of the SetPixelChannelMask method is:
60652b9582a27910c7baaeb04b7e969638328fa70095cristy%
6066cf1296eb467f83fd2106e51d2689ac0afc863ef8cristy%      void SetPixelChannelMask(Image *image,const ChannelType channel_mask)
60672b9582a27910c7baaeb04b7e969638328fa70095cristy%
60682b9582a27910c7baaeb04b7e969638328fa70095cristy%  A description of each parameter follows:
60692b9582a27910c7baaeb04b7e969638328fa70095cristy%
60702b9582a27910c7baaeb04b7e969638328fa70095cristy%    o image: the image.
60712b9582a27910c7baaeb04b7e969638328fa70095cristy%
6072dfdb19ea2c08296b31fef860352c0a6efe8e9cc6cristy%    o channel_mask: the channel mask.
60732b9582a27910c7baaeb04b7e969638328fa70095cristy%
60742b9582a27910c7baaeb04b7e969638328fa70095cristy*/
6075cf1296eb467f83fd2106e51d2689ac0afc863ef8cristyMagickExport void SetPixelChannelMask(Image *image,
607607a6785ad974f0631a83731fe5d7fb85751ca235cristy  const ChannelType channel_mask)
60772b9582a27910c7baaeb04b7e969638328fa70095cristy{
60786a917d6c8b1695012e26389d2ec303267676815fcristy#define GetChannelBit(mask,bit)  (((size_t) (mask) >> (size_t) (bit)) & 0x01)
6079dafd287faca4c8cd5415d13185973add9c02b2c4cristy
60802b9582a27910c7baaeb04b7e969638328fa70095cristy  register ssize_t
60812b9582a27910c7baaeb04b7e969638328fa70095cristy    i;
60822b9582a27910c7baaeb04b7e969638328fa70095cristy
6083177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy  if (image->debug != MagickFalse)
6084177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy    (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%08x]", \
6085177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy      image->filename,channel_mask); \
60863c30981743f8543ca2ccc0d19de8fbda2b3639c6cristy  image->channel_mask=channel_mask;
6087dafd287faca4c8cd5415d13185973add9c02b2c4cristy  for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
6088e2a912b6c9086c98ec838baa0824cd8deca55538cristy  {
60895a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy    PixelChannel channel=GetPixelChannelChannel(image,i);
6090297e3a450d4b95328fa0667d4910881e9787e608cristy    SetPixelChannelTraits(image,channel,
6091e2a912b6c9086c98ec838baa0824cd8deca55538cristy      GetChannelBit(channel_mask,channel) == 0 ? CopyPixelTrait :
60928a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      image->alpha_trait != BlendPixelTrait || (channel == AlphaPixelChannel) ?
60938a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      UpdatePixelTrait : (PixelTrait) (UpdatePixelTrait | image->alpha_trait));
6094e2a912b6c9086c98ec838baa0824cd8deca55538cristy  }
60951685e7216ce4e5fac701834cd7db6eee6d426234cristy  if (image->storage_class == PseudoClass)
6096297e3a450d4b95328fa0667d4910881e9787e608cristy    SetPixelChannelTraits(image,IndexPixelChannel,CopyPixelTrait);
6097883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->read_mask != MagickFalse)
6098883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelTraits(image,ReadMaskPixelChannel,CopyPixelTrait);
6099883fde11debec15cedb05dc5d7228d8588066bc0cristy  if (image->write_mask != MagickFalse)
6100883fde11debec15cedb05dc5d7228d8588066bc0cristy    SetPixelChannelTraits(image,WriteMaskPixelChannel,CopyPixelTrait);
61016dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy  if (image->debug != MagickFalse)
61026dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy    LogPixelChannels(image);
61032b9582a27910c7baaeb04b7e969638328fa70095cristy}
61042b9582a27910c7baaeb04b7e969638328fa70095cristy
61052b9582a27910c7baaeb04b7e969638328fa70095cristy/*
61062b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
61072b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
61082b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
61092b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
6110322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%   S e t P i x e l M e t a C h a n n e l s                                   %
6111322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
6112322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
6113322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
6114322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6115322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6116322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  SetPixelMetaChannels() sets the image meta channels.
6117322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6118322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  The format of the SetPixelMetaChannels method is:
6119322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6120322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%      MagickBooleanType SetPixelMetaChannels(Image *image,
6121322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%        const size_t number_meta_channels,ExceptionInfo *exception)
6122322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6123322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  A description of each parameter follows:
6124322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6125322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o image: the image.
6126322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6127322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o number_meta_channels:  the number of meta channels.
6128322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6129322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o exception: return any errors or warnings in this structure.
6130322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
6131322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy*/
6132322d07da43d795a7c3b9a2d068d9a9005591cbe4cristyMagickExport MagickBooleanType SetPixelMetaChannels(Image *image,
6133322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  const size_t number_meta_channels,ExceptionInfo *exception)
6134322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy{
6135322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  image->number_meta_channels=number_meta_channels;
6136322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  return(SyncImagePixelCache(image,exception));
6137322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy}
6138