pixel.c revision 2dc655d16d7bc2a04312bc00ad27139d7543b10c
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%                                                                             %
191454be7db7a897f42cd40e4165f945d77196a6f8cristy%  Copyright 1999-2012 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#define LogPixelChannels(image) \
74146a62b25d7466cceec79975894ce812e11f4625cristy{ \
75146a62b25d7466cceec79975894ce812e11f4625cristy  register ssize_t \
76146a62b25d7466cceec79975894ce812e11f4625cristy    i; \
77146a62b25d7466cceec79975894ce812e11f4625cristy \
78146a62b25d7466cceec79975894ce812e11f4625cristy  (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%.20g]", \
79146a62b25d7466cceec79975894ce812e11f4625cristy    image->filename,(double) image->number_channels); \
80146a62b25d7466cceec79975894ce812e11f4625cristy  for (i=0; i < (ssize_t) image->number_channels; i++) \
81146a62b25d7466cceec79975894ce812e11f4625cristy  { \
82146a62b25d7466cceec79975894ce812e11f4625cristy    char \
83146a62b25d7466cceec79975894ce812e11f4625cristy      traits[MaxTextExtent]; \
84146a62b25d7466cceec79975894ce812e11f4625cristy \
85146a62b25d7466cceec79975894ce812e11f4625cristy    const char \
864679572011210c29de1840060a4bf942afe8d29ecristy      *name; \
874679572011210c29de1840060a4bf942afe8d29ecristy \
884679572011210c29de1840060a4bf942afe8d29ecristy    PixelChannel \
894679572011210c29de1840060a4bf942afe8d29ecristy      channel; \
90146a62b25d7466cceec79975894ce812e11f4625cristy \
91e2a912b6c9086c98ec838baa0824cd8deca55538cristy    switch (GetPixelChannelMapChannel(image,i)) \
92146a62b25d7466cceec79975894ce812e11f4625cristy    { \
93146a62b25d7466cceec79975894ce812e11f4625cristy      case RedPixelChannel: \
94146a62b25d7466cceec79975894ce812e11f4625cristy      { \
954679572011210c29de1840060a4bf942afe8d29ecristy        name="red"; \
96146a62b25d7466cceec79975894ce812e11f4625cristy        if (image->colorspace == CMYKColorspace) \
974679572011210c29de1840060a4bf942afe8d29ecristy          name="cyan"; \
98146a62b25d7466cceec79975894ce812e11f4625cristy        if (image->colorspace == GRAYColorspace) \
994679572011210c29de1840060a4bf942afe8d29ecristy          name="gray"; \
100146a62b25d7466cceec79975894ce812e11f4625cristy        break; \
101146a62b25d7466cceec79975894ce812e11f4625cristy      } \
102146a62b25d7466cceec79975894ce812e11f4625cristy      case GreenPixelChannel: \
103146a62b25d7466cceec79975894ce812e11f4625cristy      { \
1044679572011210c29de1840060a4bf942afe8d29ecristy        name="green"; \
105146a62b25d7466cceec79975894ce812e11f4625cristy        if (image->colorspace == CMYKColorspace) \
1064679572011210c29de1840060a4bf942afe8d29ecristy          name="magenta"; \
107146a62b25d7466cceec79975894ce812e11f4625cristy        break; \
108146a62b25d7466cceec79975894ce812e11f4625cristy      } \
109146a62b25d7466cceec79975894ce812e11f4625cristy      case BluePixelChannel: \
110146a62b25d7466cceec79975894ce812e11f4625cristy      { \
1114679572011210c29de1840060a4bf942afe8d29ecristy        name="blue"; \
112146a62b25d7466cceec79975894ce812e11f4625cristy        if (image->colorspace == CMYKColorspace) \
1134679572011210c29de1840060a4bf942afe8d29ecristy          name="yellow"; \
114146a62b25d7466cceec79975894ce812e11f4625cristy        break; \
115146a62b25d7466cceec79975894ce812e11f4625cristy      } \
116146a62b25d7466cceec79975894ce812e11f4625cristy      case BlackPixelChannel: \
117146a62b25d7466cceec79975894ce812e11f4625cristy      { \
1184679572011210c29de1840060a4bf942afe8d29ecristy        name="black"; \
119146a62b25d7466cceec79975894ce812e11f4625cristy        if (image->storage_class == PseudoClass) \
1204679572011210c29de1840060a4bf942afe8d29ecristy          name="index"; \
121146a62b25d7466cceec79975894ce812e11f4625cristy        break; \
122146a62b25d7466cceec79975894ce812e11f4625cristy      } \
123e2a912b6c9086c98ec838baa0824cd8deca55538cristy      case IndexPixelChannel: \
124e2a912b6c9086c98ec838baa0824cd8deca55538cristy      { \
1254679572011210c29de1840060a4bf942afe8d29ecristy        name="index"; \
126e2a912b6c9086c98ec838baa0824cd8deca55538cristy        break; \
127e2a912b6c9086c98ec838baa0824cd8deca55538cristy      } \
128146a62b25d7466cceec79975894ce812e11f4625cristy      case AlphaPixelChannel: \
129146a62b25d7466cceec79975894ce812e11f4625cristy      { \
1304679572011210c29de1840060a4bf942afe8d29ecristy        name="alpha"; \
131146a62b25d7466cceec79975894ce812e11f4625cristy        break; \
132146a62b25d7466cceec79975894ce812e11f4625cristy      } \
133146a62b25d7466cceec79975894ce812e11f4625cristy      case MaskPixelChannel: \
134146a62b25d7466cceec79975894ce812e11f4625cristy      { \
1354679572011210c29de1840060a4bf942afe8d29ecristy        name="mask"; \
136146a62b25d7466cceec79975894ce812e11f4625cristy        break; \
137146a62b25d7466cceec79975894ce812e11f4625cristy      } \
138e2a912b6c9086c98ec838baa0824cd8deca55538cristy      case MetaPixelChannel: \
139146a62b25d7466cceec79975894ce812e11f4625cristy      { \
1404679572011210c29de1840060a4bf942afe8d29ecristy        name="meta"; \
141e2a912b6c9086c98ec838baa0824cd8deca55538cristy        break; \
142146a62b25d7466cceec79975894ce812e11f4625cristy      } \
143e2a912b6c9086c98ec838baa0824cd8deca55538cristy      default: \
1444679572011210c29de1840060a4bf942afe8d29ecristy        name="undefined"; \
145146a62b25d7466cceec79975894ce812e11f4625cristy    } \
1464679572011210c29de1840060a4bf942afe8d29ecristy    channel=GetPixelChannelMapChannel(image,i); \
147146a62b25d7466cceec79975894ce812e11f4625cristy    *traits='\0'; \
1484679572011210c29de1840060a4bf942afe8d29ecristy    if ((GetPixelChannelMapTraits(image,channel) & UpdatePixelTrait) != 0) \
149146a62b25d7466cceec79975894ce812e11f4625cristy      (void) ConcatenateMagickString(traits,"update,",MaxTextExtent); \
1504679572011210c29de1840060a4bf942afe8d29ecristy    if ((GetPixelChannelMapTraits(image,channel) & BlendPixelTrait) != 0) \
151146a62b25d7466cceec79975894ce812e11f4625cristy      (void) ConcatenateMagickString(traits,"blend,",MaxTextExtent); \
1524679572011210c29de1840060a4bf942afe8d29ecristy    if ((GetPixelChannelMapTraits(image,channel) & CopyPixelTrait) != 0) \
153146a62b25d7466cceec79975894ce812e11f4625cristy      (void) ConcatenateMagickString(traits,"copy,",MaxTextExtent); \
154146a62b25d7466cceec79975894ce812e11f4625cristy    if (*traits == '\0') \
155146a62b25d7466cceec79975894ce812e11f4625cristy      (void) ConcatenateMagickString(traits,"undefined,",MaxTextExtent); \
156146a62b25d7466cceec79975894ce812e11f4625cristy    traits[strlen(traits)-1]='\0'; \
157146a62b25d7466cceec79975894ce812e11f4625cristy    (void) LogMagickEvent(PixelEvent,GetMagickModule(),"  %.20g: %s (%s)", \
1584679572011210c29de1840060a4bf942afe8d29ecristy      (double) i,name,traits); \
159146a62b25d7466cceec79975894ce812e11f4625cristy  } \
160146a62b25d7466cceec79975894ce812e11f4625cristy}
161146a62b25d7466cceec79975894ce812e11f4625cristy
162146a62b25d7466cceec79975894ce812e11f4625cristy/*
1634c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1644c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1654c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1664c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
167ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   A c q u i r e P i x e l C h a n n e l M a p                               %
1684c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1694c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1704c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
1714c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1724c08aed51c5899665ade97263692328eea4af106cristy%
173ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  AcquirePixelChannelMap() acquires a pixel component map.
1744c08aed51c5899665ade97263692328eea4af106cristy%
175ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the AcquirePixelChannelMap() method is:
1764c08aed51c5899665ade97263692328eea4af106cristy%
177bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *AcquirePixelChannelMap(void)
1784c08aed51c5899665ade97263692328eea4af106cristy%
1794c08aed51c5899665ade97263692328eea4af106cristy*/
180bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *AcquirePixelChannelMap(void)
1814c08aed51c5899665ade97263692328eea4af106cristy{
182ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  PixelChannelMap
183bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    *channel_map;
1844c08aed51c5899665ade97263692328eea4af106cristy
1854c08aed51c5899665ade97263692328eea4af106cristy  register ssize_t
1864c08aed51c5899665ade97263692328eea4af106cristy    i;
1874c08aed51c5899665ade97263692328eea4af106cristy
188bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels,
189bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    sizeof(*channel_map));
190bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (channel_map == (PixelChannelMap *) NULL)
1914c08aed51c5899665ade97263692328eea4af106cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
192bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map));
193bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  for (i=0; i < MaxPixelChannels; i++)
194bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    channel_map[i].channel=(PixelChannel) i;
195ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  return(channel_map);
1964c08aed51c5899665ade97263692328eea4af106cristy}
1974c08aed51c5899665ade97263692328eea4af106cristy
1984c08aed51c5899665ade97263692328eea4af106cristy/*
1994c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2004c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2014c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2024c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
203ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy+   C l o n e P i x e l C h a n n e l M a p                                   %
2044c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2054c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2064c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2074c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2084c08aed51c5899665ade97263692328eea4af106cristy%
209ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  ClonePixelChannelMap() clones a pixel component map.
2104c08aed51c5899665ade97263692328eea4af106cristy%
211ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%  The format of the ClonePixelChannelMap() method is:
2124c08aed51c5899665ade97263692328eea4af106cristy%
213bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
2144c08aed51c5899665ade97263692328eea4af106cristy%
2154c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
2164c08aed51c5899665ade97263692328eea4af106cristy%
217ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy%    o channel_map: the pixel component map.
2184c08aed51c5899665ade97263692328eea4af106cristy%
2194c08aed51c5899665ade97263692328eea4af106cristy*/
220bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
2214c08aed51c5899665ade97263692328eea4af106cristy{
222ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  PixelChannelMap
223bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    *clone_map;
2244c08aed51c5899665ade97263692328eea4af106cristy
225bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  assert(channel_map != (PixelChannelMap *) NULL);
226ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy  clone_map=AcquirePixelChannelMap();
227bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (clone_map == (PixelChannelMap *) NULL)
228bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    return((PixelChannelMap *) NULL);
229bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels*
230bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    sizeof(*channel_map));
2314c08aed51c5899665ade97263692328eea4af106cristy  return(clone_map);
2324c08aed51c5899665ade97263692328eea4af106cristy}
2334c08aed51c5899665ade97263692328eea4af106cristy
2344c08aed51c5899665ade97263692328eea4af106cristy/*
2354c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2364c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2374c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2384c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2394c08aed51c5899665ade97263692328eea4af106cristy+   C l o n e P i x e l I n f o                                               %
2404c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2414c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2424c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2434c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2444c08aed51c5899665ade97263692328eea4af106cristy%
2454c08aed51c5899665ade97263692328eea4af106cristy%  ClonePixelInfo() makes a duplicate of the given pixel info structure, or if
2464c08aed51c5899665ade97263692328eea4af106cristy%  pixel info is NULL, a new one.
2474c08aed51c5899665ade97263692328eea4af106cristy%
2484c08aed51c5899665ade97263692328eea4af106cristy%  The format of the ClonePixelInfo method is:
2494c08aed51c5899665ade97263692328eea4af106cristy%
2504c08aed51c5899665ade97263692328eea4af106cristy%      PixelInfo *ClonePixelInfo(const PixelInfo *pixel_info)
2514c08aed51c5899665ade97263692328eea4af106cristy%
2524c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
2534c08aed51c5899665ade97263692328eea4af106cristy%
2544c08aed51c5899665ade97263692328eea4af106cristy%    o pixel_info: the pixel info.
2554c08aed51c5899665ade97263692328eea4af106cristy%
2564c08aed51c5899665ade97263692328eea4af106cristy*/
2574c08aed51c5899665ade97263692328eea4af106cristyMagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
2584c08aed51c5899665ade97263692328eea4af106cristy{
2594c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
2604c08aed51c5899665ade97263692328eea4af106cristy    *pixel_info;
2614c08aed51c5899665ade97263692328eea4af106cristy
262a64b85d7873d5e540fe6e2941aa98ec7653a4e2dcristy  pixel_info=(PixelInfo *) AcquireQuantumMemory(1,sizeof(*pixel_info));
2634c08aed51c5899665ade97263692328eea4af106cristy  if (pixel_info == (PixelInfo *) NULL)
2644c08aed51c5899665ade97263692328eea4af106cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
2654c08aed51c5899665ade97263692328eea4af106cristy  *pixel_info=(*pixel);
2664c08aed51c5899665ade97263692328eea4af106cristy  return(pixel_info);
2674c08aed51c5899665ade97263692328eea4af106cristy}
2684c08aed51c5899665ade97263692328eea4af106cristy
2694c08aed51c5899665ade97263692328eea4af106cristy/*
2704c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2714c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2724c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
2734c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
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%                                                                             %
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E x p o r t I m a g e P i x e l s                                         %
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ExportImagePixels() extracts pixel data from an image and returns it to you.
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The method returns MagickTrue on success otherwise MagickFalse if an error is
313b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  encountered.  The data is returned as char, short int, Quantum, unsigned int,
314cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%  unsigned long long, float, or double in the order specified by map.
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Suppose you want to extract the first scanline of a 640x480 image as
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  character data in red-green-blue order:
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ExportImagePixels method is:
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
323cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%      MagickBooleanType ExportImagePixels(const Image *image,const ssize_t x,
324cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const ssize_t y,const size_t width,const size_t height,
325cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const char *map,const StorageType type,void *pixels,
32646f4be29828ab7588745336d46ab11611c847933cristy%        ExceptionInfo *exception)
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
332cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%    o x,y,width,height:  These values define the perimeter
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      of a region of pixels you want to extract.
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o map:  This string reflects the expected ordering of the pixel array.
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      It can be any combination or order of R = red, G = green, B = blue,
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      P = pad.
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o type: Define the data type of the pixels.  Float and double types are
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
3436c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
344ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy%      LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
3456c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixels: This array of values contain the pixel components as defined by
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      map and type.  You must preallocate this array where the expected
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      length varies depending on the values of width, height, map, and type.
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3552dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportCharPixel(Image *image,const RectangleInfo *roi,
35646f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
35746f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
362bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned char
3663fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
36814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
36914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
37014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3719d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
3729d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
3739d314ff2c17a77996c05413c2013880387e50f0ecristy
37446f4be29828ab7588745336d46ab11611c847933cristy  q=(unsigned char *) pixels;
375e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
377cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
379cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
382cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
392e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
393e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
394cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
396cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
399cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
410e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
412cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
414cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
415e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
417cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar((Quantum) 0);
423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
428e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
4302dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
431cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
433cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
436cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelIntensity(image,p));
439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
445e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
446cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
448cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
449e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
451cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
452e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
453e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
463cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
465cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
466e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
468cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
469e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
472e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
481cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
483cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
486cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToChar((Quantum) 0);
492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
49714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
498cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
500cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
503cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
50814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelRed(image,p));
517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelGreen(image,p));
523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelBlue(image,p));
529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=ScaleQuantumToChar(GetPixelBlack(image,p));
545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToChar(GetPixelIntensity(image,p));
550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
5622dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportDoublePixel(Image *image,const RectangleInfo *roi,
56346f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
56446f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register double
5703fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
57514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
57614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
57714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(double *) pixels;
582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
584cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
586cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
5874c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
589cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
594ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
601cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
603cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
606cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
618e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
619cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
621cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
6224c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
624cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
628e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
630ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6372dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
638cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
640cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
643cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelIntensity(image,p));
646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
653cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
655cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
658cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
670cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
672cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
675cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
688cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
690cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
6914c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
693cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelRed(image,p));
696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelGreen(image,p));
697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(double) (QuantumScale*GetPixelBlue(image,p));
698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
699ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
70414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
705cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
707cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
710cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelRed(image,p));
724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelGreen(image,p));
730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelBlue(image,p));
736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelAlpha(image,p));
741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelAlpha(image,p));
746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=(double) (QuantumScale*
752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy                GetPixelBlack(image,p));
753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(double) (QuantumScale*GetPixelIntensity(image,p));
758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=0;
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
7702dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportFloatPixel(Image *image,const RectangleInfo *roi,
77146f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
77246f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register float
7783fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
78314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
78414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
78514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
786e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
788e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(float *) pixels;
790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
792cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
794cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
7954c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
797cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
802ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
809cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
811cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
814cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
827cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
829cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
8304c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
832cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
838ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8452dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
846cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
848cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
851cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelIntensity(image,p));
854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
861cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
863cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
866cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
878cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
880cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
883cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
896cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
898cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
8994c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
901cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelRed(image,p));
904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelGreen(image,p));
905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(float) (QuantumScale*GetPixelBlue(image,p));
906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0.0;
907ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
91214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
913cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
915cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
918cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
92314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelRed(image,p));
932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
935e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelGreen(image,p));
938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelBlue(image,p));
944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p))));
949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelAlpha(image,p));
954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=(float) (QuantumScale* GetPixelBlack(image,p));
960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(float) (QuantumScale*GetPixelIntensity(image,p));
965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=0;
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
973e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
9772dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportLongPixel(Image *image,const RectangleInfo *roi,
97846f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
97946f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
983e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned int
9883fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
99014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
99114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
99214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(unsigned int *) pixels;
997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
999cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1001cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
10024c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1004cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
10066c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
10076c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
10086c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1009ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1012e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
1014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1016cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1018cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1021cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
10236c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
10246c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
10256c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
10266c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1034cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1036cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1039cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
10416c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
10426c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
10436c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
10446c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=0;
1045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1048e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
10522dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
1053cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1055cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1058cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
10606c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelIntensity(image,p));
1061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1068cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1070cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1073cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
10756c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
10766c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
10776c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1085cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1087cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1090cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
10926c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
10936c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
10946c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
10956c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
1096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1103cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1105cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1108cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
11106c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelRed(image,p));
11116c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
11126c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
11136c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy          *q++=0;
1114e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
111914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1120cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1122cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1125cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1129e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
113014d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1133e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
11386c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelRed(image,p));
1139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
11446c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelGreen(image,p));
1145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
11506c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelBlue(image,p));
1151e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1153e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
11556c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1156e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
11606c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1165e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
11666c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy              *q=ScaleQuantumToLong(GetPixelBlack(image,p));
1167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1168e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
11716c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            *q=ScaleQuantumToLong(GetPixelIntensity(image,p));
1172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1173e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
11756c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy            break;
1176e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
11842dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportLongLongPixel(Image *image,const RectangleInfo *roi,
118546f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
118646f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
1189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
1190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1191e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1192e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1193e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1194b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  register MagickSizeType
11953fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
1196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
119714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
119814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
119914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1202e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1203b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  q=(MagickSizeType *) pixels;
1204e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1206cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1207e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1208cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1209e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1211cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1213b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1214b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1215b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1217e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1219e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1222e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1223cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1224e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1225cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1226e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1228cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1229e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1230b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1231b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1232b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1233b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1236e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1238e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1241cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1243cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1244e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1245e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1246cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1248b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1249b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1250b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1252e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1253e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1254e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1256e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1257e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1258e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
12592dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
1260cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1261e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1262cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1263e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1264e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1265cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1266e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1267b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelIntensity(image,p));
1268e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1269e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1271e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1273e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1275cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1276e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1277cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1280cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1282b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1283b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1284b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1286e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1287e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1289e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1290e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1292cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1294cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1295e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1297cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1298e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1299b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1300b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1301b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1302b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1305e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1306e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1310cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1311e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1312cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1315cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1316e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1317b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelRed(image,p));
1318b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1319b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          *q++=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1320e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
132614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1327cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1329cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1332cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1333e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1335e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
133714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1344e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1345b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelRed(image,p));
1346e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1348e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1351b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelGreen(image,p));
1352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1353e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1355e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1356e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1357b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelBlue(image,p));
1358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1359e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1362b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1363e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1366e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1367b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelAlpha(image,p));
1368e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1373b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy              *q=ScaleQuantumToLongLong(GetPixelBlack(image,p));
1374e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1375e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1376e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1378b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            *q=ScaleQuantumToLongLong(GetPixelIntensity(image,p));
1379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
13912dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportQuantumPixel(Image *image,const RectangleInfo *roi,
139246f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
139346f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1394e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
1396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
1397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1398e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
13993fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
1400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1403e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
140414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
140514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
140614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
1408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
1409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1410e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(Quantum *) pixels;
1411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1412e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1413cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1415cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1418cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1428e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1430cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1431e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1432cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1433e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1435cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) (GetPixelAlpha(image,p));
1441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1445e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1448cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1449e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1450cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1452e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1453cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) 0;
1459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
14662dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
1467cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1469cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1472cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1474e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelIntensity(image,p);
1475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1482cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1484cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1487cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1497e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1499cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1501cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1504cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) (GetPixelAlpha(image,p));
1510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1517cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1519cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1522cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelRed(image,p);
1525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelGreen(image,p);
1526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=GetPixelBlue(image,p);
1527e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=(Quantum) 0;
1528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
153314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1534cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1536cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1539cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
154414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=(Quantum) 0;
1547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelRed(image,p);
1553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1554e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelGreen(image,p);
1559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelBlue(image,p);
1565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelAlpha(image,p);
1570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=GetPixelAlpha(image,p);
1575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=GetPixelBlack(image,p);
1581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(GetPixelIntensity(image,p));
1586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1590e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=(Quantum) 0;
1591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
16012dc655d16d7bc2a04312bc00ad27139d7543b10ccristystatic void ExportShortPixel(Image *image,const RectangleInfo *roi,
160246f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,void *pixels,
160346f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
1604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
1606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
1607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
1610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register unsigned short
16123fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
1613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
161414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
161514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
161614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
161714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  ssize_t
161814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    y;
161914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  q=(unsigned short *) pixels;
1621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
1622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1623cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1625cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1628cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1633e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1634e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
1639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1640cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1642cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1645cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
1657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1658cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1660cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1663cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1672e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
1675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
16762dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
1677cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1679cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1682cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelIntensity(image,p));
1685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
1691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1692cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1694cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1695e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1697cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
1708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1709cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1711cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1714cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1722e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
1726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1727cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
1728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1729cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (p == (const Quantum *) NULL)
1731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1732cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
1733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          *q++=0;
1738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p+=GetPixelChannels(image);
1739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
1742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
174314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
1744cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
1745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1746cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    p=GetVirtualPixels(image,roi->x,roi->y+y,roi->width,1,exception);
1747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (p == (const Quantum *) NULL)
1748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1749cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
1750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
1752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
1753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
175414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
1755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        *q=0;
1757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
1758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
1759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
1760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
1761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelRed(image,p));
1763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
1766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
1767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelGreen(image,p));
1769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
1772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
1773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelBlue(image,p));
1775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
1778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
1783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1786e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
1788e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            if (image->colorspace == CMYKColorspace)
1790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              *q=ScaleQuantumToShort(GetPixelBlack(image,p));
1791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1793e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
1794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
1795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            *q=ScaleQuantumToShort(GetPixelIntensity(image,p));
1796e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
1798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
1799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
1800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
1801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        q++;
1802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      p+=GetPixelChannels(image);
1804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
18082dc655d16d7bc2a04312bc00ad27139d7543b10ccristyMagickExport MagickBooleanType ExportImagePixels(Image *image,
1809cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const ssize_t x,const ssize_t y,const size_t width,const size_t height,
1810cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const char *map,const StorageType type,void *pixels,ExceptionInfo *exception)
1811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
1812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  QuantumType
1813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *quantum_map;
1814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1815cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  RectangleInfo
1816cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    roi;
1817cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy
1818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
1819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    i;
1820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
182114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
182214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
182314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
1824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image != (Image *) NULL);
1825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image->signature == MagickSignature);
1826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image->debug != MagickFalse)
1827e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
182814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
182914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
1830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (quantum_map == (QuantumType *) NULL)
1831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      (void) ThrowMagickException(exception,GetMagickModule(),
1833e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony        ResourceLimitError,"MemoryAllocationFailed","'%s'",image->filename);
1834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return(MagickFalse);
1835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
183614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  for (i=0; i < (ssize_t) length; i++)
1837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    switch (map[i])
1839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'A':
1841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'a':
1842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=AlphaQuantum;
1844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'B':
1847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'b':
1848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlueQuantum;
1850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'C':
1853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'c':
1854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=CyanQuantum;
1856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
1857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1860e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony          "ColorSeparatedImageRequired","'%s'",map);
1861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'g':
1864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'G':
1865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=GreenQuantum;
1867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'I':
1870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'i':
1871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=IndexQuantum;
1873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'K':
1876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'k':
1877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlackQuantum;
1879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
1880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1883e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony          "ColorSeparatedImageRequired","'%s'",map);
1884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'M':
1887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'm':
1888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=MagentaQuantum;
1890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
1891e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1892e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1894e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony          "ColorSeparatedImageRequired","'%s'",map);
1895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'o':
1898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'O':
1899e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1900e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=OpacityQuantum;
1901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'P':
1904e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'p':
1905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=UndefinedQuantum;
1907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'R':
1910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'r':
1911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1912e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=RedQuantum;
1913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
1914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'Y':
1916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'y':
1917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=YellowQuantum;
1919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (image->colorspace == CMYKColorspace)
1920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
1921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
1923e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony          "ColorSeparatedImageRequired","'%s'",map);
1924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      default:
1927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
1928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
1930e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony          "UnrecognizedPixelMap","'%s'",map);
1931e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
1932e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
1933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
1935cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.width=width;
1936cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.height=height;
1937cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.x=x;
1938cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.y=y;
1939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  switch (type)
1940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
1941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case CharPixel:
1942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1943cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportCharPixel(image,&roi,map,quantum_map,pixels,exception);
1944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1945e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case DoublePixel:
1947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1948cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
1949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1950e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1951e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case FloatPixel:
1952e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1953cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
1954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1955e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
19566c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongPixel:
1957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1958cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportLongPixel(image,&roi,map,quantum_map,pixels,exception);
1959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
19616c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongLongPixel:
1962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1963cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
1964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1965e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case QuantumPixel:
1967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1968cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
1969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1970e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1971e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case ShortPixel:
1972e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1973cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ExportShortPixel(image,&roi,map,quantum_map,pixels,exception);
1974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
1975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
1976e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    default:
1977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
1978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
1980e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony        "UnrecognizedPixelMap","'%s'",map);
19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
19823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
1984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
1985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  return(MagickTrue);
1986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
1987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
1988e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/*
1989e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1990e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
1991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
1992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
1993e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%   G e t P i x e l I n f o                                                   %
1994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
1995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
1996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
1997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
1999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  GetPixelInfo() initializes the PixelInfo structure.
2000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  The format of the GetPixelInfo method is:
2002e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      GetPixelInfo(const Image *image,PixelInfo *pixel)
2004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  A description of each parameter follows:
2006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2007e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o image: the image.
2008e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2009e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o pixel: Specifies a pointer to a PixelInfo structure.
2010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/
2012e5370944fabb7afa477ab1325d400731b1e5d5e8cristyMagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel)
2013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->storage_class=DirectClass;
20157020ae6594690c03a4f73784fd41a7131a5b22c6cristy  pixel->colorspace=sRGBColorspace;
2016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->matte=MagickFalse;
2017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->fuzz=0.0;
2018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->depth=MAGICKCORE_QUANTUM_DEPTH;
2019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->red=0.0;
2020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->green=0.0;
2021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->blue=0.0;
2022e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->black=0.0;
2023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->alpha=(MagickRealType) OpaqueAlpha;
2024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->index=0.0;
2025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image == (const Image *) NULL)
2026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    return;
2027e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->storage_class=image->storage_class;
2028e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->colorspace=image->colorspace;
2029e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->matte=image->matte;
2030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->depth=image->depth;
2031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  pixel->fuzz=image->fuzz;
2032e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy/*
2035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%   I m p o r t I m a g e P i x e l s                                         %
2040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2042e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%                                                                             %
2043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2045e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  ImportImagePixels() accepts pixel data and stores in the image at the
2046e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  location you specify.  The method returns MagickTrue on success otherwise
2047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  MagickFalse if an error is encountered.  The pixel data can be either char,
2048b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  Quantum, short int, unsigned int, unsigned long long, float, or double in
2049b5a45a37a6faa8a3725c814b51a1a86daa4ff21fcristy%  the order specified by map.
2050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2051e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  Suppose your want to upload the first scanline of a 640x480 image from
2052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  character data in red-green-blue order:
2053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels);
2055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2056e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  The format of the ImportImagePixels method is:
2057e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2058cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%      MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
2059cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const ssize_t y,const size_t width,const size_t height,
2060cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        const char *map,const StorageType type,const void *pixels,
2061cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%        ExceptionInfo *exception)
2062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%  A description of each parameter follows:
2064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o image: the image.
2066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2067cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy%    o x,y,width,height:  These values define the perimeter
2068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      of a region of pixels you want to define.
2069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o map:  This string reflects the expected ordering of the pixel array.
2071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      It can be any combination or order of R = red, G = green, B = blue,
2072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
2073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
2074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      P = pad.
2075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o type: Define the data type of the pixels.  Float and double types are
2077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
20786c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      types: CharPixel (char *), DoublePixel (double *), FloatPixel (float *),
2079ff6834e270b99c2747ad5b2f4edeecf862aaf825cristy%      LongPixel (unsigned int *), LongLongPixel (unsigned long long *),
20806c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy%      QuantumPixel (Quantum *), or ShortPixel (unsigned short *).
2081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o pixels: This array of values contain the pixel components as defined by
2083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      map and type.  You must preallocate this array where the expected
2084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%      length varies depending on the values of width, height, map, and type.
2085e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%    o exception: return any errors or warnings in this structure.
2087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy%
2088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy*/
2089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2090cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportCharPixel(Image *image,const RectangleInfo *roi,
209146f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
209246f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
2093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned char
2095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
2096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
20983fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
2099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
210314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
210414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
210514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned char *) pixels;
2110e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2111e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2112cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2113e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2114cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2117cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2118e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2123e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2124e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2125e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2129e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2131cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2132e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2133cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2134e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2136cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2137e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2139e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2140e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2141e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRO") == 0)
2150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2151cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2153cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2156cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2158e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2159e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2160e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2161e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2165e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2166e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2168e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2171cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2173cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2176cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2178e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2179e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2180e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2186e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
21912dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
2192cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2193e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2194cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2195e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2197cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2199e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleCharToQuantum(*p++),q);
2200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2202e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2203e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2204e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2206e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2207e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2209cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2210e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2211cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2214cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2216e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2217e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2218e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2219e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2222e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2223e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2224e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2225e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2226e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2228cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2229e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2230cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2233cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2235e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2236e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2237e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2238e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2241e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2243e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2244e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2245e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2246e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBO") == 0)
2247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2248cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2249e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2250cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2252e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2253cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2254e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2255e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2256e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2257e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2258e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2259e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2260e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2261e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2262e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2263e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2264e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2265e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2266e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2267e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2268cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2269e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2270cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2271e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2272e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2273cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2276e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2277e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2280e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2283e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2284e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
228614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
2287cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
2288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2289cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2290e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
2291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2292cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
2293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
2295e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
2296e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
229714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
2298e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
2300e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2301e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
2302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
2303e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleCharToQuantum(*p),q);
2305e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2306e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
2308e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
2309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2310e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleCharToQuantum(*p),q);
2311e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2313e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
2314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
2315e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2316e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleCharToQuantum(*p),q);
2317e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2318e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
2320e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2321e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
2325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2326e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2327e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
2330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2331e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleCharToQuantum(*p),q);
2332e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2333e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
2335e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleCharToQuantum(*p),q);
2337e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2339e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
2340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
2343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2344e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
2345e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2346e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
2347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2348e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
2349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2351cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportDoublePixel(Image *image,const RectangleInfo *roi,
235246f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
235346f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
2354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
2355e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const double
2356e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
2357e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2358e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
23593fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
2360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2362e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2363e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
236414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
236514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
236614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2368e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const double *) pixels;
2371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2372e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2373cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2374e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2375cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2376e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2377e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2378cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2384e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2392e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2393e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2394e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2395e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2396e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2397e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2398cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2399e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2400cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2403cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2404e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2405e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2406e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2407e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2409e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2410e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2411e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2412e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2413e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2415e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2417e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2418e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2422e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2426cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2428cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2430e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2431cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2432e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2433e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2434e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2435e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2436e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2440e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2441e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2442e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2443e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2444e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2445e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2446e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2448e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2449e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2451e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
24522dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
2453cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2454e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2455cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2458cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ClampToQuantum((MagickRealType) QuantumRange*
2461e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2466e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2469e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2470e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2471e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2472cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2473e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2474cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2475e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2477cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2480e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2481e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2482e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2483e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2484e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2486e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2487e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2488e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2490e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2493e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2494e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2497cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2498e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2499cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2501e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2502cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2504e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2507e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2510e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2513e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2516e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2519e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2521e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2524e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2525cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2526e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2527cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2529e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2530cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2531e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2534e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2536e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2539e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2542e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
254814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy   length=strlen(map);
2549cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
2550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2551cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2552e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
2553e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2554cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
2555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
2557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
2558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
255914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
2560e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
2562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
2564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
2565e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2566e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ClampToQuantum((MagickRealType)
2567e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
2571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
2572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ClampToQuantum((MagickRealType)
2574e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2575e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2576e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2577e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
2578e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
2579e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2580e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ClampToQuantum((MagickRealType)
2581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2584e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
2585e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2586e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2587e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2588e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2590e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
2591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2592e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2593e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2595e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
2597e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2598e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ClampToQuantum((MagickRealType)
2599e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
2603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ClampToQuantum((MagickRealType)
2605e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2607e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
2609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
2612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2613e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
2614e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2615e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
2616e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2617e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
26183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2619e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2620cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportFloatPixel(Image *image,const RectangleInfo *roi,
262146f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
262246f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
26233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2624e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const float
2625e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
2626e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2627e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
26283fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
2629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2630e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
2631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
2632e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
263314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
263414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
263514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
2636e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
2637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
2638e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2639e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const float *) pixels;
2640e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
2641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2642cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2643e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2644cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2645e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2647cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2651e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2653e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2655e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2656e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2657e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2662e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2664e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2667cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2669cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2670e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2672cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2674e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2675e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2682e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2690e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2691e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2692e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2693e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2694e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2695cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2696e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2697cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2700cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2701e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2702e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2703e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2704e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2705e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2707e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2708e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2709e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2711e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2714e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2715e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2718e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2719e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
27212dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
2722cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2724cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2725e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2727cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2728e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ClampToQuantum((MagickRealType) QuantumRange*
2730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2731e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2734e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2737e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2740e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2741cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2742e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2743cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2745e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2746cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2747e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2749e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2750e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2752e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2755e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2757e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2760e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2763e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
2765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2766cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2768cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2771cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2773e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType)
2774e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            QuantumRange*(*p)),q);
2775e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2780e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2781e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2782e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2786e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2787e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2788e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
2793e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2794cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
2795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2796cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2797e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2799cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2801e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2807e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2808e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            (*p)),q);
2809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
281714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
2818cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
2819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
2820cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
2822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2823cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
2824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
2826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
2827e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
282814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
2829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
2830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
2831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
2833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
2834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ClampToQuantum((MagickRealType)
2836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
2840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
2841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ClampToQuantum((MagickRealType)
2843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
2847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
2848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ClampToQuantum((MagickRealType)
2850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
2854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
2860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
2866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ClampToQuantum((MagickRealType)
2868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2869e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
2872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
2873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ClampToQuantum((MagickRealType)
2874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy              QuantumRange*(*p)),q);
2875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
2877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
2878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
2879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
2881e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
2882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
2883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
2885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
2886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
2887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
2888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
2889cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongPixel(Image *image,const RectangleInfo *roi,
289046f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
289146f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
28923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2893e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned int
2894e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
28953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
28964c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
28973fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
28983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2899bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
29003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
29013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
290214d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
290314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
290414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
29059d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
29069d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
29079d314ff2c17a77996c05413c2013880387e50f0ecristy
2908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned int *) pixels;
2909e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
29103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2911cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
29123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2913cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2914e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2916cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2917e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2919e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2924e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
29253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
2929e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2930cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
29313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2932cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2933e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2934e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2935cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2936e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2937e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2938e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2939e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2940e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2941e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2942e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2943e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2944e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
29453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2946e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2947e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2948e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
2949e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2950cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
29513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2952cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2953e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2954e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2955cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2956e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2957e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2958e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2959e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2960e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
2961e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2962e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2963e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2964e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
29653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2966e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2967e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2968e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
2969e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
29702dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
2971cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
29723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2973cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2974e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2975e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2976cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2977e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2978e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleLongToQuantum(*p++),q);
2979e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2980e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
2981e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2982e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
29833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2984e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
2985e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
2986e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
2987e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
2988cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
29893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2990cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
2991e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
2992e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
2993cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
2994e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
2995e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2996e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2997e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2998e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
2999e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3000e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3001e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
30023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3003e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3004e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3005e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3006e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3007cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
30083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3009cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3010e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3011e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3012cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3013e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3014e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3015e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3016e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3017e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3018e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3019e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3020e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3021e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
30223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3023e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3024e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3025e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3026e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3027cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
30283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3029cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3030e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3031e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3032cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3033e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3034e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3035e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3036e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3037e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3038e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3039e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3040e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3041e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
30423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3043e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3044e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
304514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3046cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3047e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3048cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3049e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3050e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3051cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
3052e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3053e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3054e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
3055e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
305614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
30573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3058e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
3059e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3060e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3061e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
3062e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3063e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleLongToQuantum(*p),q);
3064e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3065e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3066e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3067e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
3068e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3069e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleLongToQuantum(*p),q);
3070e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3071e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3072e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3073e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
3074e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3075e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleLongToQuantum(*p),q);
3076e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3077e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3078e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
3079e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3080e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3081e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3082e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3083e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
3084e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3085e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3086e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3087e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3088e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
3089e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3090e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleLongToQuantum(*p),q);
3091e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3092e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3093e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
3094e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          {
3095e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleLongToQuantum(*p),q);
3096e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3097e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          }
3098e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3099e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
3100e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3101e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3102e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3103e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3104e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3105e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3106e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3107e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3108e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3109e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3110cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportLongLongPixel(Image *image,const RectangleInfo *roi,
311146f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
311246f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
3113e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3114b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  register const MagickSizeType
3115e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
3116e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3117e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
31183fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
3119e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3120e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3121e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3122e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
312314d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
312414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
312514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3126e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3127e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3128e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3129b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy  p=(const MagickSizeType *) pixels;
3130e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3131e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3132cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3133e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3134cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3135e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3136e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3137cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3138e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3139b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3140b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3141b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3142e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3143e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3144e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3145e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3146e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3147e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3148e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3149e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3150e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3151cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3152e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3153cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3154e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3155e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3156cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3157e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3158b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3159b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3160b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3161b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3162e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3163e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3164e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3165e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3166e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3167e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3168e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3169e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3170e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3171cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3172e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3173cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3174e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3175e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3176cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3177e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3178b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3179b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3180b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3181e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3182e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3183e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3184e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3185e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
31863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3187e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3188e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3189e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
3190e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
31912dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
3192cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
31933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3194cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3195e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3196e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3197cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3198e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3199b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGray(image,ScaleLongLongToQuantum(*p++),q);
3200e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3201e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3202e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3203e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
32043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3205e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3206e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3207e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3208e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3209cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
32103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3211cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3212e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3213e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3214cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3215e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3216b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3217b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3218b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3219e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3220e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3221e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3222e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
32233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3224e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3225e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3226e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3227e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3228cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
32293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3230cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3231e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3232e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3233cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3234e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3235b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3236b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3237b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3238b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelAlpha(image,ScaleLongLongToQuantum(*p++),q);
3239e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3240e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3241e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3242e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
32433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3244e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3245e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3246e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3247e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3248cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
32493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3250cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3251e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
3252e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3253cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3254e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3255b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelRed(image,ScaleLongLongToQuantum(*p++),q);
3256b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelGreen(image,ScaleLongLongToQuantum(*p++),q);
3257b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy          SetPixelBlue(image,ScaleLongLongToQuantum(*p++),q);
3258e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3259e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3260e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3261e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3262e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
32633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3264e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
32653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
326614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3267cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
32683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3269cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3270e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3271e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3272cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
32733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3274e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3275e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
32763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
327714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3278e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3279e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
32803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3281e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3282e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
32833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3284b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelRed(image,ScaleLongLongToQuantum(*p),q);
3285e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
32863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3287e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3288e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
32893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3290b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelGreen(image,ScaleLongLongToQuantum(*p),q);
3291e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
32923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3293e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3294e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
32953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3296b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelBlue(image,ScaleLongLongToQuantum(*p),q);
3297e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
32983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3299e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
33003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3301b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3302e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
33033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3304e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
33053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3306b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelAlpha(image,ScaleLongLongToQuantum(*p),q);
3307e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
33083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3309e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
33103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3311b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelBlack(image,ScaleLongLongToQuantum(*p),q);
3312e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
33133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3314e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
33153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3316b13e12a94fbf88e8597bfe485e35b484b1ff2e6acristy            SetPixelGray(image,ScaleLongLongToQuantum(*p),q);
3317e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
33183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3319e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3320e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
33213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3322e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3323e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3324e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3325e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3326e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3327e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3328e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3329e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3330e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3331cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportQuantumPixel(Image *image,const RectangleInfo *roi,
333246f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
333346f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
3334e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3335e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const Quantum
3336e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
3337e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3338e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
33393fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
3340e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3341e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3342e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3343e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
334414d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
334514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
334614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3347e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3348e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3349e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3350e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const Quantum *) pixels;
3351e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3352e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3353cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3354e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3355cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3356e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
33573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3358cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
33593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3360e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3361e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3362e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3363e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
3364e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        }
3365e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3366e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3367e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3368e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3369e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3370e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
3371e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3372cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3373e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3374cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3375e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
33763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3377cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3378e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3379e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3380e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3381e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3382e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,*p++,q);
3383e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
33843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3385e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3386e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3387e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3388e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3389e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3390e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3391e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3392cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
33933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3394cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
33954c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
33963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3397cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
33983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3399e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3400e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3401e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3402e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3403ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
34043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
34053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
34063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3408e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
34093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3410e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
34113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
34122dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
3413cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3414e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3415cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3416e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
34173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3418cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3419e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3420e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,*p++,q);
3421e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
34223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3423e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3424e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3425e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3426e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3427e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3428e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3429e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3430cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
34313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3432cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
34334c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
34343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3435cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
34363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3437e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3438e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3439e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3440ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
34413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
34423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
34433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3445e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
34463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3447e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
34483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3449cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3450e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3451cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3452e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
34533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3454cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3455e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3456e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3457e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3458e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3459e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,*p++,q);
3460e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
34613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3462e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3463e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3464e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3465e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3466e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3467e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3468e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3469cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
34703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3471cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
34724c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
34733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3474cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
34753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3476e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,*p++,q);
3477e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,*p++,q);
3478e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,*p++,q);
3479e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3480ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
34813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
34823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
34833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3485e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
34863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
348714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3488cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3489e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3490cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3491e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3492e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3493cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
34943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3495e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3496e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
34973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
349814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3499e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3500e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
35013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3502e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3503e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
35043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3505e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,*p,q);
3506e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3508e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3509e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
35103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3511e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,*p,q);
3512e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3514e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3515e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3517e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,*p,q);
3518e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3520e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3522e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,*p,q);
3523e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3525e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
35263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3527e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,*p,q);
3528e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3530e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
35313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3532e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,*p,q);
3533e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3535e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
35363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3537e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,*p,q);
3538e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3540e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3541e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
35423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3543e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3544e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3545e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3546e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3547e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3548e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3549e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3550e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3551e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3552cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristystatic void ImportShortPixel(Image *image,const RectangleInfo *roi,
355346f4be29828ab7588745336d46ab11611c847933cristy  const char *restrict map,const QuantumType *quantum_map,const void *pixels,
355446f4be29828ab7588745336d46ab11611c847933cristy  ExceptionInfo *exception)
3555e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3556e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register const unsigned short
3557e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *restrict p;
3558e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3559e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register Quantum
35603fe1145f1b441b8addc92dfbe86c80d6999b2c76cristy    *restrict q;
3561e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3562e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3563e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    x;
3564e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
356514d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
356614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
356714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3568e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  ssize_t
3569e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    y;
3570e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3571e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  p=(const unsigned short *) pixels;
3572e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGR") == 0)
3573e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3574cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
35753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3576cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
35774c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
35783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3579cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
35803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3581e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3582e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3583e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3584ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
35853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
35863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
35873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
35883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3589e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
35903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3591e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRA") == 0)
35923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3593cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3594e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3595cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3596e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
35973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3598cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
35993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3600e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3601e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3602e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3603e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3604e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
36053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3606e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
36073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3608e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3609e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3610e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3611e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"BGRP") == 0)
3612e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3613cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
36143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3615cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
36164c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
36173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3618cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
36193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3620e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3621e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3622e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3623e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3624ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
36253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
36263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
36273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
36283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3629e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
36303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3631e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"I") == 0)
36323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
36332dc655d16d7bc2a04312bc00ad27139d7543b10ccristy      (void) SetImageColorspace(image,GRAYColorspace,exception);
3634cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3635e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3636cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3637e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
36383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3639cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
36403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3641e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGray(image,ScaleShortToQuantum(*p++),q);
3642e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
36433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3644e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
36453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3646e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3647e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3648e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3649e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGB") == 0)
3650e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3651cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3652e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3653cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3654e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
36553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3656cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
36573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3658e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3659e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3660e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3661e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
36623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3663e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
36643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3665e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3666e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3667e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3668e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBA") == 0)
3669e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3670cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
3671e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3672cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3673e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (q == (Quantum *) NULL)
36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3675cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
3676e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        {
3677e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3678e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3679e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3680e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3681e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          q+=GetPixelChannels(image);
36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3683e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3684e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          break;
3685e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3686e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
3687e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3688e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (LocaleCompare(map,"RGBP") == 0)
3689e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3690cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      for (y=0; y < (ssize_t) roi->height; y++)
36913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3692cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
36934c08aed51c5899665ade97263692328eea4af106cristy        if (q == (Quantum *) NULL)
36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3695cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy        for (x=0; x < (ssize_t) roi->width; x++)
36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3697e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3698e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3699e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3700e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          p++;
3701ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
37053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3706e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      return;
37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
370814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
3709cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  for (y=0; y < (ssize_t) roi->height; y++)
3710e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3711cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    q=GetAuthenticPixels(image,roi->x,roi->y+y,roi->width,1,exception);
3712e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (q == (Quantum *) NULL)
3713e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3714cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    for (x=0; x < (ssize_t) roi->width; x++)
37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3716e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      register ssize_t
3717e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        i;
37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
371914d712974a2c2cd2aebf8db11c7ca686bb67596fcristy      for (i=0; i < (ssize_t) length; i++)
3720e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3721e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        switch (quantum_map[i])
37223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3723e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case RedQuantum:
3724e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case CyanQuantum:
37253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3726e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelRed(image,ScaleShortToQuantum(*p),q);
3727e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3729e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case GreenQuantum:
3730e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case MagentaQuantum:
37313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3732e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGreen(image,ScaleShortToQuantum(*p),q);
3733e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3735e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlueQuantum:
3736e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case YellowQuantum:
37373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3738e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlue(image,ScaleShortToQuantum(*p),q);
3739e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3741e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case AlphaQuantum:
37423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3743e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3744e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3746e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case OpacityQuantum:
37473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3748e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3749e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3751e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case BlackQuantum:
37523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3753e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelBlack(image,ScaleShortToQuantum(*p),q);
3754e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3756e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          case IndexQuantum:
37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
3758e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            SetPixelGray(image,ScaleShortToQuantum(*p),q);
3759e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3761e5370944fabb7afa477ab1325d400731b1e5d5e8cristy          default:
3762e5370944fabb7afa477ab1325d400731b1e5d5e8cristy            break;
37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3764e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        p++;
3765e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3766e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      q+=GetPixelChannels(image);
3767e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3768e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    if (SyncAuthenticPixels(image,exception) == MagickFalse)
3769e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3770e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3771e5370944fabb7afa477ab1325d400731b1e5d5e8cristy}
3772e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3773cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristyMagickExport MagickBooleanType ImportImagePixels(Image *image,const ssize_t x,
3774cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const ssize_t y,const size_t width,const size_t height,const char *map,
3775cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  const StorageType type,const void *pixels,ExceptionInfo *exception)
3776e5370944fabb7afa477ab1325d400731b1e5d5e8cristy{
3777e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  QuantumType
3778e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    *quantum_map;
3779e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
3780cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  RectangleInfo
3781cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy    roi;
3782cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy
3783e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  register ssize_t
3784e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    i;
3785e5370944fabb7afa477ab1325d400731b1e5d5e8cristy
378614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  size_t
378714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy    length;
378814d712974a2c2cd2aebf8db11c7ca686bb67596fcristy
3789e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  /*
3790e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    Allocate image structure.
3791e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  */
3792e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image != (Image *) NULL);
3793e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  assert(image->signature == MagickSignature);
3794e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (image->debug != MagickFalse)
3795e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
379614d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  length=strlen(map);
379714d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
3798e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (quantum_map == (QuantumType *) NULL)
3799e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
3800e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      image->filename);
380114d712974a2c2cd2aebf8db11c7ca686bb67596fcristy  for (i=0; i < (ssize_t) length; i++)
3802e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3803e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    switch (map[i])
3804e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3805e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'a':
3806e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'A':
38073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
3808e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=AlphaQuantum;
3809e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        image->matte=MagickTrue;
3810e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3811e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3812e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'B':
3813e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'b':
3814e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3815e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlueQuantum;
3816e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3817e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3818e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'C':
3819e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'c':
3820e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3821e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=CyanQuantum;
3822e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
3823e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3824e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3825e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'g':
3826e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'G':
3827e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3828e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=GreenQuantum;
3829e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3830e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3831e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'K':
3832e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'k':
3833e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3834e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=BlackQuantum;
3835e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
3836e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3837e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3838e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'I':
3839e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'i':
3840e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3841e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=IndexQuantum;
3842e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3843e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3844e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'm':
3845e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'M':
3846e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3847e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=MagentaQuantum;
3848e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
3849e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3850e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3851e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'O':
3852e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'o':
3853e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3854e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=OpacityQuantum;
3855e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        image->matte=MagickTrue;
3856e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3857e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3858e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'P':
3859e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'p':
3860e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3861e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=UndefinedQuantum;
3862e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3863e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3864e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'R':
3865e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'r':
3866e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3867e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=RedQuantum;
3868e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
38693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3870e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'Y':
3871e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      case 'y':
3872e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3873e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map[i]=YellowQuantum;
3874e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) SetImageColorspace(image,CMYKColorspace,exception);
3875e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        break;
3876e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3877e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      default:
3878e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      {
3879e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3880e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
3881e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony          "UnrecognizedPixelMap","'%s'",map);
3882e5370944fabb7afa477ab1325d400731b1e5d5e8cristy        return(MagickFalse);
3883e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      }
3884e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3885e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  }
3886e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
3887e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    return(MagickFalse);
3888e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  /*
3889e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    Transfer the pixels from the pixel data to the image.
3890e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  */
3891cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.width=width;
3892cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.height=height;
3893cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.x=x;
3894cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy  roi.y=y;
3895e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  switch (type)
3896e5370944fabb7afa477ab1325d400731b1e5d5e8cristy  {
3897e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case CharPixel:
3898e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3899cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportCharPixel(image,&roi,map,quantum_map,pixels,exception);
3900e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3901e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3902e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case DoublePixel:
3903e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3904cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportDoublePixel(image,&roi,map,quantum_map,pixels,exception);
3905e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3906e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3907e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case FloatPixel:
3908e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3909cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportFloatPixel(image,&roi,map,quantum_map,pixels,exception);
3910e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3911e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
39126c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongPixel:
3913e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3914cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportLongPixel(image,&roi,map,quantum_map,pixels,exception);
3915e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3916e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
39176c9e168a2e888f62e1f6317a4d49f31678e0b70ccristy    case LongLongPixel:
3918e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3919cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportLongLongPixel(image,&roi,map,quantum_map,pixels,exception);
3920e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3921e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3922e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case QuantumPixel:
3923e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3924cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportQuantumPixel(image,&roi,map,quantum_map,pixels,exception);
3925e5370944fabb7afa477ab1325d400731b1e5d5e8cristy      break;
3926e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    }
3927e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    case ShortPixel:
3928e5370944fabb7afa477ab1325d400731b1e5d5e8cristy    {
3929cafe0412f81d4e5f1fafee6ab07019a1fe25e491cristy      ImportShortPixel(image,&roi,map,quantum_map,pixels,exception);
39303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
39313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
39323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
39333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3935c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
3936e5b39652d8d21bc3940d83b8d6088d4070a8a34aanthony        "UnrecognizedPixelMap","'%s'",map);
39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
39393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
39403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
39413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3943d76c51ed30cf4084f4434ba08925d16001d1e340cristy
3944d76c51ed30cf4084f4434ba08925d16001d1e340cristy/*
3945d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3946a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
3947a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
3948a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
3949bd5a96cd2b69f218f85a7adc306296a736f91a56cristy+   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                         %
3950bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
3951bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
3952bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
3953bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3954bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
3955bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  InitializePixelChannelMap() defines the standard pixel component map.
3956bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
3957bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  The format of the InitializePixelChannelMap() method is:
3958bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
3959bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      void InitializePixelChannelMap(Image *image)
3960bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
3961bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  A description of each parameter follows:
3962bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
3963bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%    o image: the image.
3964bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
3965bd5a96cd2b69f218f85a7adc306296a736f91a56cristy*/
3966e2a912b6c9086c98ec838baa0824cd8deca55538cristyMagickExport void InitializePixelChannelMap(Image *image)
396777c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy{
3968e2a912b6c9086c98ec838baa0824cd8deca55538cristy  PixelTrait
3969e2a912b6c9086c98ec838baa0824cd8deca55538cristy    trait;
3970e2a912b6c9086c98ec838baa0824cd8deca55538cristy
397177c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  register ssize_t
397277c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    i;
397377c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy
3974d26338ffb761a86f047d7bbb9a596800f53c8649cristy  ssize_t
397577c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    n;
397677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy
397777c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  assert(image != (Image *) NULL);
397877c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  assert(image->signature == MagickSignature);
3979e2a912b6c9086c98ec838baa0824cd8deca55538cristy  (void) ResetMagickMemory(image->channel_map,0,MaxPixelChannels*
3980e2a912b6c9086c98ec838baa0824cd8deca55538cristy    sizeof(*image->channel_map));
3981e2a912b6c9086c98ec838baa0824cd8deca55538cristy  trait=UpdatePixelTrait;
3982e2a912b6c9086c98ec838baa0824cd8deca55538cristy  if (image->matte != MagickFalse)
398361f18adcc41fdd05d57e50544cdb9d321bb18953cristy    trait=(PixelTrait) (trait | BlendPixelTrait);
398477c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  n=0;
3985c06c58036e12a41593f1c7a984f1fdb4e9cc434bcristy  if (image->colorspace == GRAYColorspace)
398677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    {
39873c3162882db2814a5b709072cd03b8d18c80d6afcristy      SetPixelChannelMap(image,BluePixelChannel,trait,n);
3988e2a912b6c9086c98ec838baa0824cd8deca55538cristy      SetPixelChannelMap(image,GreenPixelChannel,trait,n);
39893c3162882db2814a5b709072cd03b8d18c80d6afcristy      SetPixelChannelMap(image,RedPixelChannel,trait,n++);
39903c3162882db2814a5b709072cd03b8d18c80d6afcristy    }
39913c3162882db2814a5b709072cd03b8d18c80d6afcristy  else
39923c3162882db2814a5b709072cd03b8d18c80d6afcristy    {
39933c3162882db2814a5b709072cd03b8d18c80d6afcristy      SetPixelChannelMap(image,RedPixelChannel,trait,n++);
39943c3162882db2814a5b709072cd03b8d18c80d6afcristy      SetPixelChannelMap(image,GreenPixelChannel,trait,n++);
3995e2a912b6c9086c98ec838baa0824cd8deca55538cristy      SetPixelChannelMap(image,BluePixelChannel,trait,n++);
399677c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy    }
399777c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  if (image->colorspace == CMYKColorspace)
3998e2a912b6c9086c98ec838baa0824cd8deca55538cristy    SetPixelChannelMap(image,BlackPixelChannel,trait,n++);
399977c30f505b9ddf45ec96709ab5ebcb7a10f96d4acristy  if (image->matte != MagickFalse)
4000e2a912b6c9086c98ec838baa0824cd8deca55538cristy    SetPixelChannelMap(image,AlphaPixelChannel,CopyPixelTrait,n++);
4001bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  if (image->storage_class == PseudoClass)
4002e2a912b6c9086c98ec838baa0824cd8deca55538cristy    SetPixelChannelMap(image,IndexPixelChannel,CopyPixelTrait,n++);
4003183a5c7d1c8a9a747766ff9a2ef067853a7066e9cristy  if (image->mask != MagickFalse)
400410a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy    SetPixelChannelMap(image,MaskPixelChannel,CopyPixelTrait,n++);
4005e2a912b6c9086c98ec838baa0824cd8deca55538cristy  assert((n+image->number_meta_channels) < MaxPixelChannels);
4006e2a912b6c9086c98ec838baa0824cd8deca55538cristy  for (i=0; i < (ssize_t) image->number_meta_channels; i++)
400761f18adcc41fdd05d57e50544cdb9d321bb18953cristy    SetPixelChannelMap(image,(PixelChannel) (MetaPixelChannel+i),CopyPixelTrait,
4008e2a912b6c9086c98ec838baa0824cd8deca55538cristy      n++);
4009d26338ffb761a86f047d7bbb9a596800f53c8649cristy  image->number_channels=(size_t) n;
40106dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy  if (image->debug != MagickFalse)
40116dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy    LogPixelChannels(image);
4012480f49ff5341726eb0212f2f1f22cfdefac392c4cristy  (void) SetPixelChannelMask(image,image->channel_mask);
4013bd5a96cd2b69f218f85a7adc306296a736f91a56cristy}
4014bd5a96cd2b69f218f85a7adc306296a736f91a56cristy
4015bd5a96cd2b69f218f85a7adc306296a736f91a56cristy/*
4016bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4017bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4018bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4019bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%                                                                             %
4020a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%   I n t e r p o l a t e P i x e l C h a n n e l                             %
4021a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4022a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4023a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%                                                                             %
4024a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4025a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4026884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  InterpolatePixelChannel() applies a pixel interpolation method between a
4027884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
4028884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  pixel area resampling, or scaling of the result is performed.
4029a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4030cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just the specified channel.
4031cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
4032a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%  The format of the InterpolatePixelChannel method is:
4033a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4034a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%      MagickBooleanType InterpolatePixelChannel(const Image *image,
4035444eda6285b2191e662c3d375c86770da70a83b0cristy%        const CacheView *image_view,const PixelChannel channel,
40365c4e2586d27d4299a742d170d41105de1689aa46cristy%        const PixelInterpolateMethod method,const double x,const double y,
4037a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%        double *pixel,ExceptionInfo *exception)
4038a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4039a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%  A description of each parameter follows:
4040a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4041a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o image: the image.
4042a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4043a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o image_view: the image view.
4044a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4045a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o channel: the pixel channel to interpolate.
4046a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4047a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o method: the pixel color interpolation method.
4048a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4049a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o x,y: A double representing the current (x,y) position of the pixel.
4050a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4051a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o pixel: return the interpolated pixel here.
4052a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4053a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%    o exception: return any errors or warnings in this structure.
4054a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%
4055a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy*/
405694ea1636709395774d7118ef56162d211904cfd2cristy
4057884f600898ca6935a7981b4d56bf3d2c4ec17011cristystatic inline double MagickMax(const MagickRealType x,const MagickRealType y)
4058884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{
4059884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  if (x > y)
4060884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    return(x);
4061884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  return(y);
4062884f600898ca6935a7981b4d56bf3d2c4ec17011cristy}
4063884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4064d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolasstatic inline void CatromWeights(const MagickRealType x,
4065d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  MagickRealType (*weights)[4])
4066884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{
4067d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  /*
4068d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    Nicolas Robidoux' 10 flops (4* + 5- + 1+) refactoring of the
4069d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    computation of the standard four 1D Catmull-Rom weights. The
4070d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    sampling location is assumed between the second and third input
4071d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    pixel locations, and x is the position relative to the second
4072d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    input pixel location. Formulas originally derived for the VIPS
4073d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    (Virtual Image Processing System) library.
4074d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  */
4075884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  MagickRealType
4076884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    alpha,
4077d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    beta,
4078884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    gamma;
4079884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4080d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  alpha=(MagickRealType) 1.0-x;
4081d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  beta=(MagickRealType) (-0.5)*x*alpha;
4082d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[0]=alpha*beta;
4083d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[3]=x*beta;
4084d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  /*
4085d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    The following computation of the inner weights from the outer ones
4086d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    works for all Keys cubics.
4087d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  */
4088d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  gamma=(*weights)[3]-(*weights)[0];
4089d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[1]=alpha-(*weights)[0]+gamma;
4090d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[2]=x-(*weights)[3]-gamma;
4091d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas}
4092d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas
4093d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolasstatic inline void SplineWeights(const MagickRealType x,
4094d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  MagickRealType (*weights)[4])
4095d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas{
4096d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  /*
4097d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    Nicolas Robidoux' 12 flops (6* + 5- + 1+) refactoring of the
4098d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    computation of the standard four 1D cubic B-spline smoothing
4099d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    weights. The sampling location is assumed between the second and
4100d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    third input pixel locations, and x is the position relative to the
4101d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    second input pixel location.
4102d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  */
4103d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  MagickRealType
4104d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    alpha,
4105d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas    beta;
4106d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas
4107d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  alpha=(MagickRealType) 1.0-x;
4108d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[3]=(MagickRealType) (1.0/6.0)*x*x*x;
4109d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[0]=(MagickRealType) (1.0/6.0)*alpha*alpha*alpha;
4110d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  beta=(*weights)[3]-(*weights)[0];
4111d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[1]=alpha-(*weights)[0]+beta;
4112d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas  (*weights)[2]=x-(*weights)[3]-beta;
4113884f600898ca6935a7981b4d56bf3d2c4ec17011cristy}
4114884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
411594ea1636709395774d7118ef56162d211904cfd2cristystatic inline double MeshInterpolate(const PointInfo *delta,const double p,
411694ea1636709395774d7118ef56162d211904cfd2cristy  const double x,const double y)
411794ea1636709395774d7118ef56162d211904cfd2cristy{
411894ea1636709395774d7118ef56162d211904cfd2cristy  return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
411994ea1636709395774d7118ef56162d211904cfd2cristy}
412094ea1636709395774d7118ef56162d211904cfd2cristy
4121cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony/*
4122884f600898ca6935a7981b4d56bf3d2c4ec17011cristystatic inline ssize_t NearestNeighbor(const MagickRealType x)
4123884f600898ca6935a7981b4d56bf3d2c4ec17011cristy{
4124884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  if (x >= 0.0)
4125884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    return((ssize_t) (x+0.5));
4126884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  return((ssize_t) (x-0.5));
4127884f600898ca6935a7981b4d56bf3d2c4ec17011cristy}
4128cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony*/
4129884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4130a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristyMagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
4131a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  const CacheView *image_view,const PixelChannel channel,
41325c4e2586d27d4299a742d170d41105de1689aa46cristy  const PixelInterpolateMethod method,const double x,const double y,
4133a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  double *pixel,ExceptionInfo *exception)
4134a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy{
4135a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  MagickBooleanType
4136a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    status;
4137a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy
413894ea1636709395774d7118ef56162d211904cfd2cristy  MagickRealType
413994ea1636709395774d7118ef56162d211904cfd2cristy    alpha[16],
4140884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    gamma,
4141884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    pixels[16];
414294ea1636709395774d7118ef56162d211904cfd2cristy
414394ea1636709395774d7118ef56162d211904cfd2cristy  PixelTrait
414494ea1636709395774d7118ef56162d211904cfd2cristy    traits;
414594ea1636709395774d7118ef56162d211904cfd2cristy
414694ea1636709395774d7118ef56162d211904cfd2cristy  register const Quantum
414794ea1636709395774d7118ef56162d211904cfd2cristy    *p;
414894ea1636709395774d7118ef56162d211904cfd2cristy
414950e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
415094ea1636709395774d7118ef56162d211904cfd2cristy    i;
415194ea1636709395774d7118ef56162d211904cfd2cristy
4152a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  ssize_t
4153a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    x_offset,
4154a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    y_offset;
4155a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy
4156cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  PixelInterpolateMethod
4157cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate;
4158cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4159a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image != (Image *) NULL);
4160a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image != (Image *) NULL);
4161a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image->signature == MagickSignature);
4162a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  assert(image_view != (CacheView *) NULL);
4163a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  status=MagickTrue;
4164884f600898ca6935a7981b4d56bf3d2c4ec17011cristy  *pixel=0.0;
416594ea1636709395774d7118ef56162d211904cfd2cristy  traits=GetPixelChannelMapTraits(image,channel);
4166a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  x_offset=(ssize_t) floor(x);
4167a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  y_offset=(ssize_t) floor(y);
4168cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  interpolate = method;
4169cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  if ( interpolate == UndefinedInterpolatePixel )
4170cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate = image->interpolate;
4171cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
4172a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  {
4173cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case AverageInterpolatePixel:        /* nearest 4 neighbours */
4174cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case Average9InterpolatePixel:       /* nearest 9 neighbours */
4175cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case Average16InterpolatePixel:      /* nearest 16 neighbours */
4176884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4177cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      size_t
4178cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        count=2; /* size of the area to average - default nearest 4 */
4179cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4180cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
4181cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4182cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
4183cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
4184cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
4185cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4186cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else if (interpolate == Average16InterpolatePixel)
4187cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4188cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=4;
4189cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset--;
4190cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset--;
4191cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4192cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,count,count,
4193884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        exception);
4194884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4195884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4196884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4197884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4198884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4199cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4200cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      count*=count;   /* Number of pixels to Average */
4201222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
420250e64b85215ce366ca50af1ba16326c784221f92cristy        for (i=0; i < (ssize_t) count; i++)
4203884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4204884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4205884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4206884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4207884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
420850e64b85215ce366ca50af1ba16326c784221f92cristy        for (i=0; i < (ssize_t) count; i++)
4209884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4210884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4211884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4212884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4213884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
421450e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) count; i++)
4215884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      {
4216cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        gamma=MagickEpsilonReciprocal(alpha[i])/count;
4217cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        *pixel+=gamma*pixels[i];
4218884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      }
4219884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4220884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4221cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
4222cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
4223cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
4224cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      PointInfo
4225cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta,
4226cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon;
4227cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4228cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4229cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
4230cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4231cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
4232cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
4233cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4234cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if ((traits & BlendPixelTrait) == 0)
4235cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        for (i=0; i < 4; i++)
4236cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4237cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]=1.0;
4238cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4239cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4240cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else
4241cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        for (i=0; i < 4; i++)
4242cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4243cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4244cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            GetPixelChannels(image));
4245cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4246cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4247cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.x=x-x_offset;
4248cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.y=y-y_offset;
4249cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.x=1.0-delta.x;
4250cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.y=1.0-delta.y;
4251cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4252cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*alpha[2]+delta.x*alpha[3])));
4253cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=MagickEpsilonReciprocal(gamma);
4254cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*
4255cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*pixels[2]+delta.x*pixels[3]));
4256cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
4257cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
4258cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
4259884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4260884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      MagickRealType
4261380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
42626676f5a461ba75c5f4a927218cb3577dd29d70aenicolas        cy[4];
4263884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4264884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4265884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        exception);
4266884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4267884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4268884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4269884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4270884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4271222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
4272884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4273884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4274884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4275884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4276884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4277884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
4278884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4279884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4280884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4281884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4282884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4283884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4284d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      CatromWeights((MagickRealType) (x-x_offset),&cx);
4285d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      CatromWeights((MagickRealType) (y-y_offset),&cy);
4286d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      gamma=(channel == AlphaPixelChannel ? (MagickRealType) 1.0 :
4287d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4288d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4289d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4290d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4291d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*alpha[14]+cx[3]*alpha[15])));
4292380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4293d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4294d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4295d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4296d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4297884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4298884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4299cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony#if 0
430020075dc279f25ae4cc7291a7e54f076a61a1f068nicolas    /* deprecated useless and very slow interpolator */
4301884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case FilterInterpolatePixel:
4302884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4303884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      CacheView
4304884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        *filter_view;
4305884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4306884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      Image
4307884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        *excerpt_image,
4308884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        *filter_image;
4309884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4310884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      RectangleInfo
4311884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        geometry;
4312884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4313884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      geometry.width=4L;
4314884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      geometry.height=4L;
4315884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      geometry.x=x_offset-1;
4316884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      geometry.y=y_offset-1;
4317884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      excerpt_image=ExcerptImage(image,&geometry,exception);
4318884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (excerpt_image == (Image *) NULL)
4319884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4320884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4321884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4322884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4323aa2c16cb5e695053aa78e40f66bc36fbef4b1ed1cristy      filter_image=ResizeImage(excerpt_image,1,1,image->filter,exception);
4324884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      excerpt_image=DestroyImage(excerpt_image);
4325884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (filter_image == (Image *) NULL)
4326884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        break;
4327db070957cf6bf959df9283a482377e8854c3d4d2cristy      filter_view=AcquireVirtualCacheView(filter_image,exception);
4328884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4329884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4330884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        status=MagickFalse;
4331884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
43320beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy        *pixel=(double) GetPixelChannel(image,channel,p);
4333884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      filter_view=DestroyCacheView(filter_view);
4334884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      filter_image=DestroyImage(filter_image);
4335884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4336884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4337cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony#endif
4338884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case IntegerInterpolatePixel:
4339884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4340884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4341884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4342884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4343884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4344884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4345884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
43460beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy      *pixel=(double) GetPixelChannel(image,channel,p);
4347884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4348884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4349cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
4350884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4351cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
4352cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
4353cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4354884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4355884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4356884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4357884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4358884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
43590beccfa61f43782de2d6ee7edc1ec8301a3bbeeccristy      *pixel=(double) GetPixelChannel(image,channel,p);
4360884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4361884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4362884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case MeshInterpolatePixel:
4363884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4364884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      PointInfo
4365884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        delta,
4366884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        luminance;
4367884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4368884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4369884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4370884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4371884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4372884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4373884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4374222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
437594ea1636709395774d7118ef56162d211904cfd2cristy        for (i=0; i < 4; i++)
437694ea1636709395774d7118ef56162d211904cfd2cristy        {
437794ea1636709395774d7118ef56162d211904cfd2cristy          alpha[i]=1.0;
4378884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
437994ea1636709395774d7118ef56162d211904cfd2cristy        }
438094ea1636709395774d7118ef56162d211904cfd2cristy      else
438194ea1636709395774d7118ef56162d211904cfd2cristy        for (i=0; i < 4; i++)
438294ea1636709395774d7118ef56162d211904cfd2cristy        {
438394ea1636709395774d7118ef56162d211904cfd2cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
438494ea1636709395774d7118ef56162d211904cfd2cristy            GetPixelChannels(image));
438594ea1636709395774d7118ef56162d211904cfd2cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
438694ea1636709395774d7118ef56162d211904cfd2cristy        }
4387884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      delta.x=x-x_offset;
4388884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      delta.y=y-y_offset;
4389884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      luminance.x=GetPixelLuminance(image,p)-(double)
4390884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        GetPixelLuminance(image,p+3*GetPixelChannels(image));
439128474bfbda5ee2d4da2eb79f299cf1f692770b99cristy      luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4392884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        GetPixelLuminance(image,p+2*GetPixelChannels(image));
439394ea1636709395774d7118ef56162d211904cfd2cristy      if (fabs(luminance.x) < fabs(luminance.y))
439494ea1636709395774d7118ef56162d211904cfd2cristy        {
439594ea1636709395774d7118ef56162d211904cfd2cristy          /*
439694ea1636709395774d7118ef56162d211904cfd2cristy            Diagonal 0-3 NW-SE.
439794ea1636709395774d7118ef56162d211904cfd2cristy          */
439894ea1636709395774d7118ef56162d211904cfd2cristy          if (delta.x <= delta.y)
439994ea1636709395774d7118ef56162d211904cfd2cristy            {
440094ea1636709395774d7118ef56162d211904cfd2cristy              /*
440194ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-left triangle (pixel: 2, diagonal: 0-3).
440294ea1636709395774d7118ef56162d211904cfd2cristy              */
440394ea1636709395774d7118ef56162d211904cfd2cristy              delta.y=1.0-delta.y;
440494ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4405c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
440694ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3],
440794ea1636709395774d7118ef56162d211904cfd2cristy                pixels[0]);
440894ea1636709395774d7118ef56162d211904cfd2cristy            }
440994ea1636709395774d7118ef56162d211904cfd2cristy          else
441094ea1636709395774d7118ef56162d211904cfd2cristy            {
441194ea1636709395774d7118ef56162d211904cfd2cristy              /*
441294ea1636709395774d7118ef56162d211904cfd2cristy                Top-right triangle (pixel: 1, diagonal: 0-3).
441394ea1636709395774d7118ef56162d211904cfd2cristy              */
441494ea1636709395774d7118ef56162d211904cfd2cristy              delta.x=1.0-delta.x;
441594ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4416c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
441794ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0],
441894ea1636709395774d7118ef56162d211904cfd2cristy                pixels[3]);
441994ea1636709395774d7118ef56162d211904cfd2cristy            }
442094ea1636709395774d7118ef56162d211904cfd2cristy        }
442194ea1636709395774d7118ef56162d211904cfd2cristy      else
442294ea1636709395774d7118ef56162d211904cfd2cristy        {
442394ea1636709395774d7118ef56162d211904cfd2cristy          /*
442494ea1636709395774d7118ef56162d211904cfd2cristy            Diagonal 1-2 NE-SW.
442594ea1636709395774d7118ef56162d211904cfd2cristy          */
442694ea1636709395774d7118ef56162d211904cfd2cristy          if (delta.x <= (1.0-delta.y))
442794ea1636709395774d7118ef56162d211904cfd2cristy            {
442894ea1636709395774d7118ef56162d211904cfd2cristy              /*
442994ea1636709395774d7118ef56162d211904cfd2cristy                Top-left triangle (pixel: 0, diagonal: 1-2).
443094ea1636709395774d7118ef56162d211904cfd2cristy              */
443194ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4432c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
443394ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1],
443494ea1636709395774d7118ef56162d211904cfd2cristy                pixels[2]);
443594ea1636709395774d7118ef56162d211904cfd2cristy            }
443694ea1636709395774d7118ef56162d211904cfd2cristy          else
443794ea1636709395774d7118ef56162d211904cfd2cristy            {
443894ea1636709395774d7118ef56162d211904cfd2cristy              /*
443994ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-right triangle (pixel: 3, diagonal: 1-2).
444094ea1636709395774d7118ef56162d211904cfd2cristy              */
444194ea1636709395774d7118ef56162d211904cfd2cristy              delta.x=1.0-delta.x;
444294ea1636709395774d7118ef56162d211904cfd2cristy              delta.y=1.0-delta.y;
444394ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4444c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
444594ea1636709395774d7118ef56162d211904cfd2cristy              *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2],
444694ea1636709395774d7118ef56162d211904cfd2cristy                pixels[1]);
444794ea1636709395774d7118ef56162d211904cfd2cristy            }
444894ea1636709395774d7118ef56162d211904cfd2cristy        }
4449a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy      break;
4450a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy    }
4451884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    case SplineInterpolatePixel:
4452884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    {
4453884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      MagickRealType
4454d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
44556676f5a461ba75c5f4a927218cb3577dd29d70aenicolas        cy[4];
4456884f600898ca6935a7981b4d56bf3d2c4ec17011cristy
4457884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4458884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        exception);
4459884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      if (p == (const Quantum *) NULL)
4460884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4461884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          status=MagickFalse;
4462884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          break;
4463884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4464222b19c8e5e5ee5287e41d33fea54f2b651741b6cristy      if ((traits & BlendPixelTrait) == 0)
4465884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4466884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4467884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=1.0;
4468884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4469884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4470884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      else
4471884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        for (i=0; i < 16; i++)
4472884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        {
4473884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4474884f600898ca6935a7981b4d56bf3d2c4ec17011cristy            GetPixelChannels(image));
4475884f600898ca6935a7981b4d56bf3d2c4ec17011cristy          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4476884f600898ca6935a7981b4d56bf3d2c4ec17011cristy        }
4477d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      SplineWeights((MagickRealType) (x-x_offset),&cx);
4478d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      SplineWeights((MagickRealType) (y-y_offset),&cy);
4479d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      gamma=(channel == AlphaPixelChannel ? (MagickRealType) 1.0 :
4480d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4481d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4482d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4483d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4484d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*alpha[14]+cx[3]*alpha[15])));
4485d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      *pixel=gamma*(cy[0]*(cx[0]*pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+
4486d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[3]*pixels[3])+cy[1]*(cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*
4487d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[6]+cx[3]*pixels[7])+cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+
4488d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[2]*pixels[10]+cx[3]*pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*
4489d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13]+cx[2]*pixels[14]+cx[3]*pixels[15]));
4490884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      break;
4491884f600898ca6935a7981b4d56bf3d2c4ec17011cristy    }
4492a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  }
4493a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy  return(status);
4494a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy}
4495a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy
4496a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy/*
4497a085a43d43f06b9c2675020a1d7126ebbaebfd7bcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4498d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
4499d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
4500d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
45015c4e2586d27d4299a742d170d41105de1689aa46cristy%   I n t e r p o l a t e P i x e l C h a n n e l s                           %
45025c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
45035c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
45045c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
45055c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45065c4e2586d27d4299a742d170d41105de1689aa46cristy%
45075c4e2586d27d4299a742d170d41105de1689aa46cristy%  InterpolatePixelChannels() applies a pixel interpolation method between a
45085c4e2586d27d4299a742d170d41105de1689aa46cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
45095c4e2586d27d4299a742d170d41105de1689aa46cristy%  pixel area resampling, or scaling of the result is performed.
45105c4e2586d27d4299a742d170d41105de1689aa46cristy%
4511cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just the current channel setting of the
4512cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  destination image into which the color is to be stored
4513cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
45145c4e2586d27d4299a742d170d41105de1689aa46cristy%  The format of the InterpolatePixelChannels method is:
45155c4e2586d27d4299a742d170d41105de1689aa46cristy%
45165c4e2586d27d4299a742d170d41105de1689aa46cristy%      MagickBooleanType InterpolatePixelChannels(const Image *source,
45175c4e2586d27d4299a742d170d41105de1689aa46cristy%        const CacheView *source_view,const Image *destination,
45185c4e2586d27d4299a742d170d41105de1689aa46cristy%        const PixelInterpolateMethod method,const double x,const double y,
45195c4e2586d27d4299a742d170d41105de1689aa46cristy%        Quantum *pixel,ExceptionInfo *exception)
45205c4e2586d27d4299a742d170d41105de1689aa46cristy%
45215c4e2586d27d4299a742d170d41105de1689aa46cristy%  A description of each parameter follows:
45225c4e2586d27d4299a742d170d41105de1689aa46cristy%
45235c4e2586d27d4299a742d170d41105de1689aa46cristy%    o source: the source.
45245c4e2586d27d4299a742d170d41105de1689aa46cristy%
45255c4e2586d27d4299a742d170d41105de1689aa46cristy%    o source_view: the source view.
45265c4e2586d27d4299a742d170d41105de1689aa46cristy%
4527cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%    o destination: the destination image, for the interpolated color
45285c4e2586d27d4299a742d170d41105de1689aa46cristy%
45295c4e2586d27d4299a742d170d41105de1689aa46cristy%    o method: the pixel color interpolation method.
45305c4e2586d27d4299a742d170d41105de1689aa46cristy%
45315c4e2586d27d4299a742d170d41105de1689aa46cristy%    o x,y: A double representing the current (x,y) position of the pixel.
45325c4e2586d27d4299a742d170d41105de1689aa46cristy%
45335c4e2586d27d4299a742d170d41105de1689aa46cristy%    o pixel: return the interpolated pixel here.
45345c4e2586d27d4299a742d170d41105de1689aa46cristy%
45355c4e2586d27d4299a742d170d41105de1689aa46cristy%    o exception: return any errors or warnings in this structure.
45365c4e2586d27d4299a742d170d41105de1689aa46cristy%
45375c4e2586d27d4299a742d170d41105de1689aa46cristy*/
45385c4e2586d27d4299a742d170d41105de1689aa46cristyMagickExport MagickBooleanType InterpolatePixelChannels(const Image *source,
45395c4e2586d27d4299a742d170d41105de1689aa46cristy  const CacheView *source_view,const Image *destination,
45405c4e2586d27d4299a742d170d41105de1689aa46cristy  const PixelInterpolateMethod method,const double x,const double y,
45415c4e2586d27d4299a742d170d41105de1689aa46cristy  Quantum *pixel,ExceptionInfo *exception)
45425c4e2586d27d4299a742d170d41105de1689aa46cristy{
45435c4e2586d27d4299a742d170d41105de1689aa46cristy  MagickBooleanType
45445c4e2586d27d4299a742d170d41105de1689aa46cristy    status;
45455c4e2586d27d4299a742d170d41105de1689aa46cristy
45465c4e2586d27d4299a742d170d41105de1689aa46cristy  MagickRealType
45475c4e2586d27d4299a742d170d41105de1689aa46cristy    alpha[16],
45485c4e2586d27d4299a742d170d41105de1689aa46cristy    gamma,
45495c4e2586d27d4299a742d170d41105de1689aa46cristy    pixels[16];
45505c4e2586d27d4299a742d170d41105de1689aa46cristy
45515c4e2586d27d4299a742d170d41105de1689aa46cristy  PixelChannel
45525c4e2586d27d4299a742d170d41105de1689aa46cristy    channel;
45535c4e2586d27d4299a742d170d41105de1689aa46cristy
45545c4e2586d27d4299a742d170d41105de1689aa46cristy  PixelTrait
45555c4e2586d27d4299a742d170d41105de1689aa46cristy    destination_traits,
45565c4e2586d27d4299a742d170d41105de1689aa46cristy    traits;
45575c4e2586d27d4299a742d170d41105de1689aa46cristy
45585c4e2586d27d4299a742d170d41105de1689aa46cristy  register const Quantum
45595c4e2586d27d4299a742d170d41105de1689aa46cristy    *p;
45605c4e2586d27d4299a742d170d41105de1689aa46cristy
456150e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
45625c4e2586d27d4299a742d170d41105de1689aa46cristy    i;
45635c4e2586d27d4299a742d170d41105de1689aa46cristy
45645c4e2586d27d4299a742d170d41105de1689aa46cristy  ssize_t
45655c4e2586d27d4299a742d170d41105de1689aa46cristy    x_offset,
45665c4e2586d27d4299a742d170d41105de1689aa46cristy    y_offset;
45675c4e2586d27d4299a742d170d41105de1689aa46cristy
4568cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  PixelInterpolateMethod
4569cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate;
4570cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
45715c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source != (Image *) NULL);
45725c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source != (Image *) NULL);
45735c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source->signature == MagickSignature);
45745c4e2586d27d4299a742d170d41105de1689aa46cristy  assert(source_view != (CacheView *) NULL);
45755c4e2586d27d4299a742d170d41105de1689aa46cristy  status=MagickTrue;
45765c4e2586d27d4299a742d170d41105de1689aa46cristy  x_offset=(ssize_t) floor(x);
45775c4e2586d27d4299a742d170d41105de1689aa46cristy  y_offset=(ssize_t) floor(y);
4578cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  interpolate = method;
4579cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  if ( interpolate == UndefinedInterpolatePixel )
4580cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate = source->interpolate;
4581cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
45825c4e2586d27d4299a742d170d41105de1689aa46cristy  {
4583cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case AverageInterpolatePixel:        /* nearest 4 neighbours */
4584cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case Average9InterpolatePixel:       /* nearest 9 neighbours */
4585cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case Average16InterpolatePixel:      /* nearest 16 neighbours */
45865c4e2586d27d4299a742d170d41105de1689aa46cristy    {
4587cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      size_t
4588cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        count=2; /* size of the area to average - default nearest 4 */
4589cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4590cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
4591cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4592cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
4593cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
4594cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
4595cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4596cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else if (interpolate == Average16InterpolatePixel)
4597cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4598cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=4;
4599cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset--;
4600cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset--;
4601cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
4602cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,count,count,
46035c4e2586d27d4299a742d170d41105de1689aa46cristy        exception);
46045c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
46055c4e2586d27d4299a742d170d41105de1689aa46cristy        {
46065c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
46075c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
46085c4e2586d27d4299a742d170d41105de1689aa46cristy        }
4609cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      count*=count;   /* Number of pixels to Average */
461050e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
46115c4e2586d27d4299a742d170d41105de1689aa46cristy      {
46125c4e2586d27d4299a742d170d41105de1689aa46cristy        double
46135c4e2586d27d4299a742d170d41105de1689aa46cristy          sum;
46145c4e2586d27d4299a742d170d41105de1689aa46cristy
461550e64b85215ce366ca50af1ba16326c784221f92cristy        register ssize_t
46165c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
46175c4e2586d27d4299a742d170d41105de1689aa46cristy
4618e2a912b6c9086c98ec838baa0824cd8deca55538cristy        channel=GetPixelChannelMapChannel(source,i);
4619abace416e67464ca6dac2324410667b05076a9c2cristy        traits=GetPixelChannelMapTraits(source,channel);
46205c4e2586d27d4299a742d170d41105de1689aa46cristy        destination_traits=GetPixelChannelMapTraits(destination,channel);
46215c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
46225c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
46235c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
462450e64b85215ce366ca50af1ba16326c784221f92cristy        for (j=0; j < (ssize_t) count; j++)
46255c4e2586d27d4299a742d170d41105de1689aa46cristy          pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
46264a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        sum=0.0;
46275c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
46285c4e2586d27d4299a742d170d41105de1689aa46cristy          {
462950e64b85215ce366ca50af1ba16326c784221f92cristy            for (j=0; j < (ssize_t) count; j++)
4630cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              sum+=pixels[j];
4631cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            sum/=count;
46324a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy            SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
46335c4e2586d27d4299a742d170d41105de1689aa46cristy            continue;
46345c4e2586d27d4299a742d170d41105de1689aa46cristy          }
463550e64b85215ce366ca50af1ba16326c784221f92cristy        for (j=0; j < (ssize_t) count; j++)
46365c4e2586d27d4299a742d170d41105de1689aa46cristy        {
46375c4e2586d27d4299a742d170d41105de1689aa46cristy          alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
46385c4e2586d27d4299a742d170d41105de1689aa46cristy            GetPixelChannels(source));
46395c4e2586d27d4299a742d170d41105de1689aa46cristy          pixels[j]*=alpha[j];
4640c58380ae9cfade8bdda88414145d2ef44b13348fcristy          gamma=MagickEpsilonReciprocal(alpha[j]);
4641cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          sum+=gamma*pixels[j];
46425c4e2586d27d4299a742d170d41105de1689aa46cristy        }
4643cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        sum/=count;
46444a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
46455c4e2586d27d4299a742d170d41105de1689aa46cristy      }
46465c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
46475c4e2586d27d4299a742d170d41105de1689aa46cristy    }
4648cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
4649cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
4650cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
4651cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4652cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
4653cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
4654cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
4655cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
4656cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
465750e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4658cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      {
4659cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        PointInfo
4660cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          delta,
4661cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          epsilon;
4662cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
4663cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        channel=GetPixelChannelMapChannel(source,i);
4664cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        traits=GetPixelChannelMapTraits(source,channel);
4665cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        destination_traits=GetPixelChannelMapTraits(destination,channel);
4666cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if ((traits == UndefinedPixelTrait) ||
4667cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            (destination_traits == UndefinedPixelTrait))
4668cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          continue;
4669cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta.x=x-x_offset;
4670cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta.y=y-y_offset;
4671cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon.x=1.0-delta.x;
4672cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon.y=1.0-delta.y;
4673cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0]=(MagickRealType) p[i];
4674cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
4675cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
4676cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
4677cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if ((traits & BlendPixelTrait) == 0)
4678cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          {
4679cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4680cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            gamma=MagickEpsilonReciprocal(gamma);
4681cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4682cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*
4683cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              pixels[2]+delta.x*pixels[3]))),pixel);
4684cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony            continue;
4685cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          }
4686cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4687cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source));
4688cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4689cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          GetPixelChannels(source));
4690cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4691cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          GetPixelChannels(source));
4692cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0]*=alpha[0];
4693cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1]*=alpha[1];
4694cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[2]*=alpha[2];
4695cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3]*=alpha[3];
4696cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4697cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          (epsilon.x*alpha[2]+delta.x*alpha[3])));
4698cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        gamma=MagickEpsilonReciprocal(gamma);
4699cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4700cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+
4701cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          delta.x*pixels[3]))),pixel);
4702cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
4703cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
4704cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
4705cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
47065c4e2586d27d4299a742d170d41105de1689aa46cristy    {
47075c4e2586d27d4299a742d170d41105de1689aa46cristy      MagickRealType
4708380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
4709380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cy[4];
47105c4e2586d27d4299a742d170d41105de1689aa46cristy
47115c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
47125c4e2586d27d4299a742d170d41105de1689aa46cristy        exception);
47135c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
47145c4e2586d27d4299a742d170d41105de1689aa46cristy        {
47155c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
47165c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
47175c4e2586d27d4299a742d170d41105de1689aa46cristy        }
471850e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
47195c4e2586d27d4299a742d170d41105de1689aa46cristy      {
47205c4e2586d27d4299a742d170d41105de1689aa46cristy        register ssize_t
47215c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
47225c4e2586d27d4299a742d170d41105de1689aa46cristy
4723e2a912b6c9086c98ec838baa0824cd8deca55538cristy        channel=GetPixelChannelMapChannel(source,i);
4724abace416e67464ca6dac2324410667b05076a9c2cristy        traits=GetPixelChannelMapTraits(source,channel);
47255c4e2586d27d4299a742d170d41105de1689aa46cristy        destination_traits=GetPixelChannelMapTraits(destination,channel);
47265c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
47275c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
47285c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
47295c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
47305c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
47315c4e2586d27d4299a742d170d41105de1689aa46cristy          {
47325c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=1.0;
47335c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
47345c4e2586d27d4299a742d170d41105de1689aa46cristy          }
47355c4e2586d27d4299a742d170d41105de1689aa46cristy        else
47365c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
47375c4e2586d27d4299a742d170d41105de1689aa46cristy          {
47385c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
47395c4e2586d27d4299a742d170d41105de1689aa46cristy              GetPixelChannels(source));
47405c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
47415c4e2586d27d4299a742d170d41105de1689aa46cristy          }
4742d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        CatromWeights((MagickRealType) (x-x_offset),&cx);
4743d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        CatromWeights((MagickRealType) (y-y_offset),&cy);
4744d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        gamma=((traits & BlendPixelTrait) ? (MagickRealType) (1.0) :
4745d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
4746d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
4747d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
4748d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
4749d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cx[2]*alpha[14]+cx[3]*alpha[15])));
4750380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
4751380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
4752380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
4753380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
4754d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
4755d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[14]+cx[3]*pixels[15]))),pixel);
47565c4e2586d27d4299a742d170d41105de1689aa46cristy      }
47575c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
47585c4e2586d27d4299a742d170d41105de1689aa46cristy    }
4759cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony#if 0
476020075dc279f25ae4cc7291a7e54f076a61a1f068nicolas    /* deprecated useless and very slow interpolator */
47615c4e2586d27d4299a742d170d41105de1689aa46cristy    case FilterInterpolatePixel:
47625c4e2586d27d4299a742d170d41105de1689aa46cristy    {
476350e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
47645c4e2586d27d4299a742d170d41105de1689aa46cristy      {
47655c4e2586d27d4299a742d170d41105de1689aa46cristy        CacheView
47665c4e2586d27d4299a742d170d41105de1689aa46cristy          *filter_view;
47675c4e2586d27d4299a742d170d41105de1689aa46cristy
47685c4e2586d27d4299a742d170d41105de1689aa46cristy        Image
47695c4e2586d27d4299a742d170d41105de1689aa46cristy          *excerpt_source,
47705c4e2586d27d4299a742d170d41105de1689aa46cristy          *filter_source;
47715c4e2586d27d4299a742d170d41105de1689aa46cristy
47725c4e2586d27d4299a742d170d41105de1689aa46cristy        RectangleInfo
47735c4e2586d27d4299a742d170d41105de1689aa46cristy          geometry;
47745c4e2586d27d4299a742d170d41105de1689aa46cristy
4775e2a912b6c9086c98ec838baa0824cd8deca55538cristy        channel=GetPixelChannelMapChannel(source,i);
4776abace416e67464ca6dac2324410667b05076a9c2cristy        traits=GetPixelChannelMapTraits(source,channel);
47775c4e2586d27d4299a742d170d41105de1689aa46cristy        destination_traits=GetPixelChannelMapTraits(destination,channel);
47785c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
47795c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
47805c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
47815c4e2586d27d4299a742d170d41105de1689aa46cristy        geometry.width=4L;
47825c4e2586d27d4299a742d170d41105de1689aa46cristy        geometry.height=4L;
47835c4e2586d27d4299a742d170d41105de1689aa46cristy        geometry.x=x_offset-1;
47845c4e2586d27d4299a742d170d41105de1689aa46cristy        geometry.y=y_offset-1;
47855c4e2586d27d4299a742d170d41105de1689aa46cristy        excerpt_source=ExcerptImage(source,&geometry,exception);
47865c4e2586d27d4299a742d170d41105de1689aa46cristy        if (excerpt_source == (Image *) NULL)
47875c4e2586d27d4299a742d170d41105de1689aa46cristy          {
47885c4e2586d27d4299a742d170d41105de1689aa46cristy            status=MagickFalse;
47895c4e2586d27d4299a742d170d41105de1689aa46cristy            continue;
47905c4e2586d27d4299a742d170d41105de1689aa46cristy          }
4791aa2c16cb5e695053aa78e40f66bc36fbef4b1ed1cristy        filter_source=ResizeImage(excerpt_source,1,1,source->filter,exception);
47925c4e2586d27d4299a742d170d41105de1689aa46cristy        excerpt_source=DestroyImage(excerpt_source);
47935c4e2586d27d4299a742d170d41105de1689aa46cristy        if (filter_source == (Image *) NULL)
47945c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
4795db070957cf6bf959df9283a482377e8854c3d4d2cristy        filter_view=AcquireVirtualCacheView(filter_source,exception);
47965c4e2586d27d4299a742d170d41105de1689aa46cristy        p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
47975c4e2586d27d4299a742d170d41105de1689aa46cristy        if (p == (const Quantum *) NULL)
47985c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
47995c4e2586d27d4299a742d170d41105de1689aa46cristy        else
48001861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
48014a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy            SetPixelChannel(destination,channel,p[i],pixel);
48021861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
48035c4e2586d27d4299a742d170d41105de1689aa46cristy        filter_view=DestroyCacheView(filter_view);
48045c4e2586d27d4299a742d170d41105de1689aa46cristy        filter_source=DestroyImage(filter_source);
48055c4e2586d27d4299a742d170d41105de1689aa46cristy      }
48065c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
48075c4e2586d27d4299a742d170d41105de1689aa46cristy    }
4808cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony#endif
48095c4e2586d27d4299a742d170d41105de1689aa46cristy    case IntegerInterpolatePixel:
48105c4e2586d27d4299a742d170d41105de1689aa46cristy    {
48115c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
48125c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
48135c4e2586d27d4299a742d170d41105de1689aa46cristy        {
48145c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
48155c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
48165c4e2586d27d4299a742d170d41105de1689aa46cristy        }
481750e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
48185c4e2586d27d4299a742d170d41105de1689aa46cristy      {
4819e2a912b6c9086c98ec838baa0824cd8deca55538cristy        channel=GetPixelChannelMapChannel(source,i);
4820abace416e67464ca6dac2324410667b05076a9c2cristy        traits=GetPixelChannelMapTraits(source,channel);
48215c4e2586d27d4299a742d170d41105de1689aa46cristy        destination_traits=GetPixelChannelMapTraits(destination,channel);
48225c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
48235c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
48245c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
48254a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,p[i],pixel);
48265c4e2586d27d4299a742d170d41105de1689aa46cristy      }
48275c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
48285c4e2586d27d4299a742d170d41105de1689aa46cristy    }
4829cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
48305c4e2586d27d4299a742d170d41105de1689aa46cristy    {
4831cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
4832cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
4833cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
48345c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
48355c4e2586d27d4299a742d170d41105de1689aa46cristy        {
48365c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
48375c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
48385c4e2586d27d4299a742d170d41105de1689aa46cristy        }
483950e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
48405c4e2586d27d4299a742d170d41105de1689aa46cristy      {
4841e2a912b6c9086c98ec838baa0824cd8deca55538cristy        channel=GetPixelChannelMapChannel(source,i);
4842abace416e67464ca6dac2324410667b05076a9c2cristy        traits=GetPixelChannelMapTraits(source,channel);
48435c4e2586d27d4299a742d170d41105de1689aa46cristy        destination_traits=GetPixelChannelMapTraits(destination,channel);
48445c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
48455c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
48465c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
48474a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy        SetPixelChannel(destination,channel,p[i],pixel);
48485c4e2586d27d4299a742d170d41105de1689aa46cristy      }
48495c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
48505c4e2586d27d4299a742d170d41105de1689aa46cristy    }
48515c4e2586d27d4299a742d170d41105de1689aa46cristy    case MeshInterpolatePixel:
48525c4e2586d27d4299a742d170d41105de1689aa46cristy    {
48535c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
48545c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
48555c4e2586d27d4299a742d170d41105de1689aa46cristy        {
48565c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
48575c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
48585c4e2586d27d4299a742d170d41105de1689aa46cristy        }
485950e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
48605c4e2586d27d4299a742d170d41105de1689aa46cristy      {
48615c4e2586d27d4299a742d170d41105de1689aa46cristy        PointInfo
48625c4e2586d27d4299a742d170d41105de1689aa46cristy          delta,
48635c4e2586d27d4299a742d170d41105de1689aa46cristy          luminance;
48645c4e2586d27d4299a742d170d41105de1689aa46cristy
4865e2a912b6c9086c98ec838baa0824cd8deca55538cristy        channel=GetPixelChannelMapChannel(source,i);
4866abace416e67464ca6dac2324410667b05076a9c2cristy        traits=GetPixelChannelMapTraits(source,channel);
48675c4e2586d27d4299a742d170d41105de1689aa46cristy        destination_traits=GetPixelChannelMapTraits(destination,channel);
48685c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
48695c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
48705c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
48711861c90c5c8c4ceb56885dd86377412aae0f4526cristy        pixels[0]=(MagickRealType) p[i];
48721861c90c5c8c4ceb56885dd86377412aae0f4526cristy        pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
48731861c90c5c8c4ceb56885dd86377412aae0f4526cristy        pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
48741861c90c5c8c4ceb56885dd86377412aae0f4526cristy        pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
48751861c90c5c8c4ceb56885dd86377412aae0f4526cristy        if ((traits & BlendPixelTrait) == 0)
48761861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
48771861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[0]=1.0;
48781861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[1]=1.0;
48791861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[2]=1.0;
48801861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[3]=1.0;
48811861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
48821861c90c5c8c4ceb56885dd86377412aae0f4526cristy        else
48831861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
48841861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[0]=QuantumScale*GetPixelAlpha(source,p);
48851861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[1]=QuantumScale*GetPixelAlpha(source,p+
48861861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
48871861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
48881861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
48891861c90c5c8c4ceb56885dd86377412aae0f4526cristy            alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
48901861c90c5c8c4ceb56885dd86377412aae0f4526cristy              GetPixelChannels(source));
48911861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
48921861c90c5c8c4ceb56885dd86377412aae0f4526cristy        delta.x=x-x_offset;
48931861c90c5c8c4ceb56885dd86377412aae0f4526cristy        delta.y=y-y_offset;
4894cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        luminance.x=fabs((double)(
4895cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              GetPixelLuminance(source,p)
4896cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony               -GetPixelLuminance(source,p+3*GetPixelChannels(source))));
4897cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        luminance.y=fabs((double)(
4898cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony              GetPixelLuminance(source,p+GetPixelChannels(source))
4899cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony               -GetPixelLuminance(source,p+2*GetPixelChannels(source))));
4900cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if (luminance.x < luminance.y)
49011861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
49021861c90c5c8c4ceb56885dd86377412aae0f4526cristy            /*
49031861c90c5c8c4ceb56885dd86377412aae0f4526cristy              Diagonal 0-3 NW-SE.
49041861c90c5c8c4ceb56885dd86377412aae0f4526cristy            */
49051861c90c5c8c4ceb56885dd86377412aae0f4526cristy            if (delta.x <= delta.y)
49061861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
49071861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
49081861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Bottom-left triangle (pixel: 2, diagonal: 0-3).
49091861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
49101861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.y=1.0-delta.y;
49111861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4912c58380ae9cfade8bdda88414145d2ef44b13348fcristy                gamma=MagickEpsilonReciprocal(gamma);
49134a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
49144a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[2],pixels[3],pixels[0])),pixel);
49151861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
49161861c90c5c8c4ceb56885dd86377412aae0f4526cristy            else
49171861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
49181861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
49191861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Top-right triangle (pixel: 1, diagonal: 0-3).
49201861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
49211861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.x=1.0-delta.x;
49221861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4923c58380ae9cfade8bdda88414145d2ef44b13348fcristy                gamma=MagickEpsilonReciprocal(gamma);
49244a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
49254a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[1],pixels[0],pixels[3])),pixel);
49261861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
49271861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
49281861c90c5c8c4ceb56885dd86377412aae0f4526cristy        else
49291861c90c5c8c4ceb56885dd86377412aae0f4526cristy          {
49301861c90c5c8c4ceb56885dd86377412aae0f4526cristy            /*
49311861c90c5c8c4ceb56885dd86377412aae0f4526cristy              Diagonal 1-2 NE-SW.
49321861c90c5c8c4ceb56885dd86377412aae0f4526cristy            */
49331861c90c5c8c4ceb56885dd86377412aae0f4526cristy            if (delta.x <= (1.0-delta.y))
49341861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
49351861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
49361861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Top-left triangle (pixel: 0, diagonal: 1-2).
49371861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
49381861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4939c58380ae9cfade8bdda88414145d2ef44b13348fcristy                gamma=MagickEpsilonReciprocal(gamma);
49404a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
49414a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[0],pixels[1],pixels[2])),pixel);
49421861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
49431861c90c5c8c4ceb56885dd86377412aae0f4526cristy            else
49441861c90c5c8c4ceb56885dd86377412aae0f4526cristy              {
49451861c90c5c8c4ceb56885dd86377412aae0f4526cristy                /*
49461861c90c5c8c4ceb56885dd86377412aae0f4526cristy                  Bottom-right triangle (pixel: 3, diagonal: 1-2).
49471861c90c5c8c4ceb56885dd86377412aae0f4526cristy                */
49481861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.x=1.0-delta.x;
49491861c90c5c8c4ceb56885dd86377412aae0f4526cristy                delta.y=1.0-delta.y;
49501861c90c5c8c4ceb56885dd86377412aae0f4526cristy                gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4951c58380ae9cfade8bdda88414145d2ef44b13348fcristy                gamma=MagickEpsilonReciprocal(gamma);
49524a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
49534a7ae69b38a5d14623347aa9a820ce6bdd6a9b43cristy                  MeshInterpolate(&delta,pixels[3],pixels[2],pixels[1])),pixel);
49541861c90c5c8c4ceb56885dd86377412aae0f4526cristy              }
49551861c90c5c8c4ceb56885dd86377412aae0f4526cristy          }
49565c4e2586d27d4299a742d170d41105de1689aa46cristy      }
49575c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
49585c4e2586d27d4299a742d170d41105de1689aa46cristy    }
49595c4e2586d27d4299a742d170d41105de1689aa46cristy    case SplineInterpolatePixel:
49605c4e2586d27d4299a742d170d41105de1689aa46cristy    {
4961d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      MagickRealType
4962d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
4963d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cy[4];
4964d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas
49655c4e2586d27d4299a742d170d41105de1689aa46cristy      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
49665c4e2586d27d4299a742d170d41105de1689aa46cristy        exception);
49675c4e2586d27d4299a742d170d41105de1689aa46cristy      if (p == (const Quantum *) NULL)
49685c4e2586d27d4299a742d170d41105de1689aa46cristy        {
49695c4e2586d27d4299a742d170d41105de1689aa46cristy          status=MagickFalse;
49705c4e2586d27d4299a742d170d41105de1689aa46cristy          break;
49715c4e2586d27d4299a742d170d41105de1689aa46cristy        }
497250e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
49735c4e2586d27d4299a742d170d41105de1689aa46cristy      {
49745c4e2586d27d4299a742d170d41105de1689aa46cristy        register ssize_t
49755c4e2586d27d4299a742d170d41105de1689aa46cristy          j;
49765c4e2586d27d4299a742d170d41105de1689aa46cristy
4977e2a912b6c9086c98ec838baa0824cd8deca55538cristy        channel=GetPixelChannelMapChannel(source,i);
4978abace416e67464ca6dac2324410667b05076a9c2cristy        traits=GetPixelChannelMapTraits(source,channel);
49795c4e2586d27d4299a742d170d41105de1689aa46cristy        destination_traits=GetPixelChannelMapTraits(destination,channel);
49805c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits == UndefinedPixelTrait) ||
49815c4e2586d27d4299a742d170d41105de1689aa46cristy            (destination_traits == UndefinedPixelTrait))
49825c4e2586d27d4299a742d170d41105de1689aa46cristy          continue;
49835c4e2586d27d4299a742d170d41105de1689aa46cristy        if ((traits & BlendPixelTrait) == 0)
49845c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
49855c4e2586d27d4299a742d170d41105de1689aa46cristy          {
49865c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=1.0;
49875c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
49885c4e2586d27d4299a742d170d41105de1689aa46cristy          }
49895c4e2586d27d4299a742d170d41105de1689aa46cristy        else
49905c4e2586d27d4299a742d170d41105de1689aa46cristy          for (j=0; j < 16; j++)
49915c4e2586d27d4299a742d170d41105de1689aa46cristy          {
49925c4e2586d27d4299a742d170d41105de1689aa46cristy            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
49935c4e2586d27d4299a742d170d41105de1689aa46cristy              GetPixelChannels(source));
49945c4e2586d27d4299a742d170d41105de1689aa46cristy            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
49955c4e2586d27d4299a742d170d41105de1689aa46cristy          }
4996d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        SplineWeights((MagickRealType) (x-x_offset),&cx);
4997d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        SplineWeights((MagickRealType) (y-y_offset),&cy);
4998d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        gamma=((traits & BlendPixelTrait) ? (MagickRealType) (1.0) :
4999d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          MagickEpsilonReciprocal(cy[0]*(cx[0]*alpha[0]+cx[1]*alpha[1]+cx[2]*
5000d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[2]+cx[3]*alpha[3])+cy[1]*(cx[0]*alpha[4]+cx[1]*alpha[5]+cx[2]*
5001d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[6]+cx[3]*alpha[7])+cy[2]*(cx[0]*alpha[8]+cx[1]*alpha[9]+cx[2]*
5002d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          alpha[10]+cx[3]*alpha[11])+cy[3]*(cx[0]*alpha[12]+cx[1]*alpha[13]+
5003d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cx[2]*alpha[14]+cx[3]*alpha[15])));
5004d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(cy[0]*(cx[0]*
5005d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[0]+cx[1]*pixels[1]+cx[2]*pixels[2]+cx[3]*pixels[3])+cy[1]*
5006d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          (cx[0]*pixels[4]+cx[1]*pixels[5]+cx[2]*pixels[6]+cx[3]*pixels[7])+
5007d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          cy[2]*(cx[0]*pixels[8]+cx[1]*pixels[9]+cx[2]*pixels[10]+cx[3]*
5008d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[11])+cy[3]*(cx[0]*pixels[12]+cx[1]*pixels[13]+cx[2]*
5009d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[14]+cx[3]*pixels[15]))),pixel);
50105c4e2586d27d4299a742d170d41105de1689aa46cristy      }
50115c4e2586d27d4299a742d170d41105de1689aa46cristy      break;
50125c4e2586d27d4299a742d170d41105de1689aa46cristy    }
50135c4e2586d27d4299a742d170d41105de1689aa46cristy  }
50145c4e2586d27d4299a742d170d41105de1689aa46cristy  return(status);
50155c4e2586d27d4299a742d170d41105de1689aa46cristy}
50165c4e2586d27d4299a742d170d41105de1689aa46cristy
50175c4e2586d27d4299a742d170d41105de1689aa46cristy/*
50185c4e2586d27d4299a742d170d41105de1689aa46cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50195c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
50205c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
50215c4e2586d27d4299a742d170d41105de1689aa46cristy%                                                                             %
50229075cdb062fda00666ab37b0ba7df4b8cc2e8eaccristy%   I n t e r p o l a t e P i x e l I n f o                                   %
5023d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5024d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5025d76c51ed30cf4084f4434ba08925d16001d1e340cristy%                                                                             %
5026d76c51ed30cf4084f4434ba08925d16001d1e340cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5027d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5028884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  InterpolatePixelInfo() applies a pixel interpolation method between a
5029884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  floating point coordinate and the pixels surrounding that coordinate.  No
5030884f600898ca6935a7981b4d56bf3d2c4ec17011cristy%  pixel area resampling, or scaling of the result is performed.
5031d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5032cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%  Interpolation is restricted to just RGBKA channels.
5033cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony%
50344c08aed51c5899665ade97263692328eea4af106cristy%  The format of the InterpolatePixelInfo method is:
5035d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
50364c08aed51c5899665ade97263692328eea4af106cristy%      MagickBooleanType InterpolatePixelInfo(const Image *image,
50375c4e2586d27d4299a742d170d41105de1689aa46cristy%        const CacheView *image_view,const PixelInterpolateMethod method,
50384c08aed51c5899665ade97263692328eea4af106cristy%        const double x,const double y,PixelInfo *pixel,
5039d76c51ed30cf4084f4434ba08925d16001d1e340cristy%        ExceptionInfo *exception)
5040d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5041d76c51ed30cf4084f4434ba08925d16001d1e340cristy%  A description of each parameter follows:
5042d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5043d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o image: the image.
5044d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5045d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o image_view: the image view.
5046d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5047d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o method: the pixel color interpolation method.
5048d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5049d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o x,y: A double representing the current (x,y) position of the pixel.
5050d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5051d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o pixel: return the interpolated pixel here.
5052d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5053d76c51ed30cf4084f4434ba08925d16001d1e340cristy%    o exception: return any errors or warnings in this structure.
5054d76c51ed30cf4084f4434ba08925d16001d1e340cristy%
5055d76c51ed30cf4084f4434ba08925d16001d1e340cristy*/
5056d76c51ed30cf4084f4434ba08925d16001d1e340cristy
50574c08aed51c5899665ade97263692328eea4af106cristystatic inline void AlphaBlendPixelInfo(const Image *image,
50584c08aed51c5899665ade97263692328eea4af106cristy  const Quantum *pixel,PixelInfo *pixel_info,MagickRealType *alpha)
5059d76c51ed30cf4084f4434ba08925d16001d1e340cristy{
5060241310d359ef6893f4d0c1e43eeb39f34991fd2acristy  if (image->matte == MagickFalse)
5061241310d359ef6893f4d0c1e43eeb39f34991fd2acristy    {
5062241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      *alpha=1.0;
50634c08aed51c5899665ade97263692328eea4af106cristy      pixel_info->red=(MagickRealType) GetPixelRed(image,pixel);
50644c08aed51c5899665ade97263692328eea4af106cristy      pixel_info->green=(MagickRealType) GetPixelGreen(image,pixel);
50654c08aed51c5899665ade97263692328eea4af106cristy      pixel_info->blue=(MagickRealType) GetPixelBlue(image,pixel);
50664c08aed51c5899665ade97263692328eea4af106cristy      pixel_info->black=0.0;
50674c08aed51c5899665ade97263692328eea4af106cristy      if (image->colorspace == CMYKColorspace)
50684c08aed51c5899665ade97263692328eea4af106cristy        pixel_info->black=(MagickRealType) GetPixelBlack(image,pixel);
50694c08aed51c5899665ade97263692328eea4af106cristy      pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
5070241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      return;
5071241310d359ef6893f4d0c1e43eeb39f34991fd2acristy    }
50724c08aed51c5899665ade97263692328eea4af106cristy  *alpha=QuantumScale*GetPixelAlpha(image,pixel);
50734c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->red=(*alpha*GetPixelRed(image,pixel));
50744c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->green=(*alpha*GetPixelGreen(image,pixel));
50754c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->blue=(*alpha*GetPixelBlue(image,pixel));
50764c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->black=0.0;
50774c08aed51c5899665ade97263692328eea4af106cristy  if (image->colorspace == CMYKColorspace)
50784c08aed51c5899665ade97263692328eea4af106cristy    pixel_info->black=(*alpha*GetPixelBlack(image,pixel));
50794c08aed51c5899665ade97263692328eea4af106cristy  pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
5080d76c51ed30cf4084f4434ba08925d16001d1e340cristy}
5081d76c51ed30cf4084f4434ba08925d16001d1e340cristy
50824c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
50835c4e2586d27d4299a742d170d41105de1689aa46cristy  const CacheView *image_view,const PixelInterpolateMethod method,
50844c08aed51c5899665ade97263692328eea4af106cristy  const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception)
5085d76c51ed30cf4084f4434ba08925d16001d1e340cristy{
5086d76c51ed30cf4084f4434ba08925d16001d1e340cristy  MagickBooleanType
5087d76c51ed30cf4084f4434ba08925d16001d1e340cristy    status;
5088d76c51ed30cf4084f4434ba08925d16001d1e340cristy
508942587c577d5b808de94915f2388b88b05c3d43a3cristy  MagickRealType
509042587c577d5b808de94915f2388b88b05c3d43a3cristy    alpha[16],
509142587c577d5b808de94915f2388b88b05c3d43a3cristy    gamma;
509242587c577d5b808de94915f2388b88b05c3d43a3cristy
5093865d58d60e5fc755d47771eab37ce5159531629dcristy  PixelInfo
5094865d58d60e5fc755d47771eab37ce5159531629dcristy    pixels[16];
5095865d58d60e5fc755d47771eab37ce5159531629dcristy
50964c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
5097d76c51ed30cf4084f4434ba08925d16001d1e340cristy    *p;
5098d76c51ed30cf4084f4434ba08925d16001d1e340cristy
509950e64b85215ce366ca50af1ba16326c784221f92cristy  register ssize_t
5100d76c51ed30cf4084f4434ba08925d16001d1e340cristy    i;
5101d76c51ed30cf4084f4434ba08925d16001d1e340cristy
510242587c577d5b808de94915f2388b88b05c3d43a3cristy  ssize_t
510342587c577d5b808de94915f2388b88b05c3d43a3cristy    x_offset,
510442587c577d5b808de94915f2388b88b05c3d43a3cristy    y_offset;
510542587c577d5b808de94915f2388b88b05c3d43a3cristy
5106cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  PixelInterpolateMethod
5107cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate;
5108cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5109d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image != (Image *) NULL);
5110d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image->signature == MagickSignature);
5111d76c51ed30cf4084f4434ba08925d16001d1e340cristy  assert(image_view != (CacheView *) NULL);
5112d76c51ed30cf4084f4434ba08925d16001d1e340cristy  status=MagickTrue;
511342587c577d5b808de94915f2388b88b05c3d43a3cristy  x_offset=(ssize_t) floor(x);
511442587c577d5b808de94915f2388b88b05c3d43a3cristy  y_offset=(ssize_t) floor(y);
5115cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  interpolate = method;
5116cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  if ( interpolate == UndefinedInterpolatePixel )
5117cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    interpolate = image->interpolate;
5118cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony  switch (interpolate)
5119d76c51ed30cf4084f4434ba08925d16001d1e340cristy  {
5120cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case AverageInterpolatePixel:        /* nearest 4 neighbours */
5121cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case Average9InterpolatePixel:       /* nearest 9 neighbours */
5122cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case Average16InterpolatePixel:      /* nearest 16 neighbours */
5123d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5124cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      size_t
5125cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        count=2; /* size of the area to average - default nearest 4 */
5126cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5127cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (interpolate == Average9InterpolatePixel)
5128cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5129cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=3;
5130cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset=(ssize_t) (floor(x+0.5)-1);
5131cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset=(ssize_t) (floor(y+0.5)-1);
5132cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5133cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else if (interpolate == Average16InterpolatePixel)
5134cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5135cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          count=4;
5136cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          x_offset--;
5137cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          y_offset--;
5138cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5139cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,count,count,
514042587c577d5b808de94915f2388b88b05c3d43a3cristy        exception);
51414c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5142d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5143d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5144d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5145d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5146241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->red=0.0;
5147241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->green=0.0;
5148241310d359ef6893f4d0c1e43eeb39f34991fd2acristy      pixel->blue=0.0;
51494c08aed51c5899665ade97263692328eea4af106cristy      pixel->black=0.0;
5150865d58d60e5fc755d47771eab37ce5159531629dcristy      pixel->alpha=0.0;
5151cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      count*=count;         /* number of pixels - square of size */
515250e64b85215ce366ca50af1ba16326c784221f92cristy      for (i=0; i < (ssize_t) count; i++)
5153cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      {
5154cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p,pixels,alpha);
5155cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        gamma=MagickEpsilonReciprocal(alpha[0]);
5156cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->red   += gamma*pixels[0].red;
5157cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->green += gamma*pixels[0].green;
5158cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->blue  += gamma*pixels[0].blue;
5159cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->black += gamma*pixels[0].black;
5160cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->alpha +=       pixels[0].alpha;
5161cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        p += GetPixelChannels(image);
5162cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
5163cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=1.0/count;   /* average weighting of each pixel in area */
5164cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->red   *= gamma;
5165cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->green *= gamma;
5166cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->blue  *= gamma;
5167cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->black *= gamma;
5168cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->alpha *= gamma;
5169cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5170cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5171cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BackgroundInterpolatePixel:
5172cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5173cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      *pixel = image->background_color;  /* Copy PixelInfo Structure  */
5174d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5175d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5176cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BilinearInterpolatePixel:
5177cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    default:
5178cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5179cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      PointInfo
5180cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        delta,
5181cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        epsilon;
5182cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony
5183cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5184cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
5185cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5186cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
5187cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
5188cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5189cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 4L; i++)
5190cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5191cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.x=x-x_offset;
5192cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      delta.y=y-y_offset;
5193cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.x=1.0-delta.x;
5194cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      epsilon.y=1.0-delta.y;
5195cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
5196cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        (epsilon.x*alpha[2]+delta.x*alpha[3])));
5197cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=MagickEpsilonReciprocal(gamma);
5198cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x*
5199cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red));
5200cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x*
5201cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x*
5202cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].green));
5203cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x*
5204cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x*
5205cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].blue));
5206cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (image->colorspace == CMYKColorspace)
5207cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x*
5208cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x*
5209cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[3].black));
5210cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
5211cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=MagickEpsilonReciprocal(gamma);
5212cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->alpha=(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x*
5213cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x*
5214cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[3].alpha));
5215cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5216cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5217cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case BlendInterpolatePixel:
5218cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    {
5219cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
5220cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if (p == (const Quantum *) NULL)
5221cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        {
5222cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          status=MagickFalse;
5223cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          break;
5224cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5225cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 4L; i++)
5226cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5227cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma=1.0;       /* number of pixels blended together */
5228cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i <= 1L; i++) {
5229cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        if ( y-y_offset >= 0.75 ) {
5230cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]  = alpha[i+2];
5231cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i] = pixels[i+2];
5232cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5233cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        else if ( y-y_offset > 0.25 ) {
5234cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          gamma = 2.0;             /* each y pixels have been blended */
5235cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          alpha[i]        += alpha[i+2];  /* add up alpha weights */
5236cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i].red   += pixels[i+2].red;
5237cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i].green += pixels[i+2].green;
5238cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i].blue  += pixels[i+2].blue;
5239cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i].black += pixels[i+2].black;
5240cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony          pixels[i].alpha += pixels[i+2].alpha;
5241cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        }
5242cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
5243cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      if ( x-x_offset >= 0.75 ) {
5244cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[0]  = alpha[1];
5245cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0] = pixels[1];
5246cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
5247cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      else if ( x-x_offset > 0.25 ) {
5248cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        gamma *= 2.0;          /* double number of pixels blended */
5249cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        alpha[0]        += alpha[1];  /* add up alpha weights */
5250cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0].red   += pixels[1].red;
5251cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0].green += pixels[1].green;
5252cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0].blue  += pixels[1].blue;
5253cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0].black += pixels[1].black;
5254cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        pixels[0].alpha += pixels[1].alpha;
5255cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      }
5256cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      gamma = 1.0/gamma;
5257cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      alpha[0]=MagickEpsilonReciprocal(alpha[0]);
5258cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->red   = alpha[0]*pixels[0].red;
5259cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->green = alpha[0]*pixels[0].green; /* divide by sum of alpha */
5260cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->blue  = alpha[0]*pixels[0].blue;
5261cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->black = alpha[0]*pixels[0].black;
5262cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      pixel->alpha =    gamma*pixels[0].alpha; /* divide by number of pixels */
5263cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      break;
5264cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    }
5265cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case CatromInterpolatePixel:
5266d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5267380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      MagickRealType
5268380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cx[4],
5269380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        cy[4];
5270d76c51ed30cf4084f4434ba08925d16001d1e340cristy
527142587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
527242587c577d5b808de94915f2388b88b05c3d43a3cristy        exception);
52734c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5274d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5275d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5276d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5277d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5278cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 16L; i++)
5279cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5280d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      CatromWeights((MagickRealType) (x-x_offset),&cx);
5281d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      CatromWeights((MagickRealType) (y-y_offset),&cy);
5282380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*
5283380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[1].red+cx[2]*pixels[2].red+cx[3]*
5284380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5285380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[5].red+cx[2]*pixels[6].red+cx[3]*
5286380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[7].red)+cy[2]*(cx[0]*pixels[8].red+cx[1]*
5287380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5288380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*
5289380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[13].red+cx[2]*pixels[14].red+cx[3]*pixels[15].red));
5290380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*
5291380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[1].green+cx[2]*pixels[2].green+cx[3]*
5292380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+cx[1]*
5293380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[5].green+cx[2]*pixels[6].green+cx[3]*
5294380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[7].green)+cy[2]*(cx[0]*pixels[8].green+cx[1]*
5295380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[9].green+cx[2]*pixels[10].green+cx[3]*
5296380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+cx[1]*
5297380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green));
5298380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*
5299380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[1].blue+cx[2]*pixels[2].blue+cx[3]*
5300380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5301380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*
5302380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[7].blue)+cy[2]*(cx[0]*pixels[8].blue+cx[1]*
5303380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5304380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*
5305380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[13].blue+cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5306380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      if (image->colorspace == CMYKColorspace)
5307380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*
5308380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[1].black+cx[2]*pixels[2].black+cx[3]*
5309380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+cx[1]*
5310380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[5].black+cx[2]*pixels[6].black+cx[3]*
5311380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[7].black)+cy[2]*(cx[0]*pixels[8].black+cx[1]*
5312380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[9].black+cx[2]*pixels[10].black+cx[3]*
5313380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[11].black)+cy[3]*(cx[0]*pixels[12].black+cx[1]*
5314380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy          pixels[13].black+cx[2]*pixels[14].black+cx[3]*pixels[15].black));
5315380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy      pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*
5316380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[1].alpha+cx[2]*pixels[2].alpha+cx[3]*
5317380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+cx[1]*
5318380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*
5319380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[7].alpha)+cy[2]*(cx[0]*pixels[8].alpha+cx[1]*
5320380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[9].alpha+cx[2]*pixels[10].alpha+cx[3]*
5321380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+cx[1]*
5322380a11c98d7ffe5ffb65a2fd8c464f8227a19dcfcristy        pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5323d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5324d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5325cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony#if 0
532620075dc279f25ae4cc7291a7e54f076a61a1f068nicolas    /* deprecated useless and very slow interpolator */
5327d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case FilterInterpolatePixel:
5328d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5329d76c51ed30cf4084f4434ba08925d16001d1e340cristy      CacheView
5330d76c51ed30cf4084f4434ba08925d16001d1e340cristy        *filter_view;
5331d76c51ed30cf4084f4434ba08925d16001d1e340cristy
5332d76c51ed30cf4084f4434ba08925d16001d1e340cristy      Image
5333d76c51ed30cf4084f4434ba08925d16001d1e340cristy        *excerpt_image,
5334d76c51ed30cf4084f4434ba08925d16001d1e340cristy        *filter_image;
5335d76c51ed30cf4084f4434ba08925d16001d1e340cristy
5336d76c51ed30cf4084f4434ba08925d16001d1e340cristy      RectangleInfo
5337d76c51ed30cf4084f4434ba08925d16001d1e340cristy        geometry;
5338d76c51ed30cf4084f4434ba08925d16001d1e340cristy
5339d76c51ed30cf4084f4434ba08925d16001d1e340cristy      geometry.width=4L;
5340d76c51ed30cf4084f4434ba08925d16001d1e340cristy      geometry.height=4L;
534142587c577d5b808de94915f2388b88b05c3d43a3cristy      geometry.x=x_offset-1;
534242587c577d5b808de94915f2388b88b05c3d43a3cristy      geometry.y=y_offset-1;
5343d76c51ed30cf4084f4434ba08925d16001d1e340cristy      excerpt_image=ExcerptImage(image,&geometry,exception);
5344d76c51ed30cf4084f4434ba08925d16001d1e340cristy      if (excerpt_image == (Image *) NULL)
5345d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5346d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5347d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5348d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5349aa2c16cb5e695053aa78e40f66bc36fbef4b1ed1cristy      filter_image=ResizeImage(excerpt_image,1,1,image->filter,exception);
5350d76c51ed30cf4084f4434ba08925d16001d1e340cristy      excerpt_image=DestroyImage(excerpt_image);
5351d76c51ed30cf4084f4434ba08925d16001d1e340cristy      if (filter_image == (Image *) NULL)
5352d76c51ed30cf4084f4434ba08925d16001d1e340cristy        break;
5353db070957cf6bf959df9283a482377e8854c3d4d2cristy      filter_view=AcquireVirtualCacheView(filter_image,exception);
5354d76c51ed30cf4084f4434ba08925d16001d1e340cristy      p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
53554c08aed51c5899665ade97263692328eea4af106cristy      if (p != (const Quantum *) NULL)
5356803640d20a6a664315eddfff6f8531d0c5e0871dcristy        GetPixelInfoPixel(image,p,pixel);
5357d76c51ed30cf4084f4434ba08925d16001d1e340cristy      filter_view=DestroyCacheView(filter_view);
5358d76c51ed30cf4084f4434ba08925d16001d1e340cristy      filter_image=DestroyImage(filter_image);
5359d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5360d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5361cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony#endif
5362d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case IntegerInterpolatePixel:
5363d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
536442587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
53654c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5366d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5367d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5368d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5369d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5370803640d20a6a664315eddfff6f8531d0c5e0871dcristy      GetPixelInfoPixel(image,p,pixel);
5371d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5372d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5373d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case MeshInterpolatePixel:
5374d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5375d76c51ed30cf4084f4434ba08925d16001d1e340cristy      PointInfo
5376d76c51ed30cf4084f4434ba08925d16001d1e340cristy        delta,
5377d76c51ed30cf4084f4434ba08925d16001d1e340cristy        luminance;
5378d76c51ed30cf4084f4434ba08925d16001d1e340cristy
537994ea1636709395774d7118ef56162d211904cfd2cristy      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
53804c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5381d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5382d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5383d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5384d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
538594ea1636709395774d7118ef56162d211904cfd2cristy      delta.x=x-x_offset;
538694ea1636709395774d7118ef56162d211904cfd2cristy      delta.y=y-y_offset;
5387884f600898ca6935a7981b4d56bf3d2c4ec17011cristy      luminance.x=GetPixelLuminance(image,p)-(double)
538894ea1636709395774d7118ef56162d211904cfd2cristy        GetPixelLuminance(image,p+3*GetPixelChannels(image));
538928474bfbda5ee2d4da2eb79f299cf1f692770b99cristy      luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
539094ea1636709395774d7118ef56162d211904cfd2cristy        GetPixelLuminance(image,p+2*GetPixelChannels(image));
53915ce8df84afcfec6dc33ee61ac2014edb3871c455cristy      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
539228474bfbda5ee2d4da2eb79f299cf1f692770b99cristy      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
5393ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
5394ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
5395d76c51ed30cf4084f4434ba08925d16001d1e340cristy      if (fabs(luminance.x) < fabs(luminance.y))
5396d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5397d76c51ed30cf4084f4434ba08925d16001d1e340cristy          /*
5398d76c51ed30cf4084f4434ba08925d16001d1e340cristy            Diagonal 0-3 NW-SE.
5399d76c51ed30cf4084f4434ba08925d16001d1e340cristy          */
5400d76c51ed30cf4084f4434ba08925d16001d1e340cristy          if (delta.x <= delta.y)
5401d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5402d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
540394ea1636709395774d7118ef56162d211904cfd2cristy                Bottom-left triangle (pixel: 2, diagonal: 0-3).
5404d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5405d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.y=1.0-delta.y;
5406d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
5407c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
5408d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
5409d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].red,pixels[0].red);
5410d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
5411d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].green,pixels[0].green);
5412d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
5413d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[3].blue,pixels[0].blue);
54145af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
54154c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black,
54164c08aed51c5899665ade97263692328eea4af106cristy                  pixels[3].black,pixels[0].black);
541794ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5418865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha,
5419865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[3].alpha,pixels[0].alpha);
5420d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5421d76c51ed30cf4084f4434ba08925d16001d1e340cristy          else
5422d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5423d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
542494ea1636709395774d7118ef56162d211904cfd2cristy                Top-right triangle (pixel:1 , diagonal: 0-3).
5425d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5426d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.x=1.0-delta.x;
5427d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
5428c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
5429d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
5430d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].red,pixels[3].red);
5431d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
5432d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].green,pixels[3].green);
5433d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
5434d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[0].blue,pixels[3].blue);
54355af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
54364c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black,
54374c08aed51c5899665ade97263692328eea4af106cristy                  pixels[0].black,pixels[3].black);
543894ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5439865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha,
5440865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[0].alpha,pixels[3].alpha);
5441d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5442d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5443d76c51ed30cf4084f4434ba08925d16001d1e340cristy      else
5444d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5445d76c51ed30cf4084f4434ba08925d16001d1e340cristy          /*
5446d76c51ed30cf4084f4434ba08925d16001d1e340cristy            Diagonal 1-2 NE-SW.
5447d76c51ed30cf4084f4434ba08925d16001d1e340cristy          */
5448d76c51ed30cf4084f4434ba08925d16001d1e340cristy          if (delta.x <= (1.0-delta.y))
5449d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5450d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
545194ea1636709395774d7118ef56162d211904cfd2cristy                Top-left triangle (pixel: 0, diagonal: 1-2).
5452d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5453d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
5454c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
5455d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
5456d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].red,pixels[2].red);
5457d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
5458d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].green,pixels[2].green);
5459d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
5460d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[1].blue,pixels[2].blue);
54615af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
54624c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black,
54634c08aed51c5899665ade97263692328eea4af106cristy                  pixels[1].black,pixels[2].black);
546494ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5465865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha,
5466865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[1].alpha,pixels[2].alpha);
5467d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5468d76c51ed30cf4084f4434ba08925d16001d1e340cristy          else
5469d76c51ed30cf4084f4434ba08925d16001d1e340cristy            {
5470d76c51ed30cf4084f4434ba08925d16001d1e340cristy              /*
5471d76c51ed30cf4084f4434ba08925d16001d1e340cristy                Bottom-right triangle (pixel: 3, diagonal: 1-2).
5472d76c51ed30cf4084f4434ba08925d16001d1e340cristy              */
5473d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.x=1.0-delta.x;
5474d76c51ed30cf4084f4434ba08925d16001d1e340cristy              delta.y=1.0-delta.y;
5475d76c51ed30cf4084f4434ba08925d16001d1e340cristy              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
5476c58380ae9cfade8bdda88414145d2ef44b13348fcristy              gamma=MagickEpsilonReciprocal(gamma);
5477d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
5478d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].red,pixels[1].red);
5479d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
5480d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].green,pixels[1].green);
5481d76c51ed30cf4084f4434ba08925d16001d1e340cristy              pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
5482d76c51ed30cf4084f4434ba08925d16001d1e340cristy                pixels[2].blue,pixels[1].blue);
54835af738104f48677012746b82ba0daa0dc59bdbb5cristy              if (image->colorspace == CMYKColorspace)
54844c08aed51c5899665ade97263692328eea4af106cristy                pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black,
54854c08aed51c5899665ade97263692328eea4af106cristy                  pixels[2].black,pixels[1].black);
548694ea1636709395774d7118ef56162d211904cfd2cristy              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5487865d58d60e5fc755d47771eab37ce5159531629dcristy              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha,
5488865d58d60e5fc755d47771eab37ce5159531629dcristy                pixels[2].alpha,pixels[1].alpha);
5489d76c51ed30cf4084f4434ba08925d16001d1e340cristy            }
5490d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5491d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5492d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5493cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony    case NearestInterpolatePixel:
5494d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5495cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      x_offset=(ssize_t) floor(x+0.5);
5496cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      y_offset=(ssize_t) floor(y+0.5);
5497cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
54984c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5499d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5500d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5501d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5502d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5503803640d20a6a664315eddfff6f8531d0c5e0871dcristy      GetPixelInfoPixel(image,p,pixel);
5504d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5505d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5506d76c51ed30cf4084f4434ba08925d16001d1e340cristy    case SplineInterpolatePixel:
5507d76c51ed30cf4084f4434ba08925d16001d1e340cristy    {
5508d76c51ed30cf4084f4434ba08925d16001d1e340cristy      MagickRealType
5509d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cx[4],
5510d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        cy[4];
5511d76c51ed30cf4084f4434ba08925d16001d1e340cristy
551242587c577d5b808de94915f2388b88b05c3d43a3cristy      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
551342587c577d5b808de94915f2388b88b05c3d43a3cristy        exception);
55144c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
5515d76c51ed30cf4084f4434ba08925d16001d1e340cristy        {
5516d76c51ed30cf4084f4434ba08925d16001d1e340cristy          status=MagickFalse;
5517d76c51ed30cf4084f4434ba08925d16001d1e340cristy          break;
5518d76c51ed30cf4084f4434ba08925d16001d1e340cristy        }
5519cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony      for (i=0; i < 16L; i++)
5520cf4e33d9032a6cbeed57fd35ea9f567b0062d8caanthony        AlphaBlendPixelInfo(image,p+i*GetPixelChannels(image),pixels+i,alpha+i);
5521d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      SplineWeights((MagickRealType) (x-x_offset),&cx);
5522d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      SplineWeights((MagickRealType) (y-y_offset),&cy);
5523d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      pixel->red=(cy[0]*(cx[0]*pixels[0].red+cx[1]*
5524d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[1].red+cx[2]*pixels[2].red+cx[3]*
5525d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[3].red)+cy[1]*(cx[0]*pixels[4].red+cx[1]*
5526d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[5].red+cx[2]*pixels[6].red+cx[3]*
5527d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[7].red)+cy[2]*(cx[0]*pixels[8].red+cx[1]*
5528d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[9].red+cx[2]*pixels[10].red+cx[3]*
5529d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[11].red)+cy[3]*(cx[0]*pixels[12].red+cx[1]*
5530d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13].red+cx[2]*pixels[14].red+cx[3]*pixels[15].red));
5531d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      pixel->green=(cy[0]*(cx[0]*pixels[0].green+cx[1]*
5532d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[1].green+cx[2]*pixels[2].green+cx[3]*
5533d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[3].green)+cy[1]*(cx[0]*pixels[4].green+cx[1]*
5534d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[5].green+cx[2]*pixels[6].green+cx[3]*
5535d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[7].green)+cy[2]*(cx[0]*pixels[8].green+cx[1]*
5536d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[9].green+cx[2]*pixels[10].green+cx[3]*
5537d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[11].green)+cy[3]*(cx[0]*pixels[12].green+cx[1]*
5538d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13].green+cx[2]*pixels[14].green+cx[3]*pixels[15].green));
5539d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      pixel->blue=(cy[0]*(cx[0]*pixels[0].blue+cx[1]*
5540d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[1].blue+cx[2]*pixels[2].blue+cx[3]*
5541d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[3].blue)+cy[1]*(cx[0]*pixels[4].blue+cx[1]*
5542d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[5].blue+cx[2]*pixels[6].blue+cx[3]*
5543d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[7].blue)+cy[2]*(cx[0]*pixels[8].blue+cx[1]*
5544d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[9].blue+cx[2]*pixels[10].blue+cx[3]*
5545d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[11].blue)+cy[3]*(cx[0]*pixels[12].blue+cx[1]*
5546d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13].blue+cx[2]*pixels[14].blue+cx[3]*pixels[15].blue));
5547d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      if (image->colorspace == CMYKColorspace)
5548d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixel->black=(cy[0]*(cx[0]*pixels[0].black+cx[1]*
5549d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[1].black+cx[2]*pixels[2].black+cx[3]*
5550d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[3].black)+cy[1]*(cx[0]*pixels[4].black+cx[1]*
5551d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[5].black+cx[2]*pixels[6].black+cx[3]*
5552d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[7].black)+cy[2]*(cx[0]*pixels[8].black+cx[1]*
5553d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[9].black+cx[2]*pixels[10].black+cx[3]*
5554d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[11].black)+cy[3]*(cx[0]*pixels[12].black+cx[1]*
5555d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas          pixels[13].black+cx[2]*pixels[14].black+cx[3]*pixels[15].black));
5556d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas      pixel->alpha=(cy[0]*(cx[0]*pixels[0].alpha+cx[1]*
5557d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[1].alpha+cx[2]*pixels[2].alpha+cx[3]*
5558d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[3].alpha)+cy[1]*(cx[0]*pixels[4].alpha+cx[1]*
5559d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[5].alpha+cx[2]*pixels[6].alpha+cx[3]*
5560d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[7].alpha)+cy[2]*(cx[0]*pixels[8].alpha+cx[1]*
5561d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[9].alpha+cx[2]*pixels[10].alpha+cx[3]*
5562d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[11].alpha)+cy[3]*(cx[0]*pixels[12].alpha+cx[1]*
5563d32d5e5eebeebfccef40d1b060fb24f6dc8d0722nicolas        pixels[13].alpha+cx[2]*pixels[14].alpha+cx[3]*pixels[15].alpha));
5564d76c51ed30cf4084f4434ba08925d16001d1e340cristy      break;
5565d76c51ed30cf4084f4434ba08925d16001d1e340cristy    }
5566d76c51ed30cf4084f4434ba08925d16001d1e340cristy  }
5567d76c51ed30cf4084f4434ba08925d16001d1e340cristy  return(status);
5568d76c51ed30cf4084f4434ba08925d16001d1e340cristy}
55694c08aed51c5899665ade97263692328eea4af106cristy
55704c08aed51c5899665ade97263692328eea4af106cristy/*
55714c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55724c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
55734c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
55744c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
55754c08aed51c5899665ade97263692328eea4af106cristy+   I s F u z z y E q u i v a l e n c e P i x e l                             %
55764c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
55774c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
55784c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
55794c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
55804c08aed51c5899665ade97263692328eea4af106cristy%
55814c08aed51c5899665ade97263692328eea4af106cristy%  IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two
55824c08aed51c5899665ade97263692328eea4af106cristy%  pixels is less than the specified distance in a linear three (or four)u
55834c08aed51c5899665ade97263692328eea4af106cristy%  dimensional color space.
55844c08aed51c5899665ade97263692328eea4af106cristy%
55854c08aed51c5899665ade97263692328eea4af106cristy%  The format of the IsFuzzyEquivalencePixel method is:
55864c08aed51c5899665ade97263692328eea4af106cristy%
5587e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%      void IsFuzzyEquivalencePixel(const Image *source,const Quantum *p,
5588e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%        const Image *destination,const Quantum *q)
55894c08aed51c5899665ade97263692328eea4af106cristy%
55904c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
55914c08aed51c5899665ade97263692328eea4af106cristy%
5592e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%    o source: the source image.
55934c08aed51c5899665ade97263692328eea4af106cristy%
55944c08aed51c5899665ade97263692328eea4af106cristy%    o p: Pixel p.
55954c08aed51c5899665ade97263692328eea4af106cristy%
5596e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%    o destination: the destination image.
5597e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy%
55984c08aed51c5899665ade97263692328eea4af106cristy%    o q: Pixel q.
55994c08aed51c5899665ade97263692328eea4af106cristy%
56004c08aed51c5899665ade97263692328eea4af106cristy*/
5601e4a404711bf20d9062d11ab28bc12e5acd307f9ccristyMagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *source,
5602e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  const Quantum *p,const Image *destination,const Quantum *q)
56034c08aed51c5899665ade97263692328eea4af106cristy{
56044c08aed51c5899665ade97263692328eea4af106cristy  MagickRealType
56054c08aed51c5899665ade97263692328eea4af106cristy    fuzz,
56064c08aed51c5899665ade97263692328eea4af106cristy    pixel;
56074c08aed51c5899665ade97263692328eea4af106cristy
56084c08aed51c5899665ade97263692328eea4af106cristy  register MagickRealType
56094c08aed51c5899665ade97263692328eea4af106cristy    distance,
56104c08aed51c5899665ade97263692328eea4af106cristy    scale;
56114c08aed51c5899665ade97263692328eea4af106cristy
5612e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  fuzz=MagickMax(source->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(
5613e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy    destination->fuzz,(MagickRealType) MagickSQ1_2);
56144c08aed51c5899665ade97263692328eea4af106cristy  scale=1.0;
56154c08aed51c5899665ade97263692328eea4af106cristy  distance=0.0;
5616e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  if (source->matte != MagickFalse)
56174c08aed51c5899665ade97263692328eea4af106cristy    {
56184c08aed51c5899665ade97263692328eea4af106cristy      /*
56194c08aed51c5899665ade97263692328eea4af106cristy        Transparencies are involved - set alpha distance
56204c08aed51c5899665ade97263692328eea4af106cristy      */
562199abff36ae5d479bfd76652d166a4894ceada102cristy      pixel=GetPixelAlpha(source,p)-(MagickRealType)
562299abff36ae5d479bfd76652d166a4894ceada102cristy        GetPixelAlpha(destination,q);
56234c08aed51c5899665ade97263692328eea4af106cristy      distance=pixel*pixel;
56244c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
56254c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
56264c08aed51c5899665ade97263692328eea4af106cristy      /*
56274c08aed51c5899665ade97263692328eea4af106cristy        Generate a alpha scaling factor to generate a 4D cone on colorspace
56284c08aed51c5899665ade97263692328eea4af106cristy        Note that if one color is transparent, distance has no color component.
56294c08aed51c5899665ade97263692328eea4af106cristy      */
5630e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      scale=QuantumScale*GetPixelAlpha(source,p);
5631e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      scale*=QuantumScale*GetPixelAlpha(destination,q);
56324c08aed51c5899665ade97263692328eea4af106cristy      if (scale <= MagickEpsilon)
56334c08aed51c5899665ade97263692328eea4af106cristy        return(MagickTrue);
56344c08aed51c5899665ade97263692328eea4af106cristy    }
56354c08aed51c5899665ade97263692328eea4af106cristy  /*
56364c08aed51c5899665ade97263692328eea4af106cristy    RGB or CMY color cube
56374c08aed51c5899665ade97263692328eea4af106cristy  */
56384c08aed51c5899665ade97263692328eea4af106cristy  distance*=3.0;  /* rescale appropriately */
56394c08aed51c5899665ade97263692328eea4af106cristy  fuzz*=3.0;
5640e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  pixel=GetPixelRed(source,p)-(MagickRealType) GetPixelRed(destination,q);
5641e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  if ((source->colorspace == HSLColorspace) ||
5642e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      (source->colorspace == HSBColorspace) ||
5643e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy      (source->colorspace == HWBColorspace))
56444c08aed51c5899665ade97263692328eea4af106cristy    {
56454c08aed51c5899665ade97263692328eea4af106cristy      /*
56464c08aed51c5899665ade97263692328eea4af106cristy        Compute an arc distance for hue.  It should be a vector angle of
56474c08aed51c5899665ade97263692328eea4af106cristy        'S'/'W' length with 'L'/'B' forming appropriate cones.
56484c08aed51c5899665ade97263692328eea4af106cristy      */
56494c08aed51c5899665ade97263692328eea4af106cristy      if (fabs((double) pixel) > (QuantumRange/2))
56504c08aed51c5899665ade97263692328eea4af106cristy        pixel-=QuantumRange;
56514c08aed51c5899665ade97263692328eea4af106cristy      pixel*=2;
56524c08aed51c5899665ade97263692328eea4af106cristy    }
56534c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
56544c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
56554c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
5656e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  pixel=GetPixelGreen(source,p)-(MagickRealType) GetPixelGreen(destination,q);
56574c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
56584c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
56594c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
5660e4a404711bf20d9062d11ab28bc12e5acd307f9ccristy  pixel=GetPixelBlue(source,p)-(MagickRealType) GetPixelBlue(destination,q);
56614c08aed51c5899665ade97263692328eea4af106cristy  distance+=scale*pixel*pixel;
56624c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
56634c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
56644c08aed51c5899665ade97263692328eea4af106cristy  return(MagickTrue);
56654c08aed51c5899665ade97263692328eea4af106cristy}
56664c08aed51c5899665ade97263692328eea4af106cristy
56674c08aed51c5899665ade97263692328eea4af106cristy/*
56684c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56694c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
56704c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
56714c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
56724c08aed51c5899665ade97263692328eea4af106cristy+   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                     %
56734c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
56744c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
56754c08aed51c5899665ade97263692328eea4af106cristy%                                                                             %
56764c08aed51c5899665ade97263692328eea4af106cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56774c08aed51c5899665ade97263692328eea4af106cristy%
56784c08aed51c5899665ade97263692328eea4af106cristy%  IsFuzzyEquivalencePixelInfo() returns true if the distance between two
56794c08aed51c5899665ade97263692328eea4af106cristy%  colors is less than the specified distance in a linear three (or four)
56804c08aed51c5899665ade97263692328eea4af106cristy%  dimensional color space.
56814c08aed51c5899665ade97263692328eea4af106cristy%
56825f95f4f77efc46ff53593d750491c8f60698c983cristy%  This implements the equivalent of:
56835f95f4f77efc46ff53593d750491c8f60698c983cristy%    fuzz < sqrt(color_distance^2 * u.a*v.a  + alpha_distance^2)
56844c08aed51c5899665ade97263692328eea4af106cristy%
56854c08aed51c5899665ade97263692328eea4af106cristy%  Which produces a multi-dimensional cone for that colorspace along the
56864c08aed51c5899665ade97263692328eea4af106cristy%  transparency vector.
56874c08aed51c5899665ade97263692328eea4af106cristy%
56885f95f4f77efc46ff53593d750491c8f60698c983cristy%  For example for an RGB:
56894c08aed51c5899665ade97263692328eea4af106cristy%    color_distance^2  = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3
56904c08aed51c5899665ade97263692328eea4af106cristy%
56914c08aed51c5899665ade97263692328eea4af106cristy%  See http://www.imagemagick.org/Usage/bugs/fuzz_distance/
56924c08aed51c5899665ade97263692328eea4af106cristy%
56934c08aed51c5899665ade97263692328eea4af106cristy%  Hue colorspace distances need more work.  Hue is not a distance, it is an
56944c08aed51c5899665ade97263692328eea4af106cristy%  angle!
56954c08aed51c5899665ade97263692328eea4af106cristy%
56964c08aed51c5899665ade97263692328eea4af106cristy%  A check that q is in the same color space as p should be made and the
56974c08aed51c5899665ade97263692328eea4af106cristy%  appropriate mapping made.  -- Anthony Thyssen  8 December 2010
56984c08aed51c5899665ade97263692328eea4af106cristy%
56994c08aed51c5899665ade97263692328eea4af106cristy%  The format of the IsFuzzyEquivalencePixelInfo method is:
57004c08aed51c5899665ade97263692328eea4af106cristy%
57014c08aed51c5899665ade97263692328eea4af106cristy%      MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
57024c08aed51c5899665ade97263692328eea4af106cristy%        const PixelInfo *q)
57034c08aed51c5899665ade97263692328eea4af106cristy%
57044c08aed51c5899665ade97263692328eea4af106cristy%  A description of each parameter follows:
57054c08aed51c5899665ade97263692328eea4af106cristy%
57064c08aed51c5899665ade97263692328eea4af106cristy%    o p: Pixel p.
57074c08aed51c5899665ade97263692328eea4af106cristy%
57084c08aed51c5899665ade97263692328eea4af106cristy%    o q: Pixel q.
57094c08aed51c5899665ade97263692328eea4af106cristy%
57104c08aed51c5899665ade97263692328eea4af106cristy*/
57114c08aed51c5899665ade97263692328eea4af106cristyMagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
57124c08aed51c5899665ade97263692328eea4af106cristy  const PixelInfo *q)
57134c08aed51c5899665ade97263692328eea4af106cristy{
57144c08aed51c5899665ade97263692328eea4af106cristy  MagickRealType
57154c08aed51c5899665ade97263692328eea4af106cristy    fuzz,
57164c08aed51c5899665ade97263692328eea4af106cristy    pixel;
57174c08aed51c5899665ade97263692328eea4af106cristy
57184c08aed51c5899665ade97263692328eea4af106cristy  register MagickRealType
57194c08aed51c5899665ade97263692328eea4af106cristy    scale,
57204c08aed51c5899665ade97263692328eea4af106cristy    distance;
57214c08aed51c5899665ade97263692328eea4af106cristy
57224c08aed51c5899665ade97263692328eea4af106cristy  if ((p->fuzz == 0.0) && (q->fuzz == 0.0))
57234c08aed51c5899665ade97263692328eea4af106cristy    return(IsPixelInfoEquivalent(p,q));
57244c08aed51c5899665ade97263692328eea4af106cristy  if (p->fuzz == 0.0)
57255f95f4f77efc46ff53593d750491c8f60698c983cristy    fuzz=MagickMax(q->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(q->fuzz,
57265f95f4f77efc46ff53593d750491c8f60698c983cristy      (MagickRealType) MagickSQ1_2);
57274c08aed51c5899665ade97263692328eea4af106cristy  else if (q->fuzz == 0.0)
57285f95f4f77efc46ff53593d750491c8f60698c983cristy    fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(p->fuzz,
57295f95f4f77efc46ff53593d750491c8f60698c983cristy      (MagickRealType) MagickSQ1_2);
57304c08aed51c5899665ade97263692328eea4af106cristy  else
57315f95f4f77efc46ff53593d750491c8f60698c983cristy    fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(q->fuzz,
57325f95f4f77efc46ff53593d750491c8f60698c983cristy      (MagickRealType) MagickSQ1_2);
57334c08aed51c5899665ade97263692328eea4af106cristy  scale=1.0;
57344c08aed51c5899665ade97263692328eea4af106cristy  distance=0.0;
57354c08aed51c5899665ade97263692328eea4af106cristy  if ((p->matte != MagickFalse) || (q->matte != MagickFalse))
57364c08aed51c5899665ade97263692328eea4af106cristy    {
57374c08aed51c5899665ade97263692328eea4af106cristy      /*
57384c08aed51c5899665ade97263692328eea4af106cristy        Transparencies are involved - set alpha distance.
57394c08aed51c5899665ade97263692328eea4af106cristy      */
57404c08aed51c5899665ade97263692328eea4af106cristy      pixel=(p->matte != MagickFalse ? p->alpha : OpaqueAlpha)-
57414c08aed51c5899665ade97263692328eea4af106cristy        (q->matte != MagickFalse ? q->alpha : OpaqueAlpha);
57424c08aed51c5899665ade97263692328eea4af106cristy      distance=pixel*pixel;
57434c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
57444c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
57454c08aed51c5899665ade97263692328eea4af106cristy      /*
57464c08aed51c5899665ade97263692328eea4af106cristy        Generate a alpha scaling factor to generate a 4D cone on colorspace.
57475f95f4f77efc46ff53593d750491c8f60698c983cristy        If one color is transparent, distance has no color component.
57484c08aed51c5899665ade97263692328eea4af106cristy      */
57494c08aed51c5899665ade97263692328eea4af106cristy      if (p->matte != MagickFalse)
57504c08aed51c5899665ade97263692328eea4af106cristy        scale=(QuantumScale*p->alpha);
57514c08aed51c5899665ade97263692328eea4af106cristy      if (q->matte != MagickFalse)
57524c08aed51c5899665ade97263692328eea4af106cristy        scale*=(QuantumScale*q->alpha);
57534c08aed51c5899665ade97263692328eea4af106cristy      if (scale <= MagickEpsilon )
57544c08aed51c5899665ade97263692328eea4af106cristy        return(MagickTrue);
57554c08aed51c5899665ade97263692328eea4af106cristy    }
57564c08aed51c5899665ade97263692328eea4af106cristy  /*
57574c08aed51c5899665ade97263692328eea4af106cristy    CMYK create a CMY cube with a multi-dimensional cone toward black.
57584c08aed51c5899665ade97263692328eea4af106cristy  */
57594c08aed51c5899665ade97263692328eea4af106cristy  if (p->colorspace == CMYKColorspace)
57604c08aed51c5899665ade97263692328eea4af106cristy    {
57614c08aed51c5899665ade97263692328eea4af106cristy      pixel=p->black-q->black;
57624c08aed51c5899665ade97263692328eea4af106cristy      distance+=pixel*pixel*scale;
57634c08aed51c5899665ade97263692328eea4af106cristy      if (distance > fuzz)
57644c08aed51c5899665ade97263692328eea4af106cristy        return(MagickFalse);
57654c08aed51c5899665ade97263692328eea4af106cristy      scale*=(MagickRealType) (QuantumScale*(QuantumRange-p->black));
57664c08aed51c5899665ade97263692328eea4af106cristy      scale*=(MagickRealType) (QuantumScale*(QuantumRange-q->black));
57674c08aed51c5899665ade97263692328eea4af106cristy    }
57684c08aed51c5899665ade97263692328eea4af106cristy  /*
57694c08aed51c5899665ade97263692328eea4af106cristy    RGB or CMY color cube.
57704c08aed51c5899665ade97263692328eea4af106cristy  */
57714c08aed51c5899665ade97263692328eea4af106cristy  distance*=3.0;  /* rescale appropriately */
57724c08aed51c5899665ade97263692328eea4af106cristy  fuzz*=3.0;
57734c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->red-q->red;
57744c08aed51c5899665ade97263692328eea4af106cristy  if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) ||
57754c08aed51c5899665ade97263692328eea4af106cristy      (p->colorspace == HWBColorspace))
57764c08aed51c5899665ade97263692328eea4af106cristy    {
57775f95f4f77efc46ff53593d750491c8f60698c983cristy      /*
57785f95f4f77efc46ff53593d750491c8f60698c983cristy        This calculates a arc distance for hue-- it should be a vector angle
57795f95f4f77efc46ff53593d750491c8f60698c983cristy        of 'S'/'W' length with 'L'/'B' forming appropriate cones.  In other
57805f95f4f77efc46ff53593d750491c8f60698c983cristy        words this is a hack - Anthony.
57814c08aed51c5899665ade97263692328eea4af106cristy      */
57824c08aed51c5899665ade97263692328eea4af106cristy      if (fabs((double) pixel) > (QuantumRange/2))
57834c08aed51c5899665ade97263692328eea4af106cristy        pixel-=QuantumRange;
57844c08aed51c5899665ade97263692328eea4af106cristy      pixel*=2;
57854c08aed51c5899665ade97263692328eea4af106cristy    }
57864c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
57874c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
57884c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
57894c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->green-q->green;
57904c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
57914c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
57924c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
57934c08aed51c5899665ade97263692328eea4af106cristy  pixel=p->blue-q->blue;
57944c08aed51c5899665ade97263692328eea4af106cristy  distance+=pixel*pixel*scale;
57954c08aed51c5899665ade97263692328eea4af106cristy  if (distance > fuzz)
57964c08aed51c5899665ade97263692328eea4af106cristy    return(MagickFalse);
57974c08aed51c5899665ade97263692328eea4af106cristy  return(MagickTrue);
57984c08aed51c5899665ade97263692328eea4af106cristy}
57992b9582a27910c7baaeb04b7e969638328fa70095cristy
58002b9582a27910c7baaeb04b7e969638328fa70095cristy/*
58012b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58022b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58032b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58042b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
5805e2a912b6c9086c98ec838baa0824cd8deca55538cristy%   S e t P i x e l C h a n n e l M a p M a s k                               %
58062b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58072b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58082b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58092b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58102b9582a27910c7baaeb04b7e969638328fa70095cristy%
5811e2a912b6c9086c98ec838baa0824cd8deca55538cristy%  SetPixelChannelMapMask() sets the pixel channel map from the specified
5812e2a912b6c9086c98ec838baa0824cd8deca55538cristy%  channel mask.
58132b9582a27910c7baaeb04b7e969638328fa70095cristy%
5814e2a912b6c9086c98ec838baa0824cd8deca55538cristy%  The format of the SetPixelChannelMapMask method is:
58152b9582a27910c7baaeb04b7e969638328fa70095cristy%
5816e2a912b6c9086c98ec838baa0824cd8deca55538cristy%      void SetPixelChannelMapMask(Image *image,const ChannelType channel_mask)
58172b9582a27910c7baaeb04b7e969638328fa70095cristy%
58182b9582a27910c7baaeb04b7e969638328fa70095cristy%  A description of each parameter follows:
58192b9582a27910c7baaeb04b7e969638328fa70095cristy%
58202b9582a27910c7baaeb04b7e969638328fa70095cristy%    o image: the image.
58212b9582a27910c7baaeb04b7e969638328fa70095cristy%
5822dfdb19ea2c08296b31fef860352c0a6efe8e9cc6cristy%    o channel_mask: the channel mask.
58232b9582a27910c7baaeb04b7e969638328fa70095cristy%
58242b9582a27910c7baaeb04b7e969638328fa70095cristy*/
5825e2a912b6c9086c98ec838baa0824cd8deca55538cristyMagickExport void SetPixelChannelMapMask(Image *image,
582607a6785ad974f0631a83731fe5d7fb85751ca235cristy  const ChannelType channel_mask)
58272b9582a27910c7baaeb04b7e969638328fa70095cristy{
58286a917d6c8b1695012e26389d2ec303267676815fcristy#define GetChannelBit(mask,bit)  (((size_t) (mask) >> (size_t) (bit)) & 0x01)
5829dafd287faca4c8cd5415d13185973add9c02b2c4cristy
58302b9582a27910c7baaeb04b7e969638328fa70095cristy  register ssize_t
58312b9582a27910c7baaeb04b7e969638328fa70095cristy    i;
58322b9582a27910c7baaeb04b7e969638328fa70095cristy
5833177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy  if (image->debug != MagickFalse)
5834177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy    (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%08x]", \
5835177e41c20ccba692bc4c7797aeb817b2f80c7e8ccristy      image->filename,channel_mask); \
58363c30981743f8543ca2ccc0d19de8fbda2b3639c6cristy  image->channel_mask=channel_mask;
5837dafd287faca4c8cd5415d13185973add9c02b2c4cristy  for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
5838e2a912b6c9086c98ec838baa0824cd8deca55538cristy  {
5839e2a912b6c9086c98ec838baa0824cd8deca55538cristy    PixelChannel
5840e2a912b6c9086c98ec838baa0824cd8deca55538cristy      channel;
5841e2a912b6c9086c98ec838baa0824cd8deca55538cristy
5842e2a912b6c9086c98ec838baa0824cd8deca55538cristy    channel=GetPixelChannelMapChannel(image,i);
5843e2a912b6c9086c98ec838baa0824cd8deca55538cristy    SetPixelChannelMapTraits(image,channel,
5844e2a912b6c9086c98ec838baa0824cd8deca55538cristy      GetChannelBit(channel_mask,channel) == 0 ? CopyPixelTrait :
58450bbd87c90725154145a972d3efbc4c5124455fe3cristy      image->matte == MagickFalse || (channel == AlphaPixelChannel) ?
58460bbd87c90725154145a972d3efbc4c5124455fe3cristy      UpdatePixelTrait : (PixelTrait) (UpdatePixelTrait | BlendPixelTrait));
5847e2a912b6c9086c98ec838baa0824cd8deca55538cristy  }
58481685e7216ce4e5fac701834cd7db6eee6d426234cristy  if (image->storage_class == PseudoClass)
58491685e7216ce4e5fac701834cd7db6eee6d426234cristy    SetPixelChannelMapTraits(image,IndexPixelChannel,CopyPixelTrait);
5850183a5c7d1c8a9a747766ff9a2ef067853a7066e9cristy  if (image->mask != MagickFalse)
585110a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy    SetPixelChannelMapTraits(image,MaskPixelChannel,CopyPixelTrait);
58526dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy  if (image->debug != MagickFalse)
58536dcb9b8f58179c62fb386bf2bc02c8ba901dfb15cristy    LogPixelChannels(image);
58542b9582a27910c7baaeb04b7e969638328fa70095cristy}
58552b9582a27910c7baaeb04b7e969638328fa70095cristy
58562b9582a27910c7baaeb04b7e969638328fa70095cristy/*
58572b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58582b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58592b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58602b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
5861bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%   S e t P i x e l C h a n n e l M a s k                                     %
58622b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58632b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58642b9582a27910c7baaeb04b7e969638328fa70095cristy%                                                                             %
58652b9582a27910c7baaeb04b7e969638328fa70095cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58662b9582a27910c7baaeb04b7e969638328fa70095cristy%
58675f95f4f77efc46ff53593d750491c8f60698c983cristy%  SetPixelChannelMask() sets the pixel channel mask from the specified channel
58685f95f4f77efc46ff53593d750491c8f60698c983cristy%  mask.
58692b9582a27910c7baaeb04b7e969638328fa70095cristy%
5870bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%  The format of the SetPixelChannelMask method is:
58712b9582a27910c7baaeb04b7e969638328fa70095cristy%
5872bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%      ChannelType SetPixelChannelMask(Image *image,
5873bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%        const ChannelType channel_mask)
58742b9582a27910c7baaeb04b7e969638328fa70095cristy%
58752b9582a27910c7baaeb04b7e969638328fa70095cristy%  A description of each parameter follows:
58762b9582a27910c7baaeb04b7e969638328fa70095cristy%
58772b9582a27910c7baaeb04b7e969638328fa70095cristy%    o image: the image.
58782b9582a27910c7baaeb04b7e969638328fa70095cristy%
5879bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%    o channel_mask: the channel mask.
5880bd5a96cd2b69f218f85a7adc306296a736f91a56cristy%
58812b9582a27910c7baaeb04b7e969638328fa70095cristy*/
5882bd5a96cd2b69f218f85a7adc306296a736f91a56cristyMagickExport ChannelType SetPixelChannelMask(Image *image,
5883bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  const ChannelType channel_mask)
58842b9582a27910c7baaeb04b7e969638328fa70095cristy{
5885bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  ChannelType
5886bd5a96cd2b69f218f85a7adc306296a736f91a56cristy    mask;
588794c50bac20b1e1070a88b490fd6823fce1de400ecristy
5888bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  mask=image->channel_mask;
5889bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  image->channel_mask=channel_mask;
5890e2a912b6c9086c98ec838baa0824cd8deca55538cristy  SetPixelChannelMapMask(image,channel_mask);
5891bd5a96cd2b69f218f85a7adc306296a736f91a56cristy  return(mask);
58922b9582a27910c7baaeb04b7e969638328fa70095cristy}
5893322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy
5894322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy/*
5895322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5896322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
5897322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
5898322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
5899322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%   S e t P i x e l M e t a C h a n n e l s                                   %
5900322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
5901322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
5902322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%                                                                             %
5903322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5904322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5905322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  SetPixelMetaChannels() sets the image meta channels.
5906322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5907322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  The format of the SetPixelMetaChannels method is:
5908322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5909322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%      MagickBooleanType SetPixelMetaChannels(Image *image,
5910322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%        const size_t number_meta_channels,ExceptionInfo *exception)
5911322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5912322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%  A description of each parameter follows:
5913322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5914322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o image: the image.
5915322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5916322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o number_meta_channels:  the number of meta channels.
5917322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5918322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%    o exception: return any errors or warnings in this structure.
5919322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy%
5920322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy*/
5921322d07da43d795a7c3b9a2d068d9a9005591cbe4cristyMagickExport MagickBooleanType SetPixelMetaChannels(Image *image,
5922322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  const size_t number_meta_channels,ExceptionInfo *exception)
5923322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy{
5924322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  image->number_meta_channels=number_meta_channels;
5925322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy  return(SyncImagePixelCache(image,exception));
5926322d07da43d795a7c3b9a2d068d9a9005591cbe4cristy}
5927