pixel.c revision 99abff36ae5d479bfd76652d166a4894ceada102
1de4a1d01951937632098a6cda45859afa587a06fsewardj/*
2de4a1d01951937632098a6cda45859afa587a06fsewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
48bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn%                                                                             %
5de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
6de4a1d01951937632098a6cda45859afa587a06fsewardj%                      PPPP   IIIII  X   X  EEEEE  L                          %
7de4a1d01951937632098a6cda45859afa587a06fsewardj%                      P   P    I     X X   E      L                          %
8b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn%                      PPPP     I      X    EEE    L                          %
9b9c427c63a278cc612ae0ec573be7bb1abaa447fnjn%                      P        I     X X   E      L                          %
10de4a1d01951937632098a6cda45859afa587a06fsewardj%                      P      IIIII  X   X  EEEEE  LLLLL                      %
1103f8d3fc25f5a45c5826259d1b33b7f310117279sewardj%                                                                             %
12de4a1d01951937632098a6cda45859afa587a06fsewardj%                  MagickCore Methods to Import/Export Pixels                 %
13de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
14de4a1d01951937632098a6cda45859afa587a06fsewardj%                             Software Design                                 %
15de4a1d01951937632098a6cda45859afa587a06fsewardj%                               John Cristy                                   %
16de4a1d01951937632098a6cda45859afa587a06fsewardj%                               October 1998                                  %
17de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
18de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
19de4a1d01951937632098a6cda45859afa587a06fsewardj%  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
20de4a1d01951937632098a6cda45859afa587a06fsewardj%  dedicated to making software imaging solutions freely available.           %
21de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
22de4a1d01951937632098a6cda45859afa587a06fsewardj%  You may not use this file except in compliance with the License.  You may  %
23de4a1d01951937632098a6cda45859afa587a06fsewardj%  obtain a copy of the License at                                            %
24de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
25de4a1d01951937632098a6cda45859afa587a06fsewardj%    http://www.imagemagick.org/script/license.php                            %
26de4a1d01951937632098a6cda45859afa587a06fsewardj%                                                                             %
27de4a1d01951937632098a6cda45859afa587a06fsewardj%  Unless required by applicable law or agreed to in writing, software        %
28de4a1d01951937632098a6cda45859afa587a06fsewardj%  distributed under the License is distributed on an "AS IS" BASIS,          %
29e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
30de4a1d01951937632098a6cda45859afa587a06fsewardj%  See the License for the specific language governing permissions and        %
31de4a1d01951937632098a6cda45859afa587a06fsewardj%  limitations under the License.                                             %
32c7561b931e249acf3768ead77638545b0ccaa8f1njn%                                                                             %
3345f4e7c91119c7d01a59f5e827c67841632c9314sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
3597405b2d134b52880d6dbec3eb2929e2002c2542njn%
36291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj*/
37291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
38132bfccd21960e462352175f8553a5bdce8a210cnjn/*
3936a20fa5f779a0a6fb7b4a90dcaa6376481f1faanjn  Include declarations.
402024234c590f408994b373abfb00bc2cd2a90c48njn*/
4110f08cf5b84882eebbb6712a7be890577650e8adsewardj#include "MagickCore/studio.h"
428bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn#include "MagickCore/property.h"
4345f4e7c91119c7d01a59f5e827c67841632c9314sewardj#include "MagickCore/blob.h"
4445f4e7c91119c7d01a59f5e827c67841632c9314sewardj#include "MagickCore/blob-private.h"
45291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj#include "MagickCore/color-private.h"
46291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj#include "MagickCore/draw.h"
4759570ffbe31930ab4d678754daaeec0715117a3dsewardj#include "MagickCore/exception.h"
4859570ffbe31930ab4d678754daaeec0715117a3dsewardj#include "MagickCore/exception-private.h"
493a5322057616d0da214b9e0f897866e203c03e40philippe#include "MagickCore/cache.h"
5018d7513cc08bf982711c8a22b70d56af6aa87b33sewardj#include "MagickCore/constitute.h"
51de4a1d01951937632098a6cda45859afa587a06fsewardj#include "MagickCore/delegate.h"
526c3769f487145a08c01b58d6e5db3ba274062ad4sewardj#include "MagickCore/geometry.h"
536c3769f487145a08c01b58d6e5db3ba274062ad4sewardj#include "MagickCore/image-private.h"
546c3769f487145a08c01b58d6e5db3ba274062ad4sewardj#include "MagickCore/list.h"
55de4a1d01951937632098a6cda45859afa587a06fsewardj#include "MagickCore/magick.h"
566c3769f487145a08c01b58d6e5db3ba274062ad4sewardj#include "MagickCore/memory_.h"
57de4a1d01951937632098a6cda45859afa587a06fsewardj#include "MagickCore/monitor.h"
58fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj#include "MagickCore/option.h"
59fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj#include "MagickCore/pixel.h"
60fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj#include "MagickCore/pixel-accessor.h"
61de4a1d01951937632098a6cda45859afa587a06fsewardj#include "MagickCore/quantum.h"
62fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj#include "MagickCore/quantum-private.h"
636c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj#include "MagickCore/resource_.h"
646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj#include "MagickCore/semaphore.h"
656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj#include "MagickCore/statistic.h"
666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj#include "MagickCore/stream.h"
67e25053c5aaefc6a4039dcd557adf24d8bb23db69sewardj#include "MagickCore/string_.h"
68de4a1d01951937632098a6cda45859afa587a06fsewardj#include "MagickCore/transform.h"
69fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj#include "MagickCore/utility.h"
70fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj
71fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj#define LogPixelChannels(image) \
725d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj{ \
73de4a1d01951937632098a6cda45859afa587a06fsewardj  register ssize_t \
74fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    i; \
75fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj \
76fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj  (void) LogMagickEvent(PixelEvent,GetMagickModule(),"%s[%.20g]", \
776c3769f487145a08c01b58d6e5db3ba274062ad4sewardj    image->filename,(double) image->number_channels); \
786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  for (i=0; i < (ssize_t) image->number_channels; i++) \
796c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  { \
806c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    char \
816c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      traits[MaxTextExtent]; \
826c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj \
836c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    const char \
846c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      *name; \
856c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj \
866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    PixelChannel \
876c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      channel; \
886c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj \
89de4a1d01951937632098a6cda45859afa587a06fsewardj    switch (GetPixelChannelMapChannel(image,i)) \
906c3769f487145a08c01b58d6e5db3ba274062ad4sewardj    { \
91de4a1d01951937632098a6cda45859afa587a06fsewardj      case RedPixelChannel: \
92291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      { \
93291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        name="red"; \
94291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->colorspace == CMYKColorspace) \
95291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          name="cyan"; \
96291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->colorspace == GRAYColorspace) \
97291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          name="gray"; \
98291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break; \
99291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      } \
100291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case GreenPixelChannel: \
101291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      { \
102291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        name="green"; \
103291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->colorspace == CMYKColorspace) \
104291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          name="magenta"; \
105291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break; \
106291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      } \
107291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case BluePixelChannel: \
108291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      { \
109291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        name="blue"; \
110291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->colorspace == CMYKColorspace) \
111291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          name="yellow"; \
112291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break; \
113291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      } \
114291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case BlackPixelChannel: \
115291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      { \
116291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        name="black"; \
117291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->storage_class == PseudoClass) \
118291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          name="index"; \
119291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break; \
120291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      } \
121291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case IndexPixelChannel: \
122291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      { \
123291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        name="index"; \
124291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break; \
125291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      } \
126291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case AlphaPixelChannel: \
127291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      { \
128291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        name="alpha"; \
129291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break; \
130291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      } \
131291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case MaskPixelChannel: \
132fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      { \
133fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        name="mask"; \
134fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        break; \
1356c3769f487145a08c01b58d6e5db3ba274062ad4sewardj      } \
1366c3769f487145a08c01b58d6e5db3ba274062ad4sewardj      case MetaPixelChannel: \
137fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      { \
138fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        name="meta"; \
139fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        break; \
140fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      } \
141fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      default: \
142fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        name="undefined"; \
143291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    } \
144fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    channel=GetPixelChannelMapChannel(image,i); \
145fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    *traits='\0'; \
146fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    if ((GetPixelChannelMapTraits(image,channel) & UpdatePixelTrait) != 0) \
147fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      (void) ConcatenateMagickString(traits,"update,",MaxTextExtent); \
148fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    if ((GetPixelChannelMapTraits(image,channel) & BlendPixelTrait) != 0) \
149fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      (void) ConcatenateMagickString(traits,"blend,",MaxTextExtent); \
1505f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    if ((GetPixelChannelMapTraits(image,channel) & CopyPixelTrait) != 0) \
1515f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      (void) ConcatenateMagickString(traits,"copy,",MaxTextExtent); \
1525f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    if (*traits == '\0') \
1535f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      (void) ConcatenateMagickString(traits,"undefined,",MaxTextExtent); \
154fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    traits[strlen(traits)-1]='\0'; \
155fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    (void) LogMagickEvent(PixelEvent,GetMagickModule(),"  %.20g: %s (%s)", \
156fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      (double) i,name,traits); \
157fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj  } \
158fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj}
159fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj
160fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj/*
161fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
162fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
163fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
164fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
165fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj+   A c q u i r e P i x e l C h a n n e l M a p                               %
166fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
167fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
168fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
169fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1706c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
1716c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  AcquirePixelChannelMap() acquires a pixel component map.
1726c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
1736c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  The format of the AcquirePixelChannelMap() method is:
1746c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
1756c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      PixelChannelMap *AcquirePixelChannelMap(void)
1766c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
1776c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj*/
1786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardjMagickExport PixelChannelMap *AcquirePixelChannelMap(void)
1796c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj{
1806c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  PixelChannelMap
1816c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    *channel_map;
1826c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
1836c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  register ssize_t
184291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    i;
185291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
186291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  channel_map=(PixelChannelMap *) AcquireQuantumMemory(MaxPixelChannels,
187291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    sizeof(*channel_map));
188291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  if (channel_map == (PixelChannelMap *) NULL)
189291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
190291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  (void) ResetMagickMemory(channel_map,0,MaxPixelChannels*sizeof(*channel_map));
191291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  for (i=0; i < MaxPixelChannels; i++)
192291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    channel_map[i].channel=(PixelChannel) i;
193291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  return(channel_map);
194291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj}
195291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
196291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*
197291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
198291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
199291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
200291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
201291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj+   C l o n e P i x e l C h a n n e l M a p                                   %
202291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
203291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
204291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
205291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
206291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
207291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  ClonePixelChannelMap() clones a pixel component map.
208291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
209291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  The format of the ClonePixelChannelMap() method is:
210291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
211291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%      PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
212291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
213291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  A description of each parameter follows:
214291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
215291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%    o channel_map: the pixel component map.
216291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
217291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj*/
218291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjMagickExport PixelChannelMap *ClonePixelChannelMap(PixelChannelMap *channel_map)
219291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj{
220291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  PixelChannelMap
221291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    *clone_map;
222291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
223291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  assert(channel_map != (PixelChannelMap *) NULL);
224291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  clone_map=AcquirePixelChannelMap();
225291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  if (clone_map == (PixelChannelMap *) NULL)
226291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    return((PixelChannelMap *) NULL);
227291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  (void) CopyMagickMemory(clone_map,channel_map,MaxPixelChannels*
228291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    sizeof(*channel_map));
229291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  return(clone_map);
230291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj}
231291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
232291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*
233291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
234291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
235291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
236291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
237291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj+   C l o n e P i x e l I n f o                                               %
238291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
239291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
240291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
241291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
242291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
243291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  ClonePixelInfo() makes a duplicate of the given pixel info structure, or if
244291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  pixel info is NULL, a new one.
245291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
246291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  The format of the ClonePixelInfo method is:
247291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
248291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%      PixelInfo *ClonePixelInfo(const PixelInfo *pixel_info)
249291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
250291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  A description of each parameter follows:
251291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
252291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%    o pixel_info: the pixel info.
253291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
254291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj*/
255291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjMagickExport PixelInfo *ClonePixelInfo(const PixelInfo *pixel)
256291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj{
257291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  PixelInfo
258291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    *pixel_info;
259291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
260291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  pixel_info=(PixelInfo *) AcquireQuantumMemory(1,sizeof(*pixel_info));
261291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  if (pixel_info == (PixelInfo *) NULL)
262291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
263291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  *pixel_info=(*pixel);
264291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  return(pixel_info);
265291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj}
266291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
267291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*
268291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
269291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
270291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
271291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
272291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj+   D e s t r o y P i x e l C h a n n e l M a p                               %
273291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
274291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
275291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
276291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
277291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
278291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  DestroyPixelChannelMap() deallocates memory associated with the pixel
279291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  channel map.
2806c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%
2816c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%  The format of the DestroyPixelChannelMap() method is:
2826c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%
2834ccf707a1b52898b878fc90dc0054a0c23cc9fccsewardj%      PixelChannelMap *DestroyPixelChannelMap(PixelChannelMap *channel_map)
284291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
285291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  A description of each parameter follows:
286291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
287291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%    o channel_map: the pixel component map.
288291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
289291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj*/
290291849fb0285e0998b4c9e33eb153eb3373c4a88sewardjMagickExport PixelChannelMap *DestroyPixelChannelMap(
291291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  PixelChannelMap *channel_map)
292291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj{
293291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  assert(channel_map != (PixelChannelMap *) NULL);
294291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  channel_map=(PixelChannelMap *) RelinquishMagickMemory(channel_map);
295fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj  return((PixelChannelMap *) RelinquishMagickMemory(channel_map));
296fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj}
297fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj
298291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj/*
2994ccf707a1b52898b878fc90dc0054a0c23cc9fccsewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
300fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
301fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
302fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
303fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%   E x p o r t I m a g e P i x e l s                                         %
304fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
305fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
306fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%                                                                             %
307fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
308fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%
309fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%  ExportImagePixels() extracts pixel data from an image and returns it to you.
3104ccf707a1b52898b878fc90dc0054a0c23cc9fccsewardj%  The method returns MagickTrue on success otherwise MagickFalse if an error is
311fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%  encountered.  The data is returned as char, short int, int, ssize_t, float,
312fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%  or double in the order specified by map.
313fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%
3146c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%  Suppose you want to extract the first scanline of a 640x480 image as
315fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%  character data in red-green-blue order:
316fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%
317de4a1d01951937632098a6cda45859afa587a06fsewardj%      ExportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels,exception);
318fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%
319fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%  The format of the ExportImagePixels method is:
3206c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
3216c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      MagickBooleanType ExportImagePixels(const Image *image,
3226c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%        const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
3236c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%        const size_t rows,const char *map,const StorageType type,
3246c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%        void *pixels,ExceptionInfo *exception)
3256c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
3266c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  A description of each parameter follows:
3276c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
328291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%    o image: the image.
329291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
330291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%    o x_offset,y_offset,columns,rows:  These values define the perimeter
331291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%      of a region of pixels you want to extract.
332291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
333fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%    o map:  This string reflects the expected ordering of the pixel array.
334fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%      It can be any combination or order of R = red, G = green, B = blue,
335de4a1d01951937632098a6cda45859afa587a06fsewardj%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
336de4a1d01951937632098a6cda45859afa587a06fsewardj%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
3376c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%      P = pad.
3386c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%
339fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%    o type: Define the data type of the pixels.  Float and double types are
340fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
341fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%      types: CharPixel, DoublePixel, FloatPixel, IntegerPixel, LongPixel,
342fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%      QuantumPixel, or ShortPixel.
343fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%
344fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%    o pixels: This array of values contain the pixel components as defined by
345fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%      map and type.  You must preallocate this array where the expected
346fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%      length varies depending on the values of width, height, map, and type.
347fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%
348fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%    o exception: return any errors or warnings in this structure.
349fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj%
350fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj*/
351fa8ec113ecff891bdefb13dd361b40a503a992f8sewardjMagickExport MagickBooleanType ExportImagePixels(const Image *image,
352fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj  const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
3536c3769f487145a08c01b58d6e5db3ba274062ad4sewardj  const size_t rows,const char *map,const StorageType type,void *pixels,
354fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj  ExceptionInfo *exception)
355fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj{
356fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj  QuantumType
3576c3769f487145a08c01b58d6e5db3ba274062ad4sewardj    *quantum_map;
3586c3769f487145a08c01b58d6e5db3ba274062ad4sewardj
3595d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj  register ssize_t
3605d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj    i,
3615d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj    x;
3625d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj
3635d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj  register const Quantum
3645d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj    *p;
3655d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj
3665f76de086a6d643db51e50a4e623df7dfc9b6161sewardj  size_t
3675f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    length;
3685f76de086a6d643db51e50a4e623df7dfc9b6161sewardj
3696c3769f487145a08c01b58d6e5db3ba274062ad4sewardj  ssize_t
3705f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    y;
371fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj
372fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj  assert(image != (Image *) NULL);
373c0d8f68810eb79a5a6cb6049d6a4ab1de7dc4e18sewardj  assert(image->signature == MagickSignature);
3745f76de086a6d643db51e50a4e623df7dfc9b6161sewardj  if (image->debug != MagickFalse)
3755f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
3765f76de086a6d643db51e50a4e623df7dfc9b6161sewardj  length=strlen(map);
3775f76de086a6d643db51e50a4e623df7dfc9b6161sewardj  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
3785f76de086a6d643db51e50a4e623df7dfc9b6161sewardj  if (quantum_map == (QuantumType *) NULL)
3795f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    {
3805f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      (void) ThrowMagickException(exception,GetMagickModule(),
3815f76de086a6d643db51e50a4e623df7dfc9b6161sewardj        ResourceLimitError,"MemoryAllocationFailed","`%s'",image->filename);
3825f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      return(MagickFalse);
3835f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    }
3845f76de086a6d643db51e50a4e623df7dfc9b6161sewardj  for (i=0; i < (ssize_t) length; i++)
3855f76de086a6d643db51e50a4e623df7dfc9b6161sewardj  {
3865f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    switch (map[i])
3875f76de086a6d643db51e50a4e623df7dfc9b6161sewardj    {
3885f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      case 'A':
3895f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      case 'a':
390de4a1d01951937632098a6cda45859afa587a06fsewardj      {
391663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj        quantum_map[i]=AlphaQuantum;
392663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj        break;
393663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj      }
394663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj      case 'B':
395fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      case 'b':
396de4a1d01951937632098a6cda45859afa587a06fsewardj      {
397fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        quantum_map[i]=BlueQuantum;
398291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break;
399291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
40022854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj      case 'C':
401fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      case 'c':
402291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
403291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=CyanQuantum;
40422854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj        if (image->colorspace == CMYKColorspace)
40526412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj          break;
40626412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
407291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
408291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          "ColorSeparatedImageRequired","`%s'",map);
409291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        return(MagickFalse);
410291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
411de4a1d01951937632098a6cda45859afa587a06fsewardj      case 'g':
412fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      case 'G':
413291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
414291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=GreenQuantum;
415fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        break;
416fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      }
417291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'I':
418291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'i':
419291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
420291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=IndexQuantum;
421291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break;
422291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
423291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'K':
424291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'k':
42554fe2021b87b9e5edb8ec8070f47b86d5cafb8aaflorian      {
426291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=BlackQuantum;
427291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->colorspace == CMYKColorspace)
428291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
429291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
430291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
431291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          "ColorSeparatedImageRequired","`%s'",map);
432291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        return(MagickFalse);
433291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
434291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'M':
435291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'm':
436291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
437291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=MagentaQuantum;
438291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->colorspace == CMYKColorspace)
439291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
440291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
441291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
442291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          "ColorSeparatedImageRequired","`%s'",map);
443291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        return(MagickFalse);
444291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
445291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'o':
446291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'O':
447291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
448291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=OpacityQuantum;
449291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break;
450291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
451291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'P':
452291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'p':
453291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
454291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=UndefinedQuantum;
455291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break;
456291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
457291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'R':
458291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'r':
459291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
460291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=RedQuantum;
461291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break;
462291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
463291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'Y':
464291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'y':
465291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
466291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=YellowQuantum;
467291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (image->colorspace == CMYKColorspace)
468291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
469291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
470291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        (void) ThrowMagickException(exception,GetMagickModule(),ImageError,
471291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          "ColorSeparatedImageRequired","`%s'",map);
472291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        return(MagickFalse);
473291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
474291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      default:
475291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
476291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
477291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
478291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          "UnrecognizedPixelMap","`%s'",map);
479291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        return(MagickFalse);
480291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
481291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    }
482291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  }
483291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  switch (type)
484291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  {
485291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    case CharPixel:
486291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    {
487291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      register unsigned char
488291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        *q;
489291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
490291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      q=(unsigned char *) pixels;
491291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGR") == 0)
492291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
493291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
494291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
495291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
496291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
497291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
498291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
499291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
500291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
501291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
502291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelRed(image,p));
503291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
504291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
505291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
506291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
507291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
508291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRA") == 0)
509291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
510291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
511291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
512291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
513291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
514291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
515291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
516291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
517291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
518291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
519291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelRed(image,p));
520291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
521291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
522291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
523291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
524291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
525291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
526291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRP") == 0)
527291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
528291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
529291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
530291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
531291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
532291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
533291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
534291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
535291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
536291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
537291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelRed(image,p));
538291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar((Quantum) 0);
539291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
540291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
541291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
542291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
543291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
544291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"I") == 0)
545291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
546291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
547291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
548291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
549291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
550291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
551291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
552291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
553291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelIntensity(image,p));
554291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
555291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
556291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
557291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
558291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
559291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGB") == 0)
560291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
561291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
562291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
563291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
564291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
565291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
566291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
567291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
568291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelRed(image,p));
569291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
570291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
571291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
572291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
573291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
574291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
575291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
576291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGBA") == 0)
577291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
578291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
579291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
580291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
581291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
582291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
583291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
584291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
585291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelRed(image,p));
586291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
587291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
588291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
589291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
590291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
591291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
592291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
593291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
594291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGBP") == 0)
595291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
596291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
597291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
598291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
599291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
600291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
601291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
602291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
603291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelRed(image,p));
604291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
605291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
606291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToChar((Quantum) 0);
607291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
608291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
609291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
610291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
611291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
612291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      for (y=0; y < (ssize_t) rows; y++)
613291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
614291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
615291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (p == (const Quantum *) NULL)
616291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
617291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        for (x=0; x < (ssize_t) columns; x++)
618291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
619291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (i=0; i < (ssize_t) length; i++)
620291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
621291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            *q=0;
622291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            switch (quantum_map[i])
623291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
624291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case RedQuantum:
625291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case CyanQuantum:
6266bd9dc18c043927c1196caba20a327238a179c42florian              {
627291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=ScaleQuantumToChar(GetPixelRed(image,p));
6286bd9dc18c043927c1196caba20a327238a179c42florian                break;
6296bd9dc18c043927c1196caba20a327238a179c42florian              }
630291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case GreenQuantum:
631291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case MagentaQuantum:
632291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
633291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=ScaleQuantumToChar(GetPixelGreen(image,p));
634291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
6353a5322057616d0da214b9e0f897866e203c03e40philippe              }
6363a5322057616d0da214b9e0f897866e203c03e40philippe              case BlueQuantum:
6373a5322057616d0da214b9e0f897866e203c03e40philippe              case YellowQuantum:
6383a5322057616d0da214b9e0f897866e203c03e40philippe              {
6393a5322057616d0da214b9e0f897866e203c03e40philippe                *q=ScaleQuantumToChar(GetPixelBlue(image,p));
6403a5322057616d0da214b9e0f897866e203c03e40philippe                break;
6413a5322057616d0da214b9e0f897866e203c03e40philippe              }
6423a5322057616d0da214b9e0f897866e203c03e40philippe              case AlphaQuantum:
6433a5322057616d0da214b9e0f897866e203c03e40philippe              {
6443a5322057616d0da214b9e0f897866e203c03e40philippe                *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
6453a5322057616d0da214b9e0f897866e203c03e40philippe                break;
6463a5322057616d0da214b9e0f897866e203c03e40philippe              }
6473a5322057616d0da214b9e0f897866e203c03e40philippe              case OpacityQuantum:
6483a5322057616d0da214b9e0f897866e203c03e40philippe              {
6493a5322057616d0da214b9e0f897866e203c03e40philippe                *q=ScaleQuantumToChar(GetPixelAlpha(image,p));
6503a5322057616d0da214b9e0f897866e203c03e40philippe                break;
6513a5322057616d0da214b9e0f897866e203c03e40philippe              }
6523a5322057616d0da214b9e0f897866e203c03e40philippe              case BlackQuantum:
6533a5322057616d0da214b9e0f897866e203c03e40philippe              {
6543a5322057616d0da214b9e0f897866e203c03e40philippe                if (image->colorspace == CMYKColorspace)
6553a5322057616d0da214b9e0f897866e203c03e40philippe                  *q=ScaleQuantumToChar(GetPixelBlack(image,p));
6563a5322057616d0da214b9e0f897866e203c03e40philippe                break;
6573a5322057616d0da214b9e0f897866e203c03e40philippe              }
6583a5322057616d0da214b9e0f897866e203c03e40philippe              case IndexQuantum:
6593a5322057616d0da214b9e0f897866e203c03e40philippe              {
6603a5322057616d0da214b9e0f897866e203c03e40philippe                *q=ScaleQuantumToChar(GetPixelIntensity(image,p));
6613a5322057616d0da214b9e0f897866e203c03e40philippe                break;
6623a5322057616d0da214b9e0f897866e203c03e40philippe              }
6633a5322057616d0da214b9e0f897866e203c03e40philippe              default:
6643a5322057616d0da214b9e0f897866e203c03e40philippe                break;
6653a5322057616d0da214b9e0f897866e203c03e40philippe            }
6663a5322057616d0da214b9e0f897866e203c03e40philippe            q++;
6673a5322057616d0da214b9e0f897866e203c03e40philippe          }
6683a5322057616d0da214b9e0f897866e203c03e40philippe          p+=GetPixelChannels(image);
669291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
670291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
671291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      break;
672291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    }
673291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    case DoublePixel:
674291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    {
675291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      register double
676291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        *q;
677291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
678291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      q=(double *) pixels;
679291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGR") == 0)
680291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
681291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
682291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
683291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
684291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
685291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
686291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
687291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
688291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelBlue(image,p));
689291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelGreen(image,p));
690291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelRed(image,p));
691291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
692291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
6936bd9dc18c043927c1196caba20a327238a179c42florian          }
694291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
695291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
696291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRA") == 0)
697291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
698291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
699291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
7003a5322057616d0da214b9e0f897866e203c03e40philippe            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
7013a5322057616d0da214b9e0f897866e203c03e40philippe            if (p == (const Quantum *) NULL)
7023a5322057616d0da214b9e0f897866e203c03e40philippe              break;
7033a5322057616d0da214b9e0f897866e203c03e40philippe            for (x=0; x < (ssize_t) columns; x++)
704291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
7053a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=(double) (QuantumScale*GetPixelBlue(image,p));
706291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelGreen(image,p));
707291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelRed(image,p));
708291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
709291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
710291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
711291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
712291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
713291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
714291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRP") == 0)
715291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
716291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
717291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
718291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
719291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
720291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
721291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
722291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
723291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelBlue(image,p));
724291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelGreen(image,p));
725291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelRed(image,p));
726291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=0.0;
727291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
728291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
729291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
730291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
731291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
732291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"I") == 0)
733291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
734291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
735291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
736291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
737291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
738291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
739291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
740291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
741291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelIntensity(image,p));
742291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
743291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
744291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
745291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
746291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
747291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGB") == 0)
748291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
749291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
750291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
751291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
752291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
753291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
754291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
755291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
756291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelRed(image,p));
757291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelGreen(image,p));
758291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelBlue(image,p));
759291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
760291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
761291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
762291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
763291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
764291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGBA") == 0)
765291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
766291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
767291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
768291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
769291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
770291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
771291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
772291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
773291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelRed(image,p));
774291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelGreen(image,p));
775291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelBlue(image,p));
776291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelAlpha(image,p));
777291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
778291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
779291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
780291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
781291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
782291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGBP") == 0)
783291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
784291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
785291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
786291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
787291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
788291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
789291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
790291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
791291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelRed(image,p));
792291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelGreen(image,p));
793291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(double) (QuantumScale*GetPixelBlue(image,p));
794291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=0.0;
795291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
796291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
797291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
798291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
799291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
800291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      for (y=0; y < (ssize_t) rows; y++)
801291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      {
802291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
803291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        if (p == (const Quantum *) NULL)
804291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
805291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        for (x=0; x < (ssize_t) columns; x++)
806291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
807291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (i=0; i < (ssize_t) length; i++)
808291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
809291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            *q=0;
810291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            switch (quantum_map[i])
811291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
812291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case RedQuantum:
813291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case CyanQuantum:
814291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
815291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=(double) (QuantumScale*GetPixelRed(image,p));
816291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
817291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
818291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case GreenQuantum:
819291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case MagentaQuantum:
820291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
821291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=(double) (QuantumScale*GetPixelGreen(image,p));
822291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
823291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
824291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case BlueQuantum:
825291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case YellowQuantum:
826291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
827291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=(double) (QuantumScale*GetPixelBlue(image,p));
828291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
829291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
830291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case AlphaQuantum:
831291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
832291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=(double) (QuantumScale*GetPixelAlpha(image,p));
833291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
834291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
835291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case OpacityQuantum:
836291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
837291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=(double) (QuantumScale*GetPixelAlpha(image,p));
838291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
839291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
840291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case BlackQuantum:
841291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
842291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                if (image->colorspace == CMYKColorspace)
84319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian                  *q=(double) (QuantumScale*
844291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                    GetPixelBlack(image,p));
845291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
846291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
847291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case IndexQuantum:
848291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
849291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=(double) (QuantumScale*GetPixelIntensity(image,p));
850291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
851291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
852291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              default:
853291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=0;
854291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
855291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            q++;
856291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
857291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          p+=GetPixelChannels(image);
858291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
859291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      }
860291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      break;
861291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    }
862291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    case FloatPixel:
863291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    {
864291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      register float
865291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        *q;
866291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj
867291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      q=(float *) pixels;
868291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGR") == 0)
869291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
870291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
871291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
872291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
8733a5322057616d0da214b9e0f897866e203c03e40philippe            if (p == (const Quantum *) NULL)
8743a5322057616d0da214b9e0f897866e203c03e40philippe              break;
875291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
876291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
877291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelBlue(image,p));
8783a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=(float) (QuantumScale*GetPixelGreen(image,p));
8793a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=(float) (QuantumScale*GetPixelRed(image,p));
8803a5322057616d0da214b9e0f897866e203c03e40philippe              p+=GetPixelChannels(image);
881291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
882291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
883291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
884291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
885291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRA") == 0)
886291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
887291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
888291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
889291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
890291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
891291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
892291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
893291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
894291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelBlue(image,p));
895291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelGreen(image,p));
896291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelRed(image,p));
897291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
898291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
899291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
900291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
901291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
902291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
903291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRP") == 0)
904291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
905291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
906291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
907291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
908291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
909291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
910291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
911291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
912291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelBlue(image,p));
913291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelGreen(image,p));
914291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(float) (QuantumScale*GetPixelRed(image,p));
915291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=0.0;
916291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
917291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
918291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
919291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
920291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
921291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"I") == 0)
922291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
923291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
924291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
925291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
926291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
927291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
928fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            for (x=0; x < (ssize_t) columns; x++)
929fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
9306c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelIntensity(image,p));
9316c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
9326c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
9336c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
9346c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
9356c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
9366c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"RGB") == 0)
9376c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
9386c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
9396c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
9406c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
9416c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
9426c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
9436c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
9446c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
9456c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelRed(image,p));
9466c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelGreen(image,p));
9476c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelBlue(image,p));
9486c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
9496c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
9506c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
9516c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
9526c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
9536c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"RGBA") == 0)
9546c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
9556c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
9566c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
9576c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
9586c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
9596c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
9606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
9616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
9626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelRed(image,p));
9636c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelGreen(image,p));
9646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelBlue(image,p));
9656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelAlpha(image,p));
9666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
9676c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
9686c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
9696c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
9706c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
9716c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"RGBP") == 0)
9726c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
9736c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
9746c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
9756c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
9766c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
9776c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
9786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
9796c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
9806c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelRed(image,p));
9816c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelGreen(image,p));
9826c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(float) (QuantumScale*GetPixelBlue(image,p));
9836c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=0.0;
9846c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
9856c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
9866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
9876c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
9886c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
9896c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      for (y=0; y < (ssize_t) rows; y++)
9906c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
9916c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
9926c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        if (p == (const Quantum *) NULL)
9936c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
9946c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        for (x=0; x < (ssize_t) columns; x++)
9956c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
9966c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (i=0; i < (ssize_t) length; i++)
9976c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
9986c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            *q=0;
9996c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            switch (quantum_map[i])
10006c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
10016c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case RedQuantum:
10026c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case CyanQuantum:
10036c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
10046c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(float) (QuantumScale*GetPixelRed(image,p));
10056c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
10066c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
10076c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case GreenQuantum:
10086c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case MagentaQuantum:
10096c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
10106c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(float) (QuantumScale*GetPixelGreen(image,p));
10116c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
10126c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
10136c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case BlueQuantum:
10146c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case YellowQuantum:
10156c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
10166c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(float) (QuantumScale*GetPixelBlue(image,p));
10176c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
10186c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
10196c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case AlphaQuantum:
10206c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
10216c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(float) (QuantumScale*((Quantum) (GetPixelAlpha(image,p))));
10226c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
10236c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
10246c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case OpacityQuantum:
10256c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
10263a5322057616d0da214b9e0f897866e203c03e40philippe                *q=(float) (QuantumScale*GetPixelAlpha(image,p));
10276c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
10286c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
10296c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case BlackQuantum:
10306c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
10316c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                if (image->colorspace == CMYKColorspace)
10326c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                  *q=(float) (QuantumScale* GetPixelBlack(image,p));
10336c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
10346c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
1035291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case IndexQuantum:
1036291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
10376c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(float) (QuantumScale*GetPixelIntensity(image,p));
10386c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
10396c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
1040291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              default:
10416c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=0;
10426c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
10436c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            q++;
10443a5322057616d0da214b9e0f897866e203c03e40philippe          }
10456c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          p+=GetPixelChannels(image);
10466c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
10476c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
10486c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      break;
10496c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    }
10506c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    case IntegerPixel:
10516c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    {
10526c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      register unsigned int
10536c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        *q;
10546c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
10556c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      q=(unsigned int *) pixels;
10566c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"BGR") == 0)
10576c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
10586c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
10596c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
10606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
10616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
10626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
10636c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
10646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
10656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
10666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
10676c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
10686c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
10696c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
10706c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
10716c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
10726c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
10736c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"BGRA") == 0)
10746c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
10756c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
10766c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
10776c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
10786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
10796c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
10806c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
10816c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
10826c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
10836c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
10846c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
10856bd9dc18c043927c1196caba20a327238a179c42florian              *q++=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
10866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
10876c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
10886c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
10896c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
10906c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
10916c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"BGRP") == 0)
10926c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
10936c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
10946c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
10956c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
10966c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
10976c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
10986c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
10996c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
11006c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
11016c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
11026c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
11036c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=0U;
11046c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
11056c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
11066c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
11076c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
11086c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
11096c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"I") == 0)
11106c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
11116c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
11126c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
11136c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
11146c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
11156c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
11166c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
11176c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
11186c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(
11196c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                GetPixelIntensity(image,p));
11206c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
11216c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
11226c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
11236c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
11246c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
11256c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"RGB") == 0)
11266c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
11276c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
11286c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
11296c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
11306c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
11316c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
11326c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
11336c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
11346c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
11356c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
11366c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
11376c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
11386c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
11396c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
11406c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
11416c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
11426c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"RGBA") == 0)
11436c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
11446c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
11456c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
11466c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
11476c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
11486c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
11496c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
11506c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
11516c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
11526c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
11536c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
11546c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
11556c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
11566c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
11576c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
11586c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
11596c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
11606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"RGBP") == 0)
11616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
11626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
11636c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
11646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
11656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
11666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
11676c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
11686c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
11696c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
11706c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
11716c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
11726c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=0U;
11736c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
11746c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
11756c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
11766c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
11776c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
11786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      for (y=0; y < (ssize_t) rows; y++)
11796c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
11806c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
11816c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        if (p == (const Quantum *) NULL)
11826c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
11836c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        for (x=0; x < (ssize_t) columns; x++)
11846c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
11856c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (i=0; i < (ssize_t) length; i++)
11866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
11876c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            *q=0;
11886c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            switch (quantum_map[i])
11896c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
11906c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case RedQuantum:
11916c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case CyanQuantum:
11926c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
11936c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(unsigned int) ScaleQuantumToLong(GetPixelRed(image,p));
11946c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
11956c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
11966c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case GreenQuantum:
11976c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case MagentaQuantum:
11986c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
11996c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(unsigned int) ScaleQuantumToLong(GetPixelGreen(image,p));
12006c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
12016c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
12026c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case BlueQuantum:
12036c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case YellowQuantum:
12046c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
12056c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=(unsigned int) ScaleQuantumToLong(GetPixelBlue(image,p));
12066c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
12076c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
12086c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case AlphaQuantum:
12096c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
12105f76de086a6d643db51e50a4e623df7dfc9b6161sewardj                *q=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
12110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj                break;
12120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              }
12135d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              case OpacityQuantum:
12145d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              {
12155d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                *q=(unsigned int) ScaleQuantumToLong(GetPixelAlpha(image,p));
12165d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                break;
12175d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              }
12185d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              case BlackQuantum:
12195d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              {
12205d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                if (image->colorspace == CMYKColorspace)
12215d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                  *q=(unsigned int) ScaleQuantumToLong(GetPixelBlack(image,p));
12225d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                break;
12235d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              }
12245d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              case IndexQuantum:
12255d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              {
12265d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                *q=(unsigned int) ScaleQuantumToLong(
12275d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                  GetPixelIntensity(image,p));
12285d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                break;
12295d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              }
12305d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              default:
12315d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                *q=0;
12325d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            }
12335d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            q++;
12345d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          }
12355d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          p+=GetPixelChannels(image);
12365d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj        }
12375d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      }
12385d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      break;
12395d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj    }
12405d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj    case LongPixel:
12415d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj    {
12425d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      register size_t
12435d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj        *q;
12445d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj
12455d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      q=(size_t *) pixels;
12465d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      if (LocaleCompare(map,"BGR") == 0)
12475d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj        {
12485d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          for (y=0; y < (ssize_t) rows; y++)
12495d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          {
12505d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
12516c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
12526c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
12536c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
12546c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
12556c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
12566c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
12573a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=ScaleQuantumToLong(GetPixelRed(image,p));
12583a5322057616d0da214b9e0f897866e203c03e40philippe              p+=GetPixelChannels(image);
12593a5322057616d0da214b9e0f897866e203c03e40philippe            }
12606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
12616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
12626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
12636c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"BGRA") == 0)
12646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
12656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
12663a5322057616d0da214b9e0f897866e203c03e40philippe          {
12673a5322057616d0da214b9e0f897866e203c03e40philippe            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
12683a5322057616d0da214b9e0f897866e203c03e40philippe            if (p == (const Quantum *) NULL)
12693a5322057616d0da214b9e0f897866e203c03e40philippe              break;
12703a5322057616d0da214b9e0f897866e203c03e40philippe            for (x=0; x < (ssize_t) columns; x++)
12713a5322057616d0da214b9e0f897866e203c03e40philippe            {
12723a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
12733a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
12743a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=ScaleQuantumToLong(GetPixelRed(image,p));
12753a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
12763a5322057616d0da214b9e0f897866e203c03e40philippe              p+=GetPixelChannels(image);
12773a5322057616d0da214b9e0f897866e203c03e40philippe            }
12786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
12793a5322057616d0da214b9e0f897866e203c03e40philippe          break;
12805f76de086a6d643db51e50a4e623df7dfc9b6161sewardj        }
12815f76de086a6d643db51e50a4e623df7dfc9b6161sewardj      if (LocaleCompare(map,"BGRP") == 0)
12825d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj        {
12835d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          for (y=0; y < (ssize_t) rows; y++)
12846c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
12856c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
12866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
1287fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
12885d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            for (x=0; x < (ssize_t) columns; x++)
1289fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
12906c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
1291fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
1292fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1293fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=0;
1294c0d8f68810eb79a5a6cb6049d6a4ab1de7dc4e18sewardj              p+=GetPixelChannels(image);
1295fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1296fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
1297fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
1298fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
1299c0d8f68810eb79a5a6cb6049d6a4ab1de7dc4e18sewardj      if (LocaleCompare(map,"I") == 0)
1300c0d8f68810eb79a5a6cb6049d6a4ab1de7dc4e18sewardj        {
1301fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
13026c3769f487145a08c01b58d6e5db3ba274062ad4sewardj          {
1303fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1304fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (p == (const Quantum *) NULL)
1305fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
13066c3769f487145a08c01b58d6e5db3ba274062ad4sewardj            for (x=0; x < (ssize_t) columns; x++)
1307de4a1d01951937632098a6cda45859afa587a06fsewardj            {
1308fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToLong(GetPixelIntensity(image,p));
1309de4a1d01951937632098a6cda45859afa587a06fsewardj              p+=GetPixelChannels(image);
1310fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1311fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
13126c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
13136c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
13146c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"RGB") == 0)
13156c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
13166c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
1317de4a1d01951937632098a6cda45859afa587a06fsewardj          {
1318de4a1d01951937632098a6cda45859afa587a06fsewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1319291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
1320de4a1d01951937632098a6cda45859afa587a06fsewardj              break;
13213387dda4479102751d544c176a7bfc24f3766669sewardj            for (x=0; x < (ssize_t) columns; x++)
13225f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            {
13235f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              *q++=ScaleQuantumToLong(GetPixelRed(image,p));
1324fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
13255f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
13265f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              p+=GetPixelChannels(image);
13275f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            }
13285f76de086a6d643db51e50a4e623df7dfc9b6161sewardj          }
13296c3769f487145a08c01b58d6e5db3ba274062ad4sewardj          break;
1330de4a1d01951937632098a6cda45859afa587a06fsewardj        }
1331291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGBA") == 0)
13325f76de086a6d643db51e50a4e623df7dfc9b6161sewardj        {
13335f76de086a6d643db51e50a4e623df7dfc9b6161sewardj          for (y=0; y < (ssize_t) rows; y++)
13345f76de086a6d643db51e50a4e623df7dfc9b6161sewardj          {
13355f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
13365f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            if (p == (const Quantum *) NULL)
13375f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              break;
13385f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            for (x=0; x < (ssize_t) columns; x++)
13395f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            {
13405f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              *q++=ScaleQuantumToLong(GetPixelRed(image,p));
13415f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
13425f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
13435f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              *q++=ScaleQuantumToLong(GetPixelAlpha(image,p));
13445f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              p+=GetPixelChannels(image);
13455f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            }
1346fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
13476c3769f487145a08c01b58d6e5db3ba274062ad4sewardj          break;
1348de4a1d01951937632098a6cda45859afa587a06fsewardj        }
1349fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"RGBP") == 0)
13506c3769f487145a08c01b58d6e5db3ba274062ad4sewardj        {
1351291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
1352291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
13536c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1354fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (p == (const Quantum *) NULL)
1355fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
13565d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            for (x=0; x < (ssize_t) columns; x++)
13575d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            {
13585d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              *q++=ScaleQuantumToLong(GetPixelRed(image,p));
13596c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=ScaleQuantumToLong(GetPixelGreen(image,p));
13606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=ScaleQuantumToLong(GetPixelBlue(image,p));
13616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=0;
13626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
1363fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1364fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
13656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
13666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
13676c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      for (y=0; y < (ssize_t) rows; y++)
13686c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
13696c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
13706c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        if (p == (const Quantum *) NULL)
13716c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
13726c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        for (x=0; x < (ssize_t) columns; x++)
1373291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
137445f4e7c91119c7d01a59f5e827c67841632c9314sewardj          for (i=0; i < (ssize_t) length; i++)
137545f4e7c91119c7d01a59f5e827c67841632c9314sewardj          {
1376059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj            *q=0;
1377059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj            switch (quantum_map[i])
137845f4e7c91119c7d01a59f5e827c67841632c9314sewardj            {
137945f4e7c91119c7d01a59f5e827c67841632c9314sewardj              case RedQuantum:
1380cda2f0fbda4c4b2644babc830244be8aed95de1dnjn              case CyanQuantum:
138145f4e7c91119c7d01a59f5e827c67841632c9314sewardj              {
138245f4e7c91119c7d01a59f5e827c67841632c9314sewardj                *q=ScaleQuantumToLong(GetPixelRed(image,p));
138345f4e7c91119c7d01a59f5e827c67841632c9314sewardj                break;
138445f4e7c91119c7d01a59f5e827c67841632c9314sewardj              }
1385cda2f0fbda4c4b2644babc830244be8aed95de1dnjn              case GreenQuantum:
138645f4e7c91119c7d01a59f5e827c67841632c9314sewardj              case MagentaQuantum:
138745f4e7c91119c7d01a59f5e827c67841632c9314sewardj              {
138845f4e7c91119c7d01a59f5e827c67841632c9314sewardj                *q=ScaleQuantumToLong(GetPixelGreen(image,p));
1389cda2f0fbda4c4b2644babc830244be8aed95de1dnjn                break;
139045f4e7c91119c7d01a59f5e827c67841632c9314sewardj              }
139145f4e7c91119c7d01a59f5e827c67841632c9314sewardj              case BlueQuantum:
139245f4e7c91119c7d01a59f5e827c67841632c9314sewardj              case YellowQuantum:
139345f4e7c91119c7d01a59f5e827c67841632c9314sewardj              {
1394cda2f0fbda4c4b2644babc830244be8aed95de1dnjn                *q=ScaleQuantumToLong(GetPixelBlue(image,p));
13956c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
13966c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
13976c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case AlphaQuantum:
13986c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
13996c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
140045f4e7c91119c7d01a59f5e827c67841632c9314sewardj                break;
1401291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
1402291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case OpacityQuantum:
1403291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
1404291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=ScaleQuantumToLong(GetPixelAlpha(image,p));
1405291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
1406291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
14075d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              case BlackQuantum:
14085d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              {
14095d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                if (image->colorspace == CMYKColorspace)
14105d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                  *q=ScaleQuantumToLong(GetPixelBlack(image,p));
14115d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj                break;
14125d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              }
14135d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              case IndexQuantum:
14145d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              {
1415fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                *q=ScaleQuantumToLong(GetPixelIntensity(image,p));
1416738856f99eea33d86ce91dcb1d6cd5b151e307casewardj                break;
14176c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
1418fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              default:
14196c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
14206c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
142145f4e7c91119c7d01a59f5e827c67841632c9314sewardj            q++;
1422059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj          }
1423059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj          p+=GetPixelChannels(image);
1424059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj        }
14256c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
14266c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      break;
14276c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    }
14286c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    case QuantumPixel:
1429291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    {
1430291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      register Quantum
1431291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        *q;
14326c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
14333a5322057616d0da214b9e0f897866e203c03e40philippe      q=(Quantum *) pixels;
14343a5322057616d0da214b9e0f897866e203c03e40philippe      if (LocaleCompare(map,"BGR") == 0)
1435fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        {
14366c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
14376c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
14386c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
14396c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
14403786772222c5b31fd6cc5586bcd1ce0da58f1dbesewardj              break;
14410b9d74abd0a663b530d290b2b788ddeda46e5400sewardj            for (x=0; x < (ssize_t) columns; x++)
14420b9d74abd0a663b530d290b2b788ddeda46e5400sewardj            {
14434ba057cce1d81a949f5a899b5abb99e90a731bccsewardj              *q++=GetPixelBlue(image,p);
14446c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=GetPixelGreen(image,p);
14453786772222c5b31fd6cc5586bcd1ce0da58f1dbesewardj              *q++=GetPixelRed(image,p);
1446291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
14476c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
14486c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
14496c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          break;
14506c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
14516c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"BGRA") == 0)
14526c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
14533a5322057616d0da214b9e0f897866e203c03e40philippe          for (y=0; y < (ssize_t) rows; y++)
14543a5322057616d0da214b9e0f897866e203c03e40philippe          {
14556c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
14566c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
14576c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
14586c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
14596c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
14606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=GetPixelBlue(image,p);
14616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=GetPixelGreen(image,p);
14626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=GetPixelRed(image,p);
1463291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=(Quantum) (GetPixelAlpha(image,p));
14646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
14656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
14666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
1467fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
1468fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
14696c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"BGRP") == 0)
1470291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
1471291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
1472291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
1473291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1474291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
14755d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              break;
14765d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            for (x=0; x < (ssize_t) columns; x++)
14775d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            {
14785d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              *q++=GetPixelBlue(image,p);
14795d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              *q++=GetPixelGreen(image,p);
14805d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              *q++=GetPixelRed(image,p);
14815d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              *q++=(Quantum) 0;
14825d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              p+=GetPixelChannels(image);
1483fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1484738856f99eea33d86ce91dcb1d6cd5b151e307casewardj          }
14856c3769f487145a08c01b58d6e5db3ba274062ad4sewardj          break;
14864ccf707a1b52898b878fc90dc0054a0c23cc9fccsewardj        }
14876c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"I") == 0)
14886c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
1489fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
1490fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          {
14915d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
14925d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            if (p == (const Quantum *) NULL)
14935d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              break;
14945d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            for (x=0; x < (ssize_t) columns; x++)
14956c3769f487145a08c01b58d6e5db3ba274062ad4sewardj            {
1496de4a1d01951937632098a6cda45859afa587a06fsewardj              *q++=GetPixelIntensity(image,p);
1497de4a1d01951937632098a6cda45859afa587a06fsewardj              p+=GetPixelChannels(image);
1498fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1499fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
1500de4a1d01951937632098a6cda45859afa587a06fsewardj          break;
1501fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
1502fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"RGB") == 0)
1503fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        {
15048bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn          for (y=0; y < (ssize_t) rows; y++)
15058bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn          {
15068bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
150726412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj            if (p == (const Quantum *) NULL)
1508291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
1509291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
1510b7301c690606964dd1ece81ce2fd2b6fd90ab012sewardj            {
1511291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=GetPixelRed(image,p);
151222854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj              *q++=GetPixelGreen(image,p);
1513fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=GetPixelBlue(image,p);
15145f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              p+=GetPixelChannels(image);
1515fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1516fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
1517fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
1518663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj        }
1519fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"RGBA") == 0)
1520e808930793aeddc4cfd3e7a94b665913bec2566csewardj        {
1521e808930793aeddc4cfd3e7a94b665913bec2566csewardj          for (y=0; y < (ssize_t) rows; y++)
1522e808930793aeddc4cfd3e7a94b665913bec2566csewardj          {
1523fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1524b7301c690606964dd1ece81ce2fd2b6fd90ab012sewardj            if (p == (const Quantum *) NULL)
1525b7301c690606964dd1ece81ce2fd2b6fd90ab012sewardj              break;
1526b7301c690606964dd1ece81ce2fd2b6fd90ab012sewardj            for (x=0; x < (ssize_t) columns; x++)
15273a5322057616d0da214b9e0f897866e203c03e40philippe            {
15283a5322057616d0da214b9e0f897866e203c03e40philippe              *q++=GetPixelRed(image,p);
1529fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=GetPixelGreen(image,p);
1530fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=GetPixelBlue(image,p);
1531fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=(Quantum) (GetPixelAlpha(image,p));
1532fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p+=GetPixelChannels(image);
1533fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
153426412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj          }
153526412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj          break;
1536fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
1537fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"RGBP") == 0)
1538fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        {
1539fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
1540fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          {
1541fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1542fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (p == (const Quantum *) NULL)
1543fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
15445f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            for (x=0; x < (ssize_t) columns; x++)
1545fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
1546fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=GetPixelRed(image,p);
1547fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=GetPixelGreen(image,p);
1548fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=GetPixelBlue(image,p);
1549fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=(Quantum) 0;
1550fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p+=GetPixelChannels(image);
1551fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1552fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
1553fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
1554fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
1555fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      for (y=0; y < (ssize_t) rows; y++)
1556fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      {
1557fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1558a16ea0a5fa05dac343e63feddf63f51cb0c340bdsewardj        if (p == (const Quantum *) NULL)
1559059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj          break;
1560059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj        for (x=0; x < (ssize_t) columns; x++)
1561059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj        {
1562059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj          for (i=0; i < (ssize_t) length; i++)
1563a16ea0a5fa05dac343e63feddf63f51cb0c340bdsewardj          {
1564a16ea0a5fa05dac343e63feddf63f51cb0c340bdsewardj            *q=(Quantum) 0;
1565a16ea0a5fa05dac343e63feddf63f51cb0c340bdsewardj            switch (quantum_map[i])
1566059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj            {
1567059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj              case RedQuantum:
1568059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj              case CyanQuantum:
1569059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj              {
1570059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj                *q=GetPixelRed(image,p);
1571059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj                break;
1572059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj              }
1573fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case GreenQuantum:
1574fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case MagentaQuantum:
1575fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
1576fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                *q=GetPixelGreen(image,p);
1577fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
1578fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
157922854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj              case BlueQuantum:
1580fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case YellowQuantum:
1581fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
1582fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                *q=GetPixelBlue(image,p);
1583fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
1584fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
1585fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case AlphaQuantum:
1586fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
1587fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                *q=(Quantum) (GetPixelAlpha(image,p));
1588fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
1589fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
15905f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              case OpacityQuantum:
15915f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              {
15925f76de086a6d643db51e50a4e623df7dfc9b6161sewardj                *q=GetPixelAlpha(image,p);
1593fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
15945f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              }
1595fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case BlackQuantum:
1596291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
1597fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                if (image->colorspace == CMYKColorspace)
1598fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                  *q=GetPixelBlack(image,p);
1599fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
1600fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
16015f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              case IndexQuantum:
16025f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              {
16035f76de086a6d643db51e50a4e623df7dfc9b6161sewardj                *q=(GetPixelIntensity(image,p));
1604fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
1605fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
1606fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              default:
1607fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                *q=(Quantum) 0;
1608fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
160922854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj            q++;
1610fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
1611fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          p+=GetPixelChannels(image);
1612fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
1613fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      }
1614fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      break;
1615fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    }
161622854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj    case ShortPixel:
1617fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    {
1618291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      register unsigned short
1619fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        *q;
16205f76de086a6d643db51e50a4e623df7dfc9b6161sewardj
1621fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      q=(unsigned short *) pixels;
1622b7301c690606964dd1ece81ce2fd2b6fd90ab012sewardj      if (LocaleCompare(map,"BGR") == 0)
1623fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        {
1624fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
1625fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          {
1626291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1627291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
1628291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
1629291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
1630291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
1631291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1632291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1633291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1634291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
1635291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
1636291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
1637291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
1638291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
1639291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRA") == 0)
1640291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
1641291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
1642291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
1643291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1644291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (p == (const Quantum *) NULL)
1645291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              break;
1646291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            for (x=0; x < (ssize_t) columns; x++)
1647291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            {
1648291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1649291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1650291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1651291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1652291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
16533a5322057616d0da214b9e0f897866e203c03e40philippe            }
16543a5322057616d0da214b9e0f897866e203c03e40philippe          }
16553a5322057616d0da214b9e0f897866e203c03e40philippe          break;
1656291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
1657291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"BGRP") == 0)
16586c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
1659291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          for (y=0; y < (ssize_t) rows; y++)
16606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
16616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
16626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (p == (const Quantum *) NULL)
166322854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj              break;
166422854b907c1925a9af97ad20ca3dacb5e300d6f9sewardj            for (x=0; x < (ssize_t) columns; x++)
1665fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
1666fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1667fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1668fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1669fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=0;
1670291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
1671291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
1672291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
1673fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
1674fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
16756c3769f487145a08c01b58d6e5db3ba274062ad4sewardj      if (LocaleCompare(map,"I") == 0)
1676fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        {
1677663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj          for (y=0; y < (ssize_t) rows; y++)
1678663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj          {
1679fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1680fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (p == (const Quantum *) NULL)
1681fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
1682fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            for (x=0; x < (ssize_t) columns; x++)
1683fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
1684fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelIntensity(image,p));
1685fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p+=GetPixelChannels(image);
16865d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            }
16875d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          }
1688fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
1689fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
16905d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      if (LocaleCompare(map,"RGB") == 0)
16915d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj        {
16925d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          for (y=0; y < (ssize_t) rows; y++)
1693fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          {
1694fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1695fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (p == (const Quantum *) NULL)
1696fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
1697fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            for (x=0; x < (ssize_t) columns; x++)
1698fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
1699fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1700fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1701fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1702291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              p+=GetPixelChannels(image);
1703291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            }
1704291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          }
1705291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          break;
1706291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        }
1707291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      if (LocaleCompare(map,"RGBA") == 0)
1708291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        {
17095d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          for (y=0; y < (ssize_t) rows; y++)
17105d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          {
17115d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
17125d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            if (p == (const Quantum *) NULL)
17135d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              break;
17145d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            for (x=0; x < (ssize_t) columns; x++)
17155d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj            {
17165d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj              *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1717fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
1718fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
1719fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              *q++=ScaleQuantumToShort(GetPixelAlpha(image,p));
1720fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p+=GetPixelChannels(image);
1721fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
1722fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
1723fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
17246c3769f487145a08c01b58d6e5db3ba274062ad4sewardj        }
1725fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"RGBP") == 0)
1726fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        {
1727fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
1728fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          {
17296c3769f487145a08c01b58d6e5db3ba274062ad4sewardj            p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1730fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (p == (const Quantum *) NULL)
1731fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
1732fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            for (x=0; x < (ssize_t) columns; x++)
17336c3769f487145a08c01b58d6e5db3ba274062ad4sewardj            {
1734de4a1d01951937632098a6cda45859afa587a06fsewardj              *q++=ScaleQuantumToShort(GetPixelRed(image,p));
1735de4a1d01951937632098a6cda45859afa587a06fsewardj              *q++=ScaleQuantumToShort(GetPixelGreen(image,p));
17366c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=ScaleQuantumToShort(GetPixelBlue(image,p));
17376c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              *q++=0;
17386c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p+=GetPixelChannels(image);
17396c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
17400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          }
17410ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          break;
17420ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        }
17436c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      for (y=0; y < (ssize_t) rows; y++)
17446c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
17456c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        p=GetVirtualPixels(image,x_offset,y_offset+y,columns,1,exception);
1746fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        if (p == (const Quantum *) NULL)
1747fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
1748a30545069556d3dca4ca3feb7c621bdcb7b34107sewardj        for (x=0; x < (ssize_t) columns; x++)
17496c3769f487145a08c01b58d6e5db3ba274062ad4sewardj        {
1750a30545069556d3dca4ca3feb7c621bdcb7b34107sewardj          for (i=0; i < (ssize_t) length; i++)
1751a30545069556d3dca4ca3feb7c621bdcb7b34107sewardj          {
1752fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            *q=0;
1753fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            switch (quantum_map[i])
1754fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
17556c3769f487145a08c01b58d6e5db3ba274062ad4sewardj              case RedQuantum:
1756de4a1d01951937632098a6cda45859afa587a06fsewardj              case CyanQuantum:
1757fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
1758a30545069556d3dca4ca3feb7c621bdcb7b34107sewardj                *q=ScaleQuantumToShort(GetPixelRed(image,p));
17596c3769f487145a08c01b58d6e5db3ba274062ad4sewardj                break;
1760fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
1761fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case GreenQuantum:
1762fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case MagentaQuantum:
1763fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
1764fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                *q=ScaleQuantumToShort(GetPixelGreen(image,p));
1765fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
1766fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
1767fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case BlueQuantum:
1768fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case YellowQuantum:
1769fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
1770fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                *q=ScaleQuantumToShort(GetPixelBlue(image,p));
17716c3769f487145a08c01b58d6e5db3ba274062ad4sewardj                break;
1772de4a1d01951937632098a6cda45859afa587a06fsewardj              }
1773de4a1d01951937632098a6cda45859afa587a06fsewardj              case AlphaQuantum:
17746c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
17756c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
1776291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
1777291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
17786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case OpacityQuantum:
17796c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              {
17806c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                *q=ScaleQuantumToShort(GetPixelAlpha(image,p));
17816c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
1782291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              }
1783291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              case BlackQuantum:
1784291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
17856c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                if (image->colorspace == CMYKColorspace)
17866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                  *q=ScaleQuantumToShort(GetPixelBlack(image,p));
17876c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
17886c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
17896c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              case IndexQuantum:
1790291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj              {
1791291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                *q=ScaleQuantumToShort(GetPixelIntensity(image,p));
1792291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj                break;
17936c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              }
17946c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              default:
17956c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj                break;
17966c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
17976c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            q++;
17986c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          }
17996c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          p+=GetPixelChannels(image);
18006c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        }
18016c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
18026c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      break;
18036c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    }
18046c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    default:
18056c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    {
18066c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
18076c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
18086c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        "UnrecognizedPixelMap","`%s'",map);
18096c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      break;
18106c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    }
18116c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  }
18126c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
18136c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  return(MagickTrue);
18146c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj}
18156c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
18160b9d74abd0a663b530d290b2b788ddeda46e5400sewardj/*
18170b9d74abd0a663b530d290b2b788ddeda46e5400sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18184ba057cce1d81a949f5a899b5abb99e90a731bccsewardj%                                                                             %
18196c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18206c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18216c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%   G e t P i x e l I n f o                                                   %
18226c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18236c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18246c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18256c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18266c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18276c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  GetPixelInfo() initializes the PixelInfo structure.
1828291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
18296c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  The format of the GetPixelInfo method is:
1830291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
1831291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%      GetPixelInfo(const Image *image,PixelInfo *pixel)
18326c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18336c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  A description of each parameter follows:
18346c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18356c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%    o image: the image.
18366c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18376c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%    o pixel: Specifies a pointer to a PixelInfo structure.
18386c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18396c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj*/
18406c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardjMagickExport void GetPixelInfo(const Image *image,PixelInfo *pixel)
18416c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj{
18426c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->storage_class=DirectClass;
18436c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->colorspace=RGBColorspace;
18446c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->matte=MagickFalse;
18456c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->fuzz=0.0;
18466c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->depth=MAGICKCORE_QUANTUM_DEPTH;
18476c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->red=0.0;
18486c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->green=0.0;
18496c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->blue=0.0;
18506c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->black=0.0;
18516c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->alpha=(MagickRealType) OpaqueAlpha;
18526c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->index=0.0;
18536c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  if (image == (const Image *) NULL)
18546c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    return;
1855291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj  pixel->storage_class=image->storage_class;
18566c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->colorspace=image->colorspace;
18576c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->matte=image->matte;
18586c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->depth=image->depth;
18596c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  pixel->fuzz=image->fuzz;
18606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj}
18616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
18626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj/*
18636c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%                                                                             %
18676c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%   I m p o r t I m a g e P i x e l s                                         %
1868291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
1869291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
1870291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%                                                                             %
18716c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18726c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18736c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  ImportImagePixels() accepts pixel data and stores in the image at the
18746c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  location you specify.  The method returns MagickTrue on success otherwise
18756c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  MagickFalse if an error is encountered.  The pixel data can be either char,
18766c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  short int, int, ssize_t, float, or double in the order specified by map.
18776c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18786c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  Suppose your want to upload the first scanline of a 640x480 image from
1879291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%  character data in red-green-blue order:
18806c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18816c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      ImportImagePixels(image,0,0,640,1,"RGB",CharPixel,pixels);
18826c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18836c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  The format of the ImportImagePixels method is:
18846c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18856c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      MagickBooleanType ImportImagePixels(Image *image,const ssize_t x_offset,
18866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%        const ssize_t y_offset,const size_t columns,
188745f4e7c91119c7d01a59f5e827c67841632c9314sewardj%        const size_t rows,const char *map,const StorageType type,
18881636d33c13958b9c0e7d3059cdd5005746418eb2florian%        const void *pixels,ExceptionInfo *exception)
18896c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%
18906c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%  A description of each parameter follows:
18916c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
18926c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%    o image: the image.
18936c3769f487145a08c01b58d6e5db3ba274062ad4sewardj%
1894663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj%    o x_offset,y_offset,columns,rows:  These values define the perimeter
1895663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj%      of a region of pixels you want to define.
1896a16ea0a5fa05dac343e63feddf63f51cb0c340bdsewardj%
189745f4e7c91119c7d01a59f5e827c67841632c9314sewardj%    o map:  This string reflects the expected ordering of the pixel array.
189845f4e7c91119c7d01a59f5e827c67841632c9314sewardj%      It can be any combination or order of R = red, G = green, B = blue,
189945f4e7c91119c7d01a59f5e827c67841632c9314sewardj%      A = alpha (0 is transparent), O = opacity (0 is opaque), C = cyan,
19006c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
19016c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      P = pad.
19026c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
19036c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%    o type: Define the data type of the pixels.  Float and double types are
19046c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      normalized to [0..1] otherwise [0..QuantumRange].  Choose from these
19056c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel, or
19066c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%      DoublePixel.
19076c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
19086c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%    o pixels: This array of values contain the pixel components as defined by
1909291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%      map and type.  You must preallocate this array where the expected
1910291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%      length varies depending on the values of width, height, map, and type.
1911291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj%
19126c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%    o exception: return any errors or warnings in this structure.
19136c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj%
19146c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj*/
19156c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardjMagickExport MagickBooleanType ImportImagePixels(Image *image,
19166c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  const ssize_t x_offset,const ssize_t y_offset,const size_t columns,
19176c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  const size_t rows,const char *map,const StorageType type,
19186c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  const void *pixels,ExceptionInfo *exception)
19196c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj{
19206c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  QuantumType
19216c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    *quantum_map;
19226c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
19236c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  register Quantum
19246c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    *q;
19256c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
19266c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  register ssize_t
19276c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    i,
19286c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    x;
19296c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
19306c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  size_t
19316c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    length;
19326c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
19336c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  ssize_t
19346c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    y;
19356c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
19366c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  /*
19376c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    Allocate image structure.
19386c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  */
19396c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  assert(image != (Image *) NULL);
19406c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  assert(image->signature == MagickSignature);
19416c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  if (image->debug != MagickFalse)
19426c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
19436c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  length=strlen(map);
19446c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  quantum_map=(QuantumType *) AcquireQuantumMemory(length,sizeof(*quantum_map));
19456c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  if (quantum_map == (QuantumType *) NULL)
19466c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
19476c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      image->filename);
19486c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  for (i=0; i < (ssize_t) length; i++)
19496c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj  {
19506c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj    switch (map[i])
1951291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj    {
1952291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'a':
1953291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'A':
19546c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
1955291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        quantum_map[i]=AlphaQuantum;
1956291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        image->matte=MagickTrue;
1957291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        break;
19586c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
19596c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'B':
19606c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'b':
19616c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
19626c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        quantum_map[i]=BlueQuantum;
19636c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        break;
19646c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
19656c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'C':
19666c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'c':
19676c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
19686c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        quantum_map[i]=CyanQuantum;
19696c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        (void) SetImageColorspace(image,CMYKColorspace,exception);
19706c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        break;
19716c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
1972291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj      case 'g':
19736c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'G':
19746c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
1975de4a1d01951937632098a6cda45859afa587a06fsewardj        quantum_map[i]=GreenQuantum;
1976de4a1d01951937632098a6cda45859afa587a06fsewardj        break;
1977fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      }
1978fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      case 'K':
19796c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'k':
19800ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      {
19810ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        quantum_map[i]=BlackQuantum;
19820ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        (void) SetImageColorspace(image,CMYKColorspace,exception);
19836c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        break;
19846c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
19856c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'I':
19866c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'i':
19876c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
19886c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        quantum_map[i]=IndexQuantum;
19896c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        break;
19906c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
19916c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'm':
19926c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'M':
19936c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
19946c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        quantum_map[i]=MagentaQuantum;
19956c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        (void) SetImageColorspace(image,CMYKColorspace,exception);
19966c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        break;
19976c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      }
19986c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'O':
19996c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      case 'o':
20006c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      {
20016c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        quantum_map[i]=OpacityQuantum;
20026c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        image->matte=MagickTrue;
2003fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        break;
20046c3769f487145a08c01b58d6e5db3ba274062ad4sewardj      }
20056c3769f487145a08c01b58d6e5db3ba274062ad4sewardj      case 'P':
2006fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      case 'p':
20070ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      {
20080ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        quantum_map[i]=UndefinedQuantum;
20090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        break;
20100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      }
20110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      case 'R':
20120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      case 'r':
20130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      {
20140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        quantum_map[i]=RedQuantum;
20150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        break;
20160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      }
20170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      case 'Y':
20180ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      case 'y':
20190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      {
20200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        quantum_map[i]=YellowQuantum;
20210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        (void) SetImageColorspace(image,CMYKColorspace,exception);
20220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        break;
20230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      }
20240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      default:
20250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      {
20260ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
20270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
20280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          "UnrecognizedPixelMap","`%s'",map);
20290ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        return(MagickFalse);
20300ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      }
20310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    }
20320ec07f32bbbb209d749b9974408e6f025ad40b31sewardj  }
20330ec07f32bbbb209d749b9974408e6f025ad40b31sewardj  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
203478c0c09d429c95115e826ef769ecaa6cff2ac338tom    return(MagickFalse);
203578c0c09d429c95115e826ef769ecaa6cff2ac338tom  /*
20360ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    Transfer the pixels from the pixel datarray to the image.
20370ec07f32bbbb209d749b9974408e6f025ad40b31sewardj  */
20380ec07f32bbbb209d749b9974408e6f025ad40b31sewardj  switch (type)
20390ec07f32bbbb209d749b9974408e6f025ad40b31sewardj  {
20400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    case CharPixel:
20410ec07f32bbbb209d749b9974408e6f025ad40b31sewardj    {
20420ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      register const unsigned char
20430ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        *p;
20440ec07f32bbbb209d749b9974408e6f025ad40b31sewardj
20450ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      p=(const unsigned char *) pixels;
20460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      if (LocaleCompare(map,"BGR") == 0)
20470ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
20480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (y=0; y < (ssize_t) rows; y++)
204978c0c09d429c95115e826ef769ecaa6cff2ac338tom          {
2050cda2f0fbda4c4b2644babc830244be8aed95de1dnjn            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2051cda2f0fbda4c4b2644babc830244be8aed95de1dnjn            if (q == (Quantum *) NULL)
2052cda2f0fbda4c4b2644babc830244be8aed95de1dnjn              break;
2053cda2f0fbda4c4b2644babc830244be8aed95de1dnjn            for (x=0; x < (ssize_t) columns; x++)
2054cda2f0fbda4c4b2644babc830244be8aed95de1dnjn            {
205578c0c09d429c95115e826ef769ecaa6cff2ac338tom              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
205678c0c09d429c95115e826ef769ecaa6cff2ac338tom              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2057cda2f0fbda4c4b2644babc830244be8aed95de1dnjn              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
205878c0c09d429c95115e826ef769ecaa6cff2ac338tom              q+=GetPixelChannels(image);
20590ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            }
20600ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
20610ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
20620ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          }
20630ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          break;
20640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        }
20650ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      if (LocaleCompare(map,"BGRA") == 0)
20660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
20670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (y=0; y < (ssize_t) rows; y++)
20680ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          {
20690ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
20700ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (q == (Quantum *) NULL)
20710ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
20720ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            for (x=0; x < (ssize_t) columns; x++)
20730ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            {
20740ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
20750ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
20760ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
20770ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
20780ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              q+=GetPixelChannels(image);
20790ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            }
20800ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
20810ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
20820ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          }
20830ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          break;
20840ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        }
20850ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      if (LocaleCompare(map,"BGRO") == 0)
20860ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
20870ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (y=0; y < (ssize_t) rows; y++)
20880ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          {
20891dcee097db02f9ef3ba355162c4373d90d0e895cnjn            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
20900ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (q == (Quantum *) NULL)
20910ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
20920ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            for (x=0; x < (ssize_t) columns; x++)
20930ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            {
20940ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
20950ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
20960ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
20970ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
20980ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              q+=GetPixelChannels(image);
20990ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            }
21000ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
21010ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21020ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          }
21030ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          break;
21040ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        }
21050ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      if (LocaleCompare(map,"BGRP") == 0)
21060ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
21070ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (y=0; y < (ssize_t) rows; y++)
21080ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          {
21090ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
21100ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (q == (Quantum *) NULL)
21110ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21120ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            for (x=0; x < (ssize_t) columns; x++)
21130ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            {
21140ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
21150ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
21160ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
21170ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              p++;
21180ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              q+=GetPixelChannels(image);
21190ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            }
21200ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
21210ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21220ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          }
21230ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          break;
21240ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        }
21250ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      if (LocaleCompare(map,"I") == 0)
21260ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
21270ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (y=0; y < (ssize_t) rows; y++)
2128291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj          {
2129c0a02f88a9b5ca7cebebf67e1f2f5ebcadb1e238sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
21300ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (q == (Quantum *) NULL)
21310ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21320ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            for (x=0; x < (ssize_t) columns; x++)
21330ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            {
21340ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
21350ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelGreen(image,GetPixelRed(image,q),q);
21360ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelBlue(image,GetPixelRed(image,q),q);
21370ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              q+=GetPixelChannels(image);
21380ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            }
21390ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
21400ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21410ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          }
21420ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          break;
21430ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        }
21440ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      if (LocaleCompare(map,"RGB") == 0)
21450ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
21460ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (y=0; y < (ssize_t) rows; y++)
21470ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          {
21480ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
21490ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (q == (Quantum *) NULL)
21500ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21510ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            for (x=0; x < (ssize_t) columns; x++)
21520ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            {
21530ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
21540ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
21550ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
21560ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              q+=GetPixelChannels(image);
21570ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            }
21580ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
21590ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21600ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          }
21610ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          break;
21620ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        }
21630ec07f32bbbb209d749b9974408e6f025ad40b31sewardj      if (LocaleCompare(map,"RGBA") == 0)
21640ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
21650ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (y=0; y < (ssize_t) rows; y++)
21660ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          {
21670ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
21680ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            if (q == (Quantum *) NULL)
21690ec07f32bbbb209d749b9974408e6f025ad40b31sewardj              break;
21700ec07f32bbbb209d749b9974408e6f025ad40b31sewardj            for (x=0; x < (ssize_t) columns; x++)
2171fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
2172fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2173fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2174fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
21756c3769f487145a08c01b58d6e5db3ba274062ad4sewardj              SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
21766c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              q+=GetPixelChannels(image);
2177de4a1d01951937632098a6cda45859afa587a06fsewardj            }
2178663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2179663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj              break;
2180663a1bd7a8def9d4ef4a10615732a15cc9b09171sewardj          }
2181fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
2182fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
2183fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"RGBO") == 0)
21845f76de086a6d643db51e50a4e623df7dfc9b6161sewardj        {
21855f76de086a6d643db51e50a4e623df7dfc9b6161sewardj          for (y=0; y < (ssize_t) rows; y++)
21865f76de086a6d643db51e50a4e623df7dfc9b6161sewardj          {
21875f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
21885f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            if (q == (Quantum *) NULL)
21895f76de086a6d643db51e50a4e623df7dfc9b6161sewardj              break;
21905f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            for (x=0; x < (ssize_t) columns; x++)
21915f76de086a6d643db51e50a4e623df7dfc9b6161sewardj            {
2192de4a1d01951937632098a6cda45859afa587a06fsewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
2193fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
2194fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
2195fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
2196738856f99eea33d86ce91dcb1d6cd5b151e307casewardj              q+=GetPixelChannels(image);
2197fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
2198fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
219943b9a8abb139b86a24457fa3c19b9cb60ca17c3anjn              break;
220043b9a8abb139b86a24457fa3c19b9cb60ca17c3anjn          }
2201fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
2202fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
2203fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"RGBP") == 0)
22041e0fff690e9c571275e8025eb2dcff7bf29b53afsewardj        {
2205fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
2206fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          {
2207fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2208fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (q == (Quantum *) NULL)
2209fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
2210fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            for (x=0; x < (ssize_t) columns; x++)
2211fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
2212fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelRed(image,ScaleCharToQuantum(*p++),q);
22136c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
22146c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
22156c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              p++;
22166c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              q+=GetPixelChannels(image);
22176c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            }
2218291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
22196c3769f487145a08c01b58d6e5db3ba274062ad4sewardj              break;
22204ccf707a1b52898b878fc90dc0054a0c23cc9fccsewardj          }
22215d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj          break;
22225d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj        }
22235d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      for (y=0; y < (ssize_t) rows; y++)
22245d0d1f3a78d6c5c765360982a08d87a068ce7f1csewardj      {
2225291849fb0285e0998b4c9e33eb153eb3373c4a88sewardj        q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2226fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        if (q == (Quantum *) NULL)
2227fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          break;
22280ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        for (x=0; x < (ssize_t) columns; x++)
22290ec07f32bbbb209d749b9974408e6f025ad40b31sewardj        {
22300ec07f32bbbb209d749b9974408e6f025ad40b31sewardj          for (i=0; i < (ssize_t) length; i++)
2231059838bd94f9d06cd31648dc9bbf7da71c3db957sewardj          {
2232fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            switch (quantum_map[i])
2233738856f99eea33d86ce91dcb1d6cd5b151e307casewardj            {
2234fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case RedQuantum:
2235fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case CyanQuantum:
2236fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
2237738856f99eea33d86ce91dcb1d6cd5b151e307casewardj                SetPixelRed(image,ScaleCharToQuantum(*p),q);
2238fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
2239fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
2240fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case GreenQuantum:
2241fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case MagentaQuantum:
224245f4e7c91119c7d01a59f5e827c67841632c9314sewardj              {
224345f4e7c91119c7d01a59f5e827c67841632c9314sewardj                SetPixelGreen(image,ScaleCharToQuantum(*p),q);
224445f4e7c91119c7d01a59f5e827c67841632c9314sewardj                break;
224545f4e7c91119c7d01a59f5e827c67841632c9314sewardj              }
224645f4e7c91119c7d01a59f5e827c67841632c9314sewardj              case BlueQuantum:
224745f4e7c91119c7d01a59f5e827c67841632c9314sewardj              case YellowQuantum:
224845f4e7c91119c7d01a59f5e827c67841632c9314sewardj              {
224945f4e7c91119c7d01a59f5e827c67841632c9314sewardj                SetPixelBlue(image,ScaleCharToQuantum(*p),q);
225045f4e7c91119c7d01a59f5e827c67841632c9314sewardj                break;
225145f4e7c91119c7d01a59f5e827c67841632c9314sewardj              }
2252de4a1d01951937632098a6cda45859afa587a06fsewardj              case AlphaQuantum:
2253de4a1d01951937632098a6cda45859afa587a06fsewardj              {
22544ccf707a1b52898b878fc90dc0054a0c23cc9fccsewardj                SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
2255fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
2256fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
2257fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case OpacityQuantum:
2258fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
2259fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                SetPixelAlpha(image,ScaleCharToQuantum(*p),q);
226092e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote                break;
226192e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote              }
226292e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote              case BlackQuantum:
226392e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote              {
2264fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                SetPixelBlack(image,ScaleCharToQuantum(*p),q);
2265fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                break;
2266fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
2267fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              case IndexQuantum:
2268fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              {
2269fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                SetPixelRed(image,ScaleCharToQuantum(*p),q);
227092e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote                SetPixelGreen(image,GetPixelRed(image,q),q);
227192e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote                SetPixelBlue(image,GetPixelRed(image,q),q);
2272738856f99eea33d86ce91dcb1d6cd5b151e307casewardj                break;
2273fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              }
227492e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote              default:
2275738856f99eea33d86ce91dcb1d6cd5b151e307casewardj                break;
2276fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            }
2277fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            p++;
227892e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote          }
2279a0b6b2cf9abc7b0d87be1215a245eaccc0452af9bart          q+=GetPixelChannels(image);
2280738856f99eea33d86ce91dcb1d6cd5b151e307casewardj        }
2281fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        if (SyncAuthenticPixels(image,exception) == MagickFalse)
228226412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj          break;
228326412bd2c4ef3e55683141f132ebd1eb32d8530bsewardj      }
228492e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote      break;
2285738856f99eea33d86ce91dcb1d6cd5b151e307casewardj    }
2286fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    case DoublePixel:
2287fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj    {
2288738856f99eea33d86ce91dcb1d6cd5b151e307casewardj      register const double
2289fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        *p;
22906c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj
22913a5322057616d0da214b9e0f897866e203c03e40philippe      p=(const double *) pixels;
22926c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj      if (LocaleCompare(map,"BGR") == 0)
22936c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj        {
22946c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          for (y=0; y < (ssize_t) rows; y++)
22956c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj          {
22966c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
22976c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            if (q == (Quantum *) NULL)
22986c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj              break;
22996c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            for (x=0; x < (ssize_t) columns; x++)
23006c1bbbb1799cc34d05e2c1bae06f5533151eaaa3sewardj            {
230192e7b7f3d93564e293483fcf0f52f2d6f6c6dcc0nethercote              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2302de4a1d01951937632098a6cda45859afa587a06fsewardj                (*p)),q);
2303fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p++;
2304fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2305fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
23064ccf707a1b52898b878fc90dc0054a0c23cc9fccsewardj              p++;
2307fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2308fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
2309fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p++;
2310de4a1d01951937632098a6cda45859afa587a06fsewardj              q+=GetPixelChannels(image);
2311de4a1d01951937632098a6cda45859afa587a06fsewardj            }
231217c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2313de4a1d01951937632098a6cda45859afa587a06fsewardj              break;
2314fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
23152025cf98a3210c175a90fc77cb599cca1643bd68njn          break;
2316fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
2317fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"BGRA") == 0)
23182025cf98a3210c175a90fc77cb599cca1643bd68njn        {
2319fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
23202025cf98a3210c175a90fc77cb599cca1643bd68njn          {
23212025cf98a3210c175a90fc77cb599cca1643bd68njn            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
23222025cf98a3210c175a90fc77cb599cca1643bd68njn            if (q == (Quantum *) NULL)
23232025cf98a3210c175a90fc77cb599cca1643bd68njn              break;
2324fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            for (x=0; x < (ssize_t) columns; x++)
2325fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            {
2326fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2327fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
2328fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p++;
232918d7513cc08bf982711c8a22b70d56af6aa87b33sewardj              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2330fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
2331fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p++;
2332fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2333fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
2334fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p++;
23352025cf98a3210c175a90fc77cb599cca1643bd68njn              SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2336fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
2337fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              p++;
2338fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              q+=GetPixelChannels(image);
23392025cf98a3210c175a90fc77cb599cca1643bd68njn            }
2340fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2341fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
2342fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          }
23432025cf98a3210c175a90fc77cb599cca1643bd68njn          break;
2344fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        }
2345fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj      if (LocaleCompare(map,"BGRP") == 0)
2346fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj        {
2347fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          for (y=0; y < (ssize_t) rows; y++)
2348fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj          {
2349fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
23502025cf98a3210c175a90fc77cb599cca1643bd68njn            if (q == (Quantum *) NULL)
2351fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj              break;
2352fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj            for (x=0; x < (ssize_t) columns; x++)
23532025cf98a3210c175a90fc77cb599cca1643bd68njn            {
23542025cf98a3210c175a90fc77cb599cca1643bd68njn              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2355fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
23562025cf98a3210c175a90fc77cb599cca1643bd68njn              p++;
23572025cf98a3210c175a90fc77cb599cca1643bd68njn              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2358fa8ec113ecff891bdefb13dd361b40a503a992f8sewardj                (*p)),q);
2359de4a1d01951937632098a6cda45859afa587a06fsewardj              p++;
2360de4a1d01951937632098a6cda45859afa587a06fsewardj              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2361de4a1d01951937632098a6cda45859afa587a06fsewardj                (*p)),q);
236217c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj              p++;
236317c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj              p++;
236417c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj              q+=GetPixelChannels(image);
236517c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj            }
236617c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj            if (SyncAuthenticPixels(image,exception) == MagickFalse)
236717c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj              break;
236817c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj          }
236917c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj          break;
237017c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj        }
237117c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj      if (LocaleCompare(map,"I") == 0)
237217c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj        {
237317c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj          for (y=0; y < (ssize_t) rows; y++)
237417c5e2e3a2f48970063ea43a9abee3e11c72cb04sewardj          {
23752025cf98a3210c175a90fc77cb599cca1643bd68njn            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2376c0d8f68810eb79a5a6cb6049d6a4ab1de7dc4e18sewardj            if (q == (Quantum *) NULL)
2377c0d8f68810eb79a5a6cb6049d6a4ab1de7dc4e18sewardj              break;
2378de4a1d01951937632098a6cda45859afa587a06fsewardj            for (x=0; x < (ssize_t) columns; x++)
23798bddf58af8cc7342d4bde6712c5a6a33bf2850d4njn            {
2380de4a1d01951937632098a6cda45859afa587a06fsewardj              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2381                (*p)),q);
2382              SetPixelGreen(image,GetPixelRed(image,q),q);
2383              SetPixelBlue(image,GetPixelRed(image,q),q);
2384              p++;
2385              q+=GetPixelChannels(image);
2386            }
2387            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2388              break;
2389          }
2390          break;
2391        }
2392      if (LocaleCompare(map,"RGB") == 0)
2393        {
2394          for (y=0; y < (ssize_t) rows; y++)
2395          {
2396            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2397            if (q == (Quantum *) NULL)
2398              break;
2399            for (x=0; x < (ssize_t) columns; x++)
2400            {
2401              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2402                (*p)),q);
2403              p++;
2404              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2405                (*p)),q);
2406              p++;
2407              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2408                (*p)),q);
2409              p++;
2410              q+=GetPixelChannels(image);
2411            }
2412            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2413              break;
2414          }
2415          break;
2416        }
2417      if (LocaleCompare(map,"RGBA") == 0)
2418        {
2419          for (y=0; y < (ssize_t) rows; y++)
2420          {
2421            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2422            if (q == (Quantum *) NULL)
2423              break;
2424            for (x=0; x < (ssize_t) columns; x++)
2425            {
2426              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2427                (*p)),q);
2428              p++;
2429              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2430                (*p)),q);
2431              p++;
2432              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2433                (*p)),q);
2434              p++;
2435              SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2436                (*p)),q);
2437              p++;
2438              q+=GetPixelChannels(image);
2439            }
2440            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2441              break;
2442          }
2443          break;
2444        }
2445      if (LocaleCompare(map,"RGBP") == 0)
2446        {
2447          for (y=0; y < (ssize_t) rows; y++)
2448          {
2449            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2450            if (q == (Quantum *) NULL)
2451              break;
2452            for (x=0; x < (ssize_t) columns; x++)
2453            {
2454              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2455                (*p)),q);
2456              p++;
2457              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2458                (*p)),q);
2459              p++;
2460              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2461                (*p)),q);
2462              p++;
2463              q+=GetPixelChannels(image);
2464            }
2465            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2466              break;
2467          }
2468          break;
2469        }
2470      for (y=0; y < (ssize_t) rows; y++)
2471      {
2472        q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2473        if (q == (Quantum *) NULL)
2474          break;
2475        for (x=0; x < (ssize_t) columns; x++)
2476        {
2477          for (i=0; i < (ssize_t) length; i++)
2478          {
2479            switch (quantum_map[i])
2480            {
2481              case RedQuantum:
2482              case CyanQuantum:
2483              {
2484                SetPixelRed(image,ClampToQuantum((MagickRealType)
2485                  QuantumRange*(*p)),q);
2486                break;
2487              }
2488              case GreenQuantum:
2489              case MagentaQuantum:
2490              {
2491                SetPixelGreen(image,ClampToQuantum((MagickRealType)
2492                  QuantumRange*(*p)),q);
2493                break;
2494              }
2495              case BlueQuantum:
2496              case YellowQuantum:
2497              {
2498                SetPixelBlue(image,ClampToQuantum((MagickRealType)
2499                  QuantumRange*(*p)),q);
2500                break;
2501              }
2502              case AlphaQuantum:
2503              {
2504                SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2505                  QuantumRange*(*p)),q);
2506                break;
2507              }
2508              case OpacityQuantum:
2509              {
2510                SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2511                  QuantumRange*(*p)),q);
2512                break;
2513              }
2514              case BlackQuantum:
2515              {
2516                SetPixelBlack(image,ClampToQuantum((MagickRealType)
2517                  QuantumRange*(*p)),q);
2518                break;
2519              }
2520              case IndexQuantum:
2521              {
2522                SetPixelRed(image,ClampToQuantum((MagickRealType)
2523                  QuantumRange*(*p)),q);
2524                SetPixelGreen(image,GetPixelRed(image,q),q);
2525                SetPixelBlue(image,GetPixelRed(image,q),q);
2526                break;
2527              }
2528              default:
2529                break;
2530            }
2531            p++;
2532          }
2533          q+=GetPixelChannels(image);
2534        }
2535        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2536          break;
2537      }
2538      break;
2539    }
2540    case FloatPixel:
2541    {
2542      register const float
2543        *p;
2544
2545      p=(const float *) pixels;
2546      if (LocaleCompare(map,"BGR") == 0)
2547        {
2548          for (y=0; y < (ssize_t) rows; y++)
2549          {
2550            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2551            if (q == (Quantum *) NULL)
2552              break;
2553            for (x=0; x < (ssize_t) columns; x++)
2554            {
2555              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2556                (*p)),q);
2557              p++;
2558              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2559                (*p)),q);
2560              p++;
2561              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2562                (*p)),q);
2563              p++;
2564              q+=GetPixelChannels(image);
2565            }
2566            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2567              break;
2568          }
2569          break;
2570        }
2571      if (LocaleCompare(map,"BGRA") == 0)
2572        {
2573          for (y=0; y < (ssize_t) rows; y++)
2574          {
2575            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2576            if (q == (Quantum *) NULL)
2577              break;
2578            for (x=0; x < (ssize_t) columns; x++)
2579            {
2580              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2581                (*p)),q);
2582              p++;
2583              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2584                (*p)),q);
2585              p++;
2586              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2587                (*p)),q);
2588              p++;
2589              SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2590                (*p)),q);
2591              p++;
2592              q+=GetPixelChannels(image);
2593            }
2594            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2595              break;
2596          }
2597          break;
2598        }
2599      if (LocaleCompare(map,"BGRP") == 0)
2600        {
2601          for (y=0; y < (ssize_t) rows; y++)
2602          {
2603            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2604            if (q == (Quantum *) NULL)
2605              break;
2606            for (x=0; x < (ssize_t) columns; x++)
2607            {
2608              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2609                (*p)),q);
2610              p++;
2611              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2612                (*p)),q);
2613              p++;
2614              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2615                (*p)),q);
2616              p++;
2617              p++;
2618              q+=GetPixelChannels(image);
2619            }
2620            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2621              break;
2622          }
2623          break;
2624        }
2625      if (LocaleCompare(map,"I") == 0)
2626        {
2627          for (y=0; y < (ssize_t) rows; y++)
2628          {
2629            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2630            if (q == (Quantum *) NULL)
2631              break;
2632            for (x=0; x < (ssize_t) columns; x++)
2633            {
2634              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2635                (*p)),q);
2636              SetPixelGreen(image,GetPixelRed(image,q),q);
2637              SetPixelBlue(image,GetPixelRed(image,q),q);
2638              p++;
2639              q+=GetPixelChannels(image);
2640            }
2641            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2642              break;
2643          }
2644          break;
2645        }
2646      if (LocaleCompare(map,"RGB") == 0)
2647        {
2648          for (y=0; y < (ssize_t) rows; y++)
2649          {
2650            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2651            if (q == (Quantum *) NULL)
2652              break;
2653            for (x=0; x < (ssize_t) columns; x++)
2654            {
2655              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2656                (*p)),q);
2657              p++;
2658              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2659                (*p)),q);
2660              p++;
2661              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2662                (*p)),q);
2663              p++;
2664              q+=GetPixelChannels(image);
2665            }
2666            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2667              break;
2668          }
2669          break;
2670        }
2671      if (LocaleCompare(map,"RGBA") == 0)
2672        {
2673          for (y=0; y < (ssize_t) rows; y++)
2674          {
2675            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2676            if (q == (Quantum *) NULL)
2677              break;
2678            for (x=0; x < (ssize_t) columns; x++)
2679            {
2680              SetPixelRed(image,ClampToQuantum((MagickRealType)
2681                QuantumRange*(*p)),q);
2682              p++;
2683              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2684                (*p)),q);
2685              p++;
2686              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2687                (*p)),q);
2688              p++;
2689              SetPixelAlpha(image,ClampToQuantum((MagickRealType) QuantumRange*
2690                (*p)),q);
2691              p++;
2692              q+=GetPixelChannels(image);
2693            }
2694            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2695              break;
2696          }
2697          break;
2698        }
2699      if (LocaleCompare(map,"RGBP") == 0)
2700        {
2701          for (y=0; y < (ssize_t) rows; y++)
2702          {
2703            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2704            if (q == (Quantum *) NULL)
2705              break;
2706            for (x=0; x < (ssize_t) columns; x++)
2707            {
2708              SetPixelRed(image,ClampToQuantum((MagickRealType) QuantumRange*
2709                (*p)),q);
2710              p++;
2711              SetPixelGreen(image,ClampToQuantum((MagickRealType) QuantumRange*
2712                (*p)),q);
2713              p++;
2714              SetPixelBlue(image,ClampToQuantum((MagickRealType) QuantumRange*
2715                (*p)),q);
2716              p++;
2717              q+=GetPixelChannels(image);
2718            }
2719            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2720              break;
2721          }
2722          break;
2723        }
2724      for (y=0; y < (ssize_t) rows; y++)
2725      {
2726        q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2727        if (q == (Quantum *) NULL)
2728          break;
2729        for (x=0; x < (ssize_t) columns; x++)
2730        {
2731          for (i=0; i < (ssize_t) length; i++)
2732          {
2733            switch (quantum_map[i])
2734            {
2735              case RedQuantum:
2736              case CyanQuantum:
2737              {
2738                SetPixelRed(image,ClampToQuantum((MagickRealType)
2739                  QuantumRange*(*p)),q);
2740                break;
2741              }
2742              case GreenQuantum:
2743              case MagentaQuantum:
2744              {
2745                SetPixelGreen(image,ClampToQuantum((MagickRealType)
2746                  QuantumRange*(*p)),q);
2747                break;
2748              }
2749              case BlueQuantum:
2750              case YellowQuantum:
2751              {
2752                SetPixelBlue(image,ClampToQuantum((MagickRealType)
2753                  QuantumRange*(*p)),q);
2754                break;
2755              }
2756              case AlphaQuantum:
2757              {
2758                SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2759                  QuantumRange*(*p)),q);
2760                break;
2761              }
2762              case OpacityQuantum:
2763              {
2764                SetPixelAlpha(image,ClampToQuantum((MagickRealType)
2765                  QuantumRange*(*p)),q);
2766                break;
2767              }
2768              case BlackQuantum:
2769              {
2770                SetPixelBlack(image,ClampToQuantum((MagickRealType)
2771                  QuantumRange*(*p)),q);
2772                break;
2773              }
2774              case IndexQuantum:
2775              {
2776                SetPixelRed(image,ClampToQuantum((MagickRealType)
2777                  QuantumRange*(*p)),q);
2778                SetPixelGreen(image,GetPixelRed(image,q),q);
2779                SetPixelBlue(image,GetPixelRed(image,q),q);
2780                break;
2781              }
2782              default:
2783                break;
2784            }
2785            p++;
2786          }
2787          q+=GetPixelChannels(image);
2788        }
2789        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2790          break;
2791      }
2792      break;
2793    }
2794    case IntegerPixel:
2795    {
2796      register const unsigned int
2797        *p;
2798
2799      p=(const unsigned int *) pixels;
2800      if (LocaleCompare(map,"BGR") == 0)
2801        {
2802          for (y=0; y < (ssize_t) rows; y++)
2803          {
2804            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2805            if (q == (Quantum *) NULL)
2806              break;
2807            for (x=0; x < (ssize_t) columns; x++)
2808            {
2809              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2810              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2811              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2812              q+=GetPixelChannels(image);
2813            }
2814            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2815              break;
2816          }
2817          break;
2818        }
2819      if (LocaleCompare(map,"BGRA") == 0)
2820        {
2821          for (y=0; y < (ssize_t) rows; y++)
2822          {
2823            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2824            if (q == (Quantum *) NULL)
2825              break;
2826            for (x=0; x < (ssize_t) columns; x++)
2827            {
2828              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2829              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2830              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2831              SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2832              q+=GetPixelChannels(image);
2833            }
2834            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2835              break;
2836          }
2837          break;
2838        }
2839      if (LocaleCompare(map,"BGRP") == 0)
2840        {
2841          for (y=0; y < (ssize_t) rows; y++)
2842          {
2843            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2844            if (q == (Quantum *) NULL)
2845              break;
2846            for (x=0; x < (ssize_t) columns; x++)
2847            {
2848              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2849              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2850              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2851              p++;
2852              q+=GetPixelChannels(image);
2853            }
2854            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2855              break;
2856          }
2857          break;
2858        }
2859      if (LocaleCompare(map,"I") == 0)
2860        {
2861          for (y=0; y < (ssize_t) rows; y++)
2862          {
2863            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2864            if (q == (Quantum *) NULL)
2865              break;
2866            for (x=0; x < (ssize_t) columns; x++)
2867            {
2868              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2869              SetPixelGreen(image,GetPixelRed(image,q),q);
2870              SetPixelBlue(image,GetPixelRed(image,q),q);
2871              q+=GetPixelChannels(image);
2872            }
2873            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2874              break;
2875          }
2876          break;
2877        }
2878      if (LocaleCompare(map,"RGB") == 0)
2879        {
2880          for (y=0; y < (ssize_t) rows; y++)
2881          {
2882            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2883            if (q == (Quantum *) NULL)
2884              break;
2885            for (x=0; x < (ssize_t) columns; x++)
2886            {
2887              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2888              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2889              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2890              q+=GetPixelChannels(image);
2891            }
2892            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2893              break;
2894          }
2895          break;
2896        }
2897      if (LocaleCompare(map,"RGBA") == 0)
2898        {
2899          for (y=0; y < (ssize_t) rows; y++)
2900          {
2901            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2902            if (q == (Quantum *) NULL)
2903              break;
2904            for (x=0; x < (ssize_t) columns; x++)
2905            {
2906              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2907              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2908              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2909              SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
2910              q+=GetPixelChannels(image);
2911            }
2912            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2913              break;
2914          }
2915          break;
2916        }
2917      if (LocaleCompare(map,"RGBP") == 0)
2918        {
2919          for (y=0; y < (ssize_t) rows; y++)
2920          {
2921            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2922            if (q == (Quantum *) NULL)
2923              break;
2924            for (x=0; x < (ssize_t) columns; x++)
2925            {
2926              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
2927              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
2928              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
2929              p++;
2930              q+=GetPixelChannels(image);
2931            }
2932            if (SyncAuthenticPixels(image,exception) == MagickFalse)
2933              break;
2934          }
2935          break;
2936        }
2937      for (y=0; y < (ssize_t) rows; y++)
2938      {
2939        q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
2940        if (q == (Quantum *) NULL)
2941          break;
2942        for (x=0; x < (ssize_t) columns; x++)
2943        {
2944          for (i=0; i < (ssize_t) length; i++)
2945          {
2946            switch (quantum_map[i])
2947            {
2948              case RedQuantum:
2949              case CyanQuantum:
2950              {
2951                SetPixelRed(image,ScaleLongToQuantum(*p),q);
2952                break;
2953              }
2954              case GreenQuantum:
2955              case MagentaQuantum:
2956              {
2957                SetPixelGreen(image,ScaleLongToQuantum(*p),q);
2958                break;
2959              }
2960              case BlueQuantum:
2961              case YellowQuantum:
2962              {
2963                SetPixelBlue(image,ScaleLongToQuantum(*p),q);
2964                break;
2965              }
2966              case AlphaQuantum:
2967              {
2968                SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
2969                break;
2970              }
2971              case OpacityQuantum:
2972              {
2973                SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
2974                break;
2975              }
2976              case BlackQuantum:
2977              {
2978                SetPixelBlack(image,ScaleLongToQuantum(*p),q);
2979                break;
2980              }
2981              case IndexQuantum:
2982              {
2983                SetPixelRed(image,ScaleLongToQuantum(*p),q);
2984                SetPixelGreen(image,GetPixelRed(image,q),q);
2985                SetPixelBlue(image,GetPixelRed(image,q),q);
2986                break;
2987              }
2988              default:
2989                break;
2990            }
2991            p++;
2992          }
2993          q+=GetPixelChannels(image);
2994        }
2995        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2996          break;
2997      }
2998      break;
2999    }
3000    case LongPixel:
3001    {
3002      register const unsigned int
3003        *p;
3004
3005      p=(const unsigned int *) pixels;
3006      if (LocaleCompare(map,"BGR") == 0)
3007        {
3008          for (y=0; y < (ssize_t) rows; y++)
3009          {
3010            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3011            if (q == (Quantum *) NULL)
3012              break;
3013            for (x=0; x < (ssize_t) columns; x++)
3014            {
3015              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3016              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3017              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3018              q+=GetPixelChannels(image);
3019            }
3020            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3021              break;
3022          }
3023          break;
3024        }
3025      if (LocaleCompare(map,"BGRA") == 0)
3026        {
3027          for (y=0; y < (ssize_t) rows; y++)
3028          {
3029            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3030            if (q == (Quantum *) NULL)
3031              break;
3032            for (x=0; x < (ssize_t) columns; x++)
3033            {
3034              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3035              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3036              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3037              SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3038              q+=GetPixelChannels(image);
3039            }
3040            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3041              break;
3042          }
3043          break;
3044        }
3045      if (LocaleCompare(map,"BGRP") == 0)
3046        {
3047          for (y=0; y < (ssize_t) rows; y++)
3048          {
3049            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3050            if (q == (Quantum *) NULL)
3051              break;
3052            for (x=0; x < (ssize_t) columns; x++)
3053            {
3054              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3055              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3056              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3057              p++;
3058              q+=GetPixelChannels(image);
3059            }
3060            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3061              break;
3062          }
3063          break;
3064        }
3065      if (LocaleCompare(map,"I") == 0)
3066        {
3067          for (y=0; y < (ssize_t) rows; y++)
3068          {
3069            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3070            if (q == (Quantum *) NULL)
3071              break;
3072            for (x=0; x < (ssize_t) columns; x++)
3073            {
3074              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3075              SetPixelGreen(image,GetPixelRed(image,q),q);
3076              SetPixelBlue(image,GetPixelRed(image,q),q);
3077              q+=GetPixelChannels(image);
3078            }
3079            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3080              break;
3081          }
3082          break;
3083        }
3084      if (LocaleCompare(map,"RGB") == 0)
3085        {
3086          for (y=0; y < (ssize_t) rows; y++)
3087          {
3088            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3089            if (q == (Quantum *) NULL)
3090              break;
3091            for (x=0; x < (ssize_t) columns; x++)
3092            {
3093              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3094              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3095              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3096              q+=GetPixelChannels(image);
3097            }
3098            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3099              break;
3100          }
3101          break;
3102        }
3103      if (LocaleCompare(map,"RGBA") == 0)
3104        {
3105          for (y=0; y < (ssize_t) rows; y++)
3106          {
3107            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3108            if (q == (Quantum *) NULL)
3109              break;
3110            for (x=0; x < (ssize_t) columns; x++)
3111            {
3112              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3113              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3114              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3115              SetPixelAlpha(image,ScaleLongToQuantum(*p++),q);
3116              q+=GetPixelChannels(image);
3117            }
3118            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3119              break;
3120          }
3121          break;
3122        }
3123      if (LocaleCompare(map,"RGBP") == 0)
3124        {
3125          for (y=0; y < (ssize_t) rows; y++)
3126          {
3127            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3128            if (q == (Quantum *) NULL)
3129              break;
3130            for (x=0; x < (ssize_t) columns; x++)
3131            {
3132              SetPixelRed(image,ScaleLongToQuantum(*p++),q);
3133              SetPixelGreen(image,ScaleLongToQuantum(*p++),q);
3134              SetPixelBlue(image,ScaleLongToQuantum(*p++),q);
3135              p++;
3136              q+=GetPixelChannels(image);
3137            }
3138            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3139              break;
3140          }
3141          break;
3142        }
3143      for (y=0; y < (ssize_t) rows; y++)
3144      {
3145        q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3146        if (q == (Quantum *) NULL)
3147          break;
3148        for (x=0; x < (ssize_t) columns; x++)
3149        {
3150          for (i=0; i < (ssize_t) length; i++)
3151          {
3152            switch (quantum_map[i])
3153            {
3154              case RedQuantum:
3155              case CyanQuantum:
3156              {
3157                SetPixelRed(image,ScaleLongToQuantum(*p),q);
3158                break;
3159              }
3160              case GreenQuantum:
3161              case MagentaQuantum:
3162              {
3163                SetPixelGreen(image,ScaleLongToQuantum(*p),q);
3164                break;
3165              }
3166              case BlueQuantum:
3167              case YellowQuantum:
3168              {
3169                SetPixelBlue(image,ScaleLongToQuantum(*p),q);
3170                break;
3171              }
3172              case AlphaQuantum:
3173              {
3174                SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3175                break;
3176              }
3177              case OpacityQuantum:
3178              {
3179                SetPixelAlpha(image,ScaleLongToQuantum(*p),q);
3180                break;
3181              }
3182              case BlackQuantum:
3183              {
3184                SetPixelBlack(image,ScaleLongToQuantum(*p),q);
3185                break;
3186              }
3187              case IndexQuantum:
3188              {
3189                SetPixelRed(image,ScaleLongToQuantum(*p),q);
3190                SetPixelGreen(image,GetPixelRed(image,q),q);
3191                SetPixelBlue(image,GetPixelRed(image,q),q);
3192                break;
3193              }
3194              default:
3195                break;
3196            }
3197            p++;
3198          }
3199          q+=GetPixelChannels(image);
3200        }
3201        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3202          break;
3203      }
3204      break;
3205    }
3206    case QuantumPixel:
3207    {
3208      register const Quantum
3209        *p;
3210
3211      p=(const Quantum *) pixels;
3212      if (LocaleCompare(map,"BGR") == 0)
3213        {
3214          for (y=0; y < (ssize_t) rows; y++)
3215          {
3216            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3217            if (q == (Quantum *) NULL)
3218              break;
3219            for (x=0; x < (ssize_t) columns; x++)
3220            {
3221              SetPixelBlue(image,*p++,q);
3222              SetPixelGreen(image,*p++,q);
3223              SetPixelRed(image,*p++,q);
3224              q+=GetPixelChannels(image);
3225            }
3226            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3227              break;
3228          }
3229          break;
3230        }
3231      if (LocaleCompare(map,"BGRA") == 0)
3232        {
3233          for (y=0; y < (ssize_t) rows; y++)
3234          {
3235            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3236            if (q == (Quantum *) NULL)
3237              break;
3238            for (x=0; x < (ssize_t) columns; x++)
3239            {
3240              SetPixelBlue(image,*p++,q);
3241              SetPixelGreen(image,*p++,q);
3242              SetPixelRed(image,*p++,q);
3243              SetPixelAlpha(image,*p++,q);
3244              q+=GetPixelChannels(image);
3245            }
3246            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3247              break;
3248          }
3249          break;
3250        }
3251      if (LocaleCompare(map,"BGRP") == 0)
3252        {
3253          for (y=0; y < (ssize_t) rows; y++)
3254          {
3255            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3256            if (q == (Quantum *) NULL)
3257              break;
3258            for (x=0; x < (ssize_t) columns; x++)
3259            {
3260              SetPixelBlue(image,*p++,q);
3261              SetPixelGreen(image,*p++,q);
3262              SetPixelRed(image,*p++,q);
3263              p++;
3264              q+=GetPixelChannels(image);
3265            }
3266            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3267              break;
3268          }
3269          break;
3270        }
3271      if (LocaleCompare(map,"I") == 0)
3272        {
3273          for (y=0; y < (ssize_t) rows; y++)
3274          {
3275            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3276            if (q == (Quantum *) NULL)
3277              break;
3278            for (x=0; x < (ssize_t) columns; x++)
3279            {
3280              SetPixelRed(image,*p++,q);
3281              SetPixelGreen(image,GetPixelRed(image,q),q);
3282              SetPixelBlue(image,GetPixelRed(image,q),q);
3283              q+=GetPixelChannels(image);
3284            }
3285            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3286              break;
3287          }
3288          break;
3289        }
3290      if (LocaleCompare(map,"RGB") == 0)
3291        {
3292          for (y=0; y < (ssize_t) rows; y++)
3293          {
3294            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3295            if (q == (Quantum *) NULL)
3296              break;
3297            for (x=0; x < (ssize_t) columns; x++)
3298            {
3299              SetPixelRed(image,*p++,q);
3300              SetPixelGreen(image,*p++,q);
3301              SetPixelBlue(image,*p++,q);
3302              q+=GetPixelChannels(image);
3303            }
3304            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3305              break;
3306          }
3307          break;
3308        }
3309      if (LocaleCompare(map,"RGBA") == 0)
3310        {
3311          for (y=0; y < (ssize_t) rows; y++)
3312          {
3313            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3314            if (q == (Quantum *) NULL)
3315              break;
3316            for (x=0; x < (ssize_t) columns; x++)
3317            {
3318              SetPixelRed(image,*p++,q);
3319              SetPixelGreen(image,*p++,q);
3320              SetPixelBlue(image,*p++,q);
3321              SetPixelAlpha(image,*p++,q);
3322              q+=GetPixelChannels(image);
3323            }
3324            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3325              break;
3326          }
3327          break;
3328        }
3329      if (LocaleCompare(map,"RGBP") == 0)
3330        {
3331          for (y=0; y < (ssize_t) rows; y++)
3332          {
3333            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3334            if (q == (Quantum *) NULL)
3335              break;
3336            for (x=0; x < (ssize_t) columns; x++)
3337            {
3338              SetPixelRed(image,*p++,q);
3339              SetPixelGreen(image,*p++,q);
3340              SetPixelBlue(image,*p++,q);
3341              p++;
3342              q+=GetPixelChannels(image);
3343            }
3344            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3345              break;
3346          }
3347          break;
3348        }
3349      for (y=0; y < (ssize_t) rows; y++)
3350      {
3351        q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3352        if (q == (Quantum *) NULL)
3353          break;
3354        for (x=0; x < (ssize_t) columns; x++)
3355        {
3356          for (i=0; i < (ssize_t) length; i++)
3357          {
3358            switch (quantum_map[i])
3359            {
3360              case RedQuantum:
3361              case CyanQuantum:
3362              {
3363                SetPixelRed(image,*p,q);
3364                break;
3365              }
3366              case GreenQuantum:
3367              case MagentaQuantum:
3368              {
3369                SetPixelGreen(image,*p,q);
3370                break;
3371              }
3372              case BlueQuantum:
3373              case YellowQuantum:
3374              {
3375                SetPixelBlue(image,*p,q);
3376                break;
3377              }
3378              case AlphaQuantum:
3379              {
3380                SetPixelAlpha(image,*p,q);
3381                break;
3382              }
3383              case OpacityQuantum:
3384              {
3385                SetPixelAlpha(image,*p,q);
3386                break;
3387              }
3388              case BlackQuantum:
3389              {
3390                SetPixelBlack(image,*p,q);
3391                break;
3392              }
3393              case IndexQuantum:
3394              {
3395                SetPixelRed(image,*p,q);
3396                SetPixelGreen(image,GetPixelRed(image,q),q);
3397                SetPixelBlue(image,GetPixelRed(image,q),q);
3398                break;
3399              }
3400              default:
3401                break;
3402            }
3403            p++;
3404          }
3405          q+=GetPixelChannels(image);
3406        }
3407        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3408          break;
3409      }
3410      break;
3411    }
3412    case ShortPixel:
3413    {
3414      register const unsigned short
3415        *p;
3416
3417      p=(const unsigned short *) pixels;
3418      if (LocaleCompare(map,"BGR") == 0)
3419        {
3420          for (y=0; y < (ssize_t) rows; y++)
3421          {
3422            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3423            if (q == (Quantum *) NULL)
3424              break;
3425            for (x=0; x < (ssize_t) columns; x++)
3426            {
3427              SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3428              SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3429              SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3430              q+=GetPixelChannels(image);
3431            }
3432            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3433              break;
3434          }
3435          break;
3436        }
3437      if (LocaleCompare(map,"BGRA") == 0)
3438        {
3439          for (y=0; y < (ssize_t) rows; y++)
3440          {
3441            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3442            if (q == (Quantum *) NULL)
3443              break;
3444            for (x=0; x < (ssize_t) columns; x++)
3445            {
3446              SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3447              SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3448              SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3449              SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3450              q+=GetPixelChannels(image);
3451            }
3452            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3453              break;
3454          }
3455          break;
3456        }
3457      if (LocaleCompare(map,"BGRP") == 0)
3458        {
3459          for (y=0; y < (ssize_t) rows; y++)
3460          {
3461            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3462            if (q == (Quantum *) NULL)
3463              break;
3464            for (x=0; x < (ssize_t) columns; x++)
3465            {
3466              SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3467              SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3468              SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3469              p++;
3470              q+=GetPixelChannels(image);
3471            }
3472            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3473              break;
3474          }
3475          break;
3476        }
3477      if (LocaleCompare(map,"I") == 0)
3478        {
3479          for (y=0; y < (ssize_t) rows; y++)
3480          {
3481            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3482            if (q == (Quantum *) NULL)
3483              break;
3484            for (x=0; x < (ssize_t) columns; x++)
3485            {
3486              SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3487              SetPixelGreen(image,GetPixelRed(image,q),q);
3488              SetPixelBlue(image,GetPixelRed(image,q),q);
3489              q+=GetPixelChannels(image);
3490            }
3491            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3492              break;
3493          }
3494          break;
3495        }
3496      if (LocaleCompare(map,"RGB") == 0)
3497        {
3498          for (y=0; y < (ssize_t) rows; y++)
3499          {
3500            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3501            if (q == (Quantum *) NULL)
3502              break;
3503            for (x=0; x < (ssize_t) columns; x++)
3504            {
3505              SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3506              SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3507              SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3508              q+=GetPixelChannels(image);
3509            }
3510            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3511              break;
3512          }
3513          break;
3514        }
3515      if (LocaleCompare(map,"RGBA") == 0)
3516        {
3517          for (y=0; y < (ssize_t) rows; y++)
3518          {
3519            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3520            if (q == (Quantum *) NULL)
3521              break;
3522            for (x=0; x < (ssize_t) columns; x++)
3523            {
3524              SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3525              SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3526              SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3527              SetPixelAlpha(image,ScaleShortToQuantum(*p++),q);
3528              q+=GetPixelChannels(image);
3529            }
3530            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3531              break;
3532          }
3533          break;
3534        }
3535      if (LocaleCompare(map,"RGBP") == 0)
3536        {
3537          for (y=0; y < (ssize_t) rows; y++)
3538          {
3539            q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3540            if (q == (Quantum *) NULL)
3541              break;
3542            for (x=0; x < (ssize_t) columns; x++)
3543            {
3544              SetPixelRed(image,ScaleShortToQuantum(*p++),q);
3545              SetPixelGreen(image,ScaleShortToQuantum(*p++),q);
3546              SetPixelBlue(image,ScaleShortToQuantum(*p++),q);
3547              p++;
3548              q+=GetPixelChannels(image);
3549            }
3550            if (SyncAuthenticPixels(image,exception) == MagickFalse)
3551              break;
3552          }
3553          break;
3554        }
3555      for (y=0; y < (ssize_t) rows; y++)
3556      {
3557        q=GetAuthenticPixels(image,x_offset,y_offset+y,columns,1,exception);
3558        if (q == (Quantum *) NULL)
3559          break;
3560        for (x=0; x < (ssize_t) columns; x++)
3561        {
3562          for (i=0; i < (ssize_t) length; i++)
3563          {
3564            switch (quantum_map[i])
3565            {
3566              case RedQuantum:
3567              case CyanQuantum:
3568              {
3569                SetPixelRed(image,ScaleShortToQuantum(*p),q);
3570                break;
3571              }
3572              case GreenQuantum:
3573              case MagentaQuantum:
3574              {
3575                SetPixelGreen(image,ScaleShortToQuantum(*p),q);
3576                break;
3577              }
3578              case BlueQuantum:
3579              case YellowQuantum:
3580              {
3581                SetPixelBlue(image,ScaleShortToQuantum(*p),q);
3582                break;
3583              }
3584              case AlphaQuantum:
3585              {
3586                SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3587                break;
3588              }
3589              case OpacityQuantum:
3590              {
3591                SetPixelAlpha(image,ScaleShortToQuantum(*p),q);
3592                break;
3593              }
3594              case BlackQuantum:
3595              {
3596                SetPixelBlack(image,ScaleShortToQuantum(*p),q);
3597                break;
3598              }
3599              case IndexQuantum:
3600              {
3601                SetPixelRed(image,ScaleShortToQuantum(*p),q);
3602                SetPixelGreen(image,GetPixelRed(image,q),q);
3603                SetPixelBlue(image,GetPixelRed(image,q),q);
3604                break;
3605              }
3606              default:
3607                break;
3608            }
3609            p++;
3610          }
3611          q+=GetPixelChannels(image);
3612        }
3613        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3614          break;
3615      }
3616      break;
3617    }
3618    default:
3619    {
3620      quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3621      (void) ThrowMagickException(exception,GetMagickModule(),OptionError,
3622        "UnrecognizedPixelMap","`%s'",map);
3623      break;
3624    }
3625  }
3626  quantum_map=(QuantumType *) RelinquishMagickMemory(quantum_map);
3627  return(MagickTrue);
3628}
3629
3630/*
3631%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3632%                                                                             %
3633%                                                                             %
3634%                                                                             %
3635+   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                         %
3636%                                                                             %
3637%                                                                             %
3638%                                                                             %
3639%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3640%
3641%  InitializePixelChannelMap() defines the standard pixel component map.
3642%
3643%  The format of the InitializePixelChannelMap() method is:
3644%
3645%      void InitializePixelChannelMap(Image *image)
3646%
3647%  A description of each parameter follows:
3648%
3649%    o image: the image.
3650%
3651*/
3652MagickExport void InitializePixelChannelMap(Image *image)
3653{
3654  PixelTrait
3655    trait;
3656
3657  register ssize_t
3658    i;
3659
3660  ssize_t
3661    n;
3662
3663  assert(image != (Image *) NULL);
3664  assert(image->signature == MagickSignature);
3665  (void) ResetMagickMemory(image->channel_map,0,MaxPixelChannels*
3666    sizeof(*image->channel_map));
3667  trait=UpdatePixelTrait;
3668  if (image->matte != MagickFalse)
3669    trait=(PixelTrait) (trait | BlendPixelTrait);
3670  n=0;
3671  if (0 && image->colorspace == GRAYColorspace)
3672    {
3673      SetPixelChannelMap(image,BluePixelChannel,trait,n);
3674      SetPixelChannelMap(image,GreenPixelChannel,trait,n);
3675      SetPixelChannelMap(image,RedPixelChannel,trait,n++);
3676    }
3677  else
3678    {
3679      SetPixelChannelMap(image,RedPixelChannel,trait,n++);
3680      SetPixelChannelMap(image,GreenPixelChannel,trait,n++);
3681      SetPixelChannelMap(image,BluePixelChannel,trait,n++);
3682    }
3683  if (image->colorspace == CMYKColorspace)
3684    SetPixelChannelMap(image,BlackPixelChannel,trait,n++);
3685  if (image->matte != MagickFalse)
3686    SetPixelChannelMap(image,AlphaPixelChannel,CopyPixelTrait,n++);
3687  if (image->storage_class == PseudoClass)
3688    SetPixelChannelMap(image,IndexPixelChannel,CopyPixelTrait,n++);
3689  assert((n+image->number_meta_channels) < MaxPixelChannels);
3690  for (i=0; i < (ssize_t) image->number_meta_channels; i++)
3691    SetPixelChannelMap(image,(PixelChannel) (MetaPixelChannel+i),CopyPixelTrait,
3692      n++);
3693  image->number_channels=(size_t) n;
3694  if (image->debug != MagickFalse)
3695    LogPixelChannels(image);
3696  (void) SetPixelChannelMask(image,image->channel_mask);
3697}
3698
3699/*
3700%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3701%                                                                             %
3702%                                                                             %
3703%                                                                             %
3704%   I n t e r p o l a t e P i x e l C h a n n e l                             %
3705%                                                                             %
3706%                                                                             %
3707%                                                                             %
3708%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3709%
3710%  InterpolatePixelChannel() applies a pixel interpolation method between a
3711%  floating point coordinate and the pixels surrounding that coordinate.  No
3712%  pixel area resampling, or scaling of the result is performed.
3713%
3714%  The format of the InterpolatePixelChannel method is:
3715%
3716%      MagickBooleanType InterpolatePixelChannel(const Image *image,
3717%        const CacheView *image_view,const PixelChannel channel,
3718%        const PixelInterpolateMethod method,const double x,const double y,
3719%        double *pixel,ExceptionInfo *exception)
3720%
3721%  A description of each parameter follows:
3722%
3723%    o image: the image.
3724%
3725%    o image_view: the image view.
3726%
3727%    o channel: the pixel channel to interpolate.
3728%
3729%    o method: the pixel color interpolation method.
3730%
3731%    o x,y: A double representing the current (x,y) position of the pixel.
3732%
3733%    o pixel: return the interpolated pixel here.
3734%
3735%    o exception: return any errors or warnings in this structure.
3736%
3737*/
3738
3739static inline double MagickMax(const MagickRealType x,const MagickRealType y)
3740{
3741  if (x > y)
3742    return(x);
3743  return(y);
3744}
3745
3746static inline MagickRealType CubicWeightingFunction(const MagickRealType x)
3747{
3748  MagickRealType
3749    alpha,
3750    gamma;
3751
3752  alpha=MagickMax(x+2.0,0.0);
3753  gamma=1.0*alpha*alpha*alpha;
3754  alpha=MagickMax(x+1.0,0.0);
3755  gamma-=4.0*alpha*alpha*alpha;
3756  alpha=MagickMax(x+0.0,0.0);
3757  gamma+=6.0*alpha*alpha*alpha;
3758  alpha=MagickMax(x-1.0,0.0);
3759  gamma-=4.0*alpha*alpha*alpha;
3760  return(gamma/6.0);
3761}
3762
3763static inline double MeshInterpolate(const PointInfo *delta,const double p,
3764  const double x,const double y)
3765{
3766  return(delta->x*x+delta->y*y+(1.0-delta->x-delta->y)*p);
3767}
3768
3769static inline ssize_t NearestNeighbor(const MagickRealType x)
3770{
3771  if (x >= 0.0)
3772    return((ssize_t) (x+0.5));
3773  return((ssize_t) (x-0.5));
3774}
3775
3776MagickExport MagickBooleanType InterpolatePixelChannel(const Image *image,
3777  const CacheView *image_view,const PixelChannel channel,
3778  const PixelInterpolateMethod method,const double x,const double y,
3779  double *pixel,ExceptionInfo *exception)
3780{
3781  MagickBooleanType
3782    status;
3783
3784  MagickRealType
3785    alpha[16],
3786    gamma,
3787    pixels[16];
3788
3789  PixelTrait
3790    traits;
3791
3792  register const Quantum
3793    *p;
3794
3795  register ssize_t
3796    i;
3797
3798  ssize_t
3799    x_offset,
3800    y_offset;
3801
3802  assert(image != (Image *) NULL);
3803  assert(image != (Image *) NULL);
3804  assert(image->signature == MagickSignature);
3805  assert(image_view != (CacheView *) NULL);
3806  status=MagickTrue;
3807  *pixel=0.0;
3808  traits=GetPixelChannelMapTraits(image,channel);
3809  x_offset=(ssize_t) floor(x);
3810  y_offset=(ssize_t) floor(y);
3811  switch (method == UndefinedInterpolatePixel ? image->interpolate : method)
3812  {
3813    case AverageInterpolatePixel:
3814    {
3815      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
3816        exception);
3817      if (p == (const Quantum *) NULL)
3818        {
3819          status=MagickFalse;
3820          break;
3821        }
3822      if ((traits & BlendPixelTrait) == 0)
3823        for (i=0; i < 16; i++)
3824        {
3825          alpha[i]=1.0;
3826          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3827        }
3828      else
3829        for (i=0; i < 16; i++)
3830        {
3831          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3832            GetPixelChannels(image));
3833          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3834        }
3835      for (i=0; i < 16; i++)
3836      {
3837        gamma=1.0/(fabs((double) alpha[i]) <= MagickEpsilon ? 1.0 : alpha[i]);
3838        *pixel+=gamma*0.0625*pixels[i];
3839      }
3840      break;
3841    }
3842    case BicubicInterpolatePixel:
3843    {
3844      MagickRealType
3845        u[4],
3846        v[4];
3847
3848      PointInfo
3849        delta;
3850
3851      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
3852        exception);
3853      if (p == (const Quantum *) NULL)
3854        {
3855          status=MagickFalse;
3856          break;
3857        }
3858      if ((traits & BlendPixelTrait) == 0)
3859        for (i=0; i < 16; i++)
3860        {
3861          alpha[i]=1.0;
3862          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3863        }
3864      else
3865        for (i=0; i < 16; i++)
3866        {
3867          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3868            GetPixelChannels(image));
3869          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3870        }
3871      delta.x=x-x_offset;
3872      delta.y=y-y_offset;
3873      for (i=0; i < 4; i++)
3874      {
3875        u[0]=(pixels[4*i+3]-pixels[4*i+2])-(pixels[4*i+0]-pixels[4*i+1]);
3876        u[1]=(pixels[4*i+0]-pixels[4*i+1])-u[0];
3877        u[2]=pixels[4*i+2]-pixels[4*i+0];
3878        u[3]=pixels[4*i+1];
3879        v[i]=(delta.x*delta.x*delta.x*u[0])+(delta.x*delta.x*u[1])+(delta.x*
3880          u[2])+u[3];
3881      }
3882      u[0]=(v[3]-v[2])-(v[0]-v[1]);
3883      u[1]=(v[0]-v[1])-u[0];
3884      u[2]=v[2]-v[0];
3885      u[3]=v[1];
3886      *pixel=(delta.y*delta.y*delta.y*u[0])+(delta.y*delta.y*u[1])+(delta.y*
3887        u[2])+u[3];
3888      break;
3889    }
3890    case BilinearInterpolatePixel:
3891    default:
3892    {
3893      PointInfo
3894        delta,
3895        epsilon;
3896
3897      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
3898      if (p == (const Quantum *) NULL)
3899        {
3900          status=MagickFalse;
3901          break;
3902        }
3903      if ((traits & BlendPixelTrait) == 0)
3904        for (i=0; i < 4; i++)
3905        {
3906          alpha[i]=1.0;
3907          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
3908        }
3909      else
3910        for (i=0; i < 4; i++)
3911        {
3912          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
3913            GetPixelChannels(image));
3914          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
3915        }
3916      delta.x=x-x_offset;
3917      delta.y=y-y_offset;
3918      epsilon.x=1.0-delta.x;
3919      epsilon.y=1.0-delta.y;
3920      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
3921        (epsilon.x*alpha[2]+delta.x*alpha[3])));
3922      gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
3923      *pixel=gamma*(epsilon.y*(epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*
3924        (epsilon.x*pixels[2]+delta.x*pixels[3]));
3925      break;
3926    }
3927    case FilterInterpolatePixel:
3928    {
3929      CacheView
3930        *filter_view;
3931
3932      Image
3933        *excerpt_image,
3934        *filter_image;
3935
3936      RectangleInfo
3937        geometry;
3938
3939      geometry.width=4L;
3940      geometry.height=4L;
3941      geometry.x=x_offset-1;
3942      geometry.y=y_offset-1;
3943      excerpt_image=ExcerptImage(image,&geometry,exception);
3944      if (excerpt_image == (Image *) NULL)
3945        {
3946          status=MagickFalse;
3947          break;
3948        }
3949      filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
3950        exception);
3951      excerpt_image=DestroyImage(excerpt_image);
3952      if (filter_image == (Image *) NULL)
3953        break;
3954      filter_view=AcquireCacheView(filter_image);
3955      p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
3956      if (p == (const Quantum *) NULL)
3957        status=MagickFalse;
3958      else
3959        *pixel=(double) GetPixelChannel(image,channel,p);
3960      filter_view=DestroyCacheView(filter_view);
3961      filter_image=DestroyImage(filter_image);
3962      break;
3963    }
3964    case IntegerInterpolatePixel:
3965    {
3966      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
3967      if (p == (const Quantum *) NULL)
3968        {
3969          status=MagickFalse;
3970          break;
3971        }
3972      *pixel=(double) GetPixelChannel(image,channel,p);
3973      break;
3974    }
3975    case NearestNeighborInterpolatePixel:
3976    {
3977      p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
3978        NearestNeighbor(y),1,1,exception);
3979      if (p == (const Quantum *) NULL)
3980        {
3981          status=MagickFalse;
3982          break;
3983        }
3984      *pixel=(double) GetPixelChannel(image,channel,p);
3985      break;
3986    }
3987    case MeshInterpolatePixel:
3988    {
3989      PointInfo
3990        delta,
3991        luminance;
3992
3993      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
3994      if (p == (const Quantum *) NULL)
3995        {
3996          status=MagickFalse;
3997          break;
3998        }
3999      if ((traits & BlendPixelTrait) == 0)
4000        for (i=0; i < 4; i++)
4001        {
4002          alpha[i]=1.0;
4003          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4004        }
4005      else
4006        for (i=0; i < 4; i++)
4007        {
4008          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4009            GetPixelChannels(image));
4010          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4011        }
4012      delta.x=x-x_offset;
4013      delta.y=y-y_offset;
4014      luminance.x=GetPixelLuminance(image,p)-(double)
4015        GetPixelLuminance(image,p+3*GetPixelChannels(image));
4016      luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4017        GetPixelLuminance(image,p+2*GetPixelChannels(image));
4018      if (fabs(luminance.x) < fabs(luminance.y))
4019        {
4020          /*
4021            Diagonal 0-3 NW-SE.
4022          */
4023          if (delta.x <= delta.y)
4024            {
4025              /*
4026                Bottom-left triangle (pixel: 2, diagonal: 0-3).
4027              */
4028              delta.y=1.0-delta.y;
4029              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4030              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4031              *pixel=gamma*MeshInterpolate(&delta,pixels[2],pixels[3],
4032                pixels[0]);
4033            }
4034          else
4035            {
4036              /*
4037                Top-right triangle (pixel: 1, diagonal: 0-3).
4038              */
4039              delta.x=1.0-delta.x;
4040              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4041              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4042              *pixel=gamma*MeshInterpolate(&delta,pixels[1],pixels[0],
4043                pixels[3]);
4044            }
4045        }
4046      else
4047        {
4048          /*
4049            Diagonal 1-2 NE-SW.
4050          */
4051          if (delta.x <= (1.0-delta.y))
4052            {
4053              /*
4054                Top-left triangle (pixel: 0, diagonal: 1-2).
4055              */
4056              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4057              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4058              *pixel=gamma*MeshInterpolate(&delta,pixels[0],pixels[1],
4059                pixels[2]);
4060            }
4061          else
4062            {
4063              /*
4064                Bottom-right triangle (pixel: 3, diagonal: 1-2).
4065              */
4066              delta.x=1.0-delta.x;
4067              delta.y=1.0-delta.y;
4068              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4069              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4070              *pixel=gamma*MeshInterpolate(&delta,pixels[3],pixels[2],
4071                pixels[1]);
4072            }
4073        }
4074      break;
4075    }
4076    case SplineInterpolatePixel:
4077    {
4078      MagickRealType
4079        dx,
4080        dy;
4081
4082      PointInfo
4083        delta;
4084
4085      ssize_t
4086        j,
4087        n;
4088
4089      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4090        exception);
4091      if (p == (const Quantum *) NULL)
4092        {
4093          status=MagickFalse;
4094          break;
4095        }
4096      if ((traits & BlendPixelTrait) == 0)
4097        for (i=0; i < 16; i++)
4098        {
4099          alpha[i]=1.0;
4100          pixels[i]=(MagickRealType) p[i*GetPixelChannels(image)+channel];
4101        }
4102      else
4103        for (i=0; i < 16; i++)
4104        {
4105          alpha[i]=QuantumScale*GetPixelAlpha(image,p+i*
4106            GetPixelChannels(image));
4107          pixels[i]=alpha[i]*p[i*GetPixelChannels(image)+channel];
4108        }
4109      delta.x=x-x_offset;
4110      delta.y=y-y_offset;
4111      n=0;
4112      for (i=(-1); i < 3L; i++)
4113      {
4114        dy=CubicWeightingFunction((MagickRealType) i-delta.y);
4115        for (j=(-1); j < 3L; j++)
4116        {
4117          dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
4118          gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 : alpha[n]);
4119          *pixel+=gamma*dx*dy*pixels[n];
4120          n++;
4121        }
4122      }
4123      break;
4124    }
4125  }
4126  return(status);
4127}
4128
4129/*
4130%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4131%                                                                             %
4132%                                                                             %
4133%                                                                             %
4134%   I n t e r p o l a t e P i x e l C h a n n e l s                           %
4135%                                                                             %
4136%                                                                             %
4137%                                                                             %
4138%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4139%
4140%  InterpolatePixelChannels() applies a pixel interpolation method between a
4141%  floating point coordinate and the pixels surrounding that coordinate.  No
4142%  pixel area resampling, or scaling of the result is performed.
4143%
4144%  The format of the InterpolatePixelChannels method is:
4145%
4146%      MagickBooleanType InterpolatePixelChannels(const Image *source,
4147%        const CacheView *source_view,const Image *destination,
4148%        const PixelInterpolateMethod method,const double x,const double y,
4149%        Quantum *pixel,ExceptionInfo *exception)
4150%
4151%  A description of each parameter follows:
4152%
4153%    o source: the source.
4154%
4155%    o source_view: the source view.
4156%
4157%    o destination: the destination image.
4158%
4159%    o method: the pixel color interpolation method.
4160%
4161%    o x,y: A double representing the current (x,y) position of the pixel.
4162%
4163%    o pixel: return the interpolated pixel here.
4164%
4165%    o exception: return any errors or warnings in this structure.
4166%
4167*/
4168MagickExport MagickBooleanType InterpolatePixelChannels(const Image *source,
4169  const CacheView *source_view,const Image *destination,
4170  const PixelInterpolateMethod method,const double x,const double y,
4171  Quantum *pixel,ExceptionInfo *exception)
4172{
4173  MagickBooleanType
4174    status;
4175
4176  MagickRealType
4177    alpha[16],
4178    gamma,
4179    pixels[16];
4180
4181  PixelChannel
4182    channel;
4183
4184  PixelTrait
4185    destination_traits,
4186    traits;
4187
4188  register const Quantum
4189    *p;
4190
4191  register ssize_t
4192    i;
4193
4194  ssize_t
4195    x_offset,
4196    y_offset;
4197
4198  assert(source != (Image *) NULL);
4199  assert(source != (Image *) NULL);
4200  assert(source->signature == MagickSignature);
4201  assert(source_view != (CacheView *) NULL);
4202  status=MagickTrue;
4203  x_offset=(ssize_t) floor(x);
4204  y_offset=(ssize_t) floor(y);
4205  switch (method == UndefinedInterpolatePixel ? source->interpolate : method)
4206  {
4207    case AverageInterpolatePixel:
4208    {
4209      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4210        exception);
4211      if (p == (const Quantum *) NULL)
4212        {
4213          status=MagickFalse;
4214          break;
4215        }
4216      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4217      {
4218        double
4219          sum;
4220
4221        register ssize_t
4222          j;
4223
4224        channel=GetPixelChannelMapChannel(source,i);
4225        traits=GetPixelChannelMapTraits(source,channel);
4226        destination_traits=GetPixelChannelMapTraits(destination,channel);
4227        if ((traits == UndefinedPixelTrait) ||
4228            (destination_traits == UndefinedPixelTrait))
4229          continue;
4230        for (j=0; j < 16; j++)
4231          pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4232        sum=0.0;
4233        if ((traits & BlendPixelTrait) == 0)
4234          {
4235            for (j=0; j < 16; j++)
4236              sum+=0.0625*pixels[j];
4237            SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
4238            continue;
4239          }
4240        for (j=0; j < 16; j++)
4241        {
4242          alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4243            GetPixelChannels(source));
4244          pixels[j]*=alpha[j];
4245          gamma=1.0/(fabs((double) alpha[j]) <= MagickEpsilon ? 1.0 : alpha[j]);
4246          sum+=gamma*0.0625*pixels[j];
4247        }
4248        SetPixelChannel(destination,channel,ClampToQuantum(sum),pixel);
4249      }
4250      break;
4251    }
4252    case BicubicInterpolatePixel:
4253    {
4254      MagickRealType
4255        u[4],
4256        v[4];
4257
4258      PointInfo
4259        delta;
4260
4261      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4262        exception);
4263      if (p == (const Quantum *) NULL)
4264        {
4265          status=MagickFalse;
4266          break;
4267        }
4268      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4269      {
4270        register ssize_t
4271          j;
4272
4273        channel=GetPixelChannelMapChannel(source,i);
4274        traits=GetPixelChannelMapTraits(source,channel);
4275        destination_traits=GetPixelChannelMapTraits(destination,channel);
4276        if ((traits == UndefinedPixelTrait) ||
4277            (destination_traits == UndefinedPixelTrait))
4278          continue;
4279        if ((traits & BlendPixelTrait) == 0)
4280          for (j=0; j < 16; j++)
4281          {
4282            alpha[j]=1.0;
4283            pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4284          }
4285        else
4286          for (j=0; j < 16; j++)
4287          {
4288            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4289              GetPixelChannels(source));
4290            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
4291          }
4292        delta.x=x-x_offset;
4293        delta.y=y-y_offset;
4294        for (j=0; j < 4; j++)
4295        {
4296          u[0]=(pixels[4*j+3]-pixels[4*j+2])-(pixels[4*j+0]-pixels[4*j+1]);
4297          u[1]=(pixels[4*j+0]-pixels[4*j+1])-u[0];
4298          u[2]=pixels[4*j+2]-pixels[4*j+0];
4299          u[3]=pixels[4*j+1];
4300          v[j]=(delta.x*delta.x*delta.x*u[0])+(delta.x*delta.x*u[1])+(delta.x*
4301            u[2])+u[3];
4302        }
4303        u[0]=(v[3]-v[2])-(v[0]-v[1]);
4304        u[1]=(v[0]-v[1])-u[0];
4305        u[2]=v[2]-v[0];
4306        u[3]=v[1];
4307        SetPixelChannel(destination,channel,ClampToQuantum((delta.y*delta.y*
4308          delta.y*u[0])+(delta.y*delta.y*u[1])+(delta.y*u[2])+u[3]),pixel);
4309      }
4310      break;
4311    }
4312    case BilinearInterpolatePixel:
4313    default:
4314    {
4315      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4316      if (p == (const Quantum *) NULL)
4317        {
4318          status=MagickFalse;
4319          break;
4320        }
4321      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4322      {
4323        PointInfo
4324          delta,
4325          epsilon;
4326
4327        channel=GetPixelChannelMapChannel(source,i);
4328        traits=GetPixelChannelMapTraits(source,channel);
4329        destination_traits=GetPixelChannelMapTraits(destination,channel);
4330        if ((traits == UndefinedPixelTrait) ||
4331            (destination_traits == UndefinedPixelTrait))
4332          continue;
4333        delta.x=x-x_offset;
4334        delta.y=y-y_offset;
4335        epsilon.x=1.0-delta.x;
4336        epsilon.y=1.0-delta.y;
4337        pixels[0]=(MagickRealType) p[i];
4338        pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
4339        pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
4340        pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
4341        if ((traits & BlendPixelTrait) == 0)
4342          {
4343            gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4344            gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4345            SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4346              (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*
4347              pixels[2]+delta.x*pixels[3]))),pixel);
4348            continue;
4349          }
4350        alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4351        alpha[1]=QuantumScale*GetPixelAlpha(source,p+GetPixelChannels(source));
4352        alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4353          GetPixelChannels(source));
4354        alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4355          GetPixelChannels(source));
4356        pixels[0]*=alpha[0];
4357        pixels[1]*=alpha[1];
4358        pixels[2]*=alpha[2];
4359        pixels[3]*=alpha[3];
4360        gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4361          (epsilon.x*alpha[2]+delta.x*alpha[3])));
4362        gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4363        SetPixelChannel(destination,channel,ClampToQuantum(gamma*(epsilon.y*
4364          (epsilon.x*pixels[0]+delta.x*pixels[1])+delta.y*(epsilon.x*pixels[2]+
4365          delta.x*pixels[3]))),pixel);
4366      }
4367      break;
4368    }
4369    case FilterInterpolatePixel:
4370    {
4371      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4372      {
4373        CacheView
4374          *filter_view;
4375
4376        Image
4377          *excerpt_source,
4378          *filter_source;
4379
4380        RectangleInfo
4381          geometry;
4382
4383        channel=GetPixelChannelMapChannel(source,i);
4384        traits=GetPixelChannelMapTraits(source,channel);
4385        destination_traits=GetPixelChannelMapTraits(destination,channel);
4386        if ((traits == UndefinedPixelTrait) ||
4387            (destination_traits == UndefinedPixelTrait))
4388          continue;
4389        geometry.width=4L;
4390        geometry.height=4L;
4391        geometry.x=x_offset-1;
4392        geometry.y=y_offset-1;
4393        excerpt_source=ExcerptImage(source,&geometry,exception);
4394        if (excerpt_source == (Image *) NULL)
4395          {
4396            status=MagickFalse;
4397            continue;
4398          }
4399        filter_source=ResizeImage(excerpt_source,1,1,source->filter,
4400          source->blur,exception);
4401        excerpt_source=DestroyImage(excerpt_source);
4402        if (filter_source == (Image *) NULL)
4403          continue;
4404        filter_view=AcquireCacheView(filter_source);
4405        p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4406        if (p == (const Quantum *) NULL)
4407          status=MagickFalse;
4408        else
4409          {
4410            SetPixelChannel(destination,channel,p[i],pixel);
4411          }
4412        filter_view=DestroyCacheView(filter_view);
4413        filter_source=DestroyImage(filter_source);
4414      }
4415      break;
4416    }
4417    case IntegerInterpolatePixel:
4418    {
4419      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,1,1,exception);
4420      if (p == (const Quantum *) NULL)
4421        {
4422          status=MagickFalse;
4423          break;
4424        }
4425      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4426      {
4427        channel=GetPixelChannelMapChannel(source,i);
4428        traits=GetPixelChannelMapTraits(source,channel);
4429        destination_traits=GetPixelChannelMapTraits(destination,channel);
4430        if ((traits == UndefinedPixelTrait) ||
4431            (destination_traits == UndefinedPixelTrait))
4432          continue;
4433        SetPixelChannel(destination,channel,p[i],pixel);
4434      }
4435      break;
4436    }
4437    case NearestNeighborInterpolatePixel:
4438    {
4439      p=GetCacheViewVirtualPixels(source_view,NearestNeighbor(x),
4440        NearestNeighbor(y),1,1,exception);
4441      if (p == (const Quantum *) NULL)
4442        {
4443          status=MagickFalse;
4444          break;
4445        }
4446      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4447      {
4448        channel=GetPixelChannelMapChannel(source,i);
4449        traits=GetPixelChannelMapTraits(source,channel);
4450        destination_traits=GetPixelChannelMapTraits(destination,channel);
4451        if ((traits == UndefinedPixelTrait) ||
4452            (destination_traits == UndefinedPixelTrait))
4453          continue;
4454        SetPixelChannel(destination,channel,p[i],pixel);
4455      }
4456      break;
4457    }
4458    case MeshInterpolatePixel:
4459    {
4460      p=GetCacheViewVirtualPixels(source_view,x_offset,y_offset,2,2,exception);
4461      if (p == (const Quantum *) NULL)
4462        {
4463          status=MagickFalse;
4464          break;
4465        }
4466      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4467      {
4468        PointInfo
4469          delta,
4470          luminance;
4471
4472        channel=GetPixelChannelMapChannel(source,i);
4473        traits=GetPixelChannelMapTraits(source,channel);
4474        destination_traits=GetPixelChannelMapTraits(destination,channel);
4475        if ((traits == UndefinedPixelTrait) ||
4476            (destination_traits == UndefinedPixelTrait))
4477          continue;
4478        pixels[0]=(MagickRealType) p[i];
4479        pixels[1]=(MagickRealType) p[GetPixelChannels(source)+i];
4480        pixels[2]=(MagickRealType) p[2*GetPixelChannels(source)+i];
4481        pixels[3]=(MagickRealType) p[3*GetPixelChannels(source)+i];
4482        if ((traits & BlendPixelTrait) == 0)
4483          {
4484            alpha[0]=1.0;
4485            alpha[1]=1.0;
4486            alpha[2]=1.0;
4487            alpha[3]=1.0;
4488          }
4489        else
4490          {
4491            alpha[0]=QuantumScale*GetPixelAlpha(source,p);
4492            alpha[1]=QuantumScale*GetPixelAlpha(source,p+
4493              GetPixelChannels(source));
4494            alpha[2]=QuantumScale*GetPixelAlpha(source,p+2*
4495              GetPixelChannels(source));
4496            alpha[3]=QuantumScale*GetPixelAlpha(source,p+3*
4497              GetPixelChannels(source));
4498          }
4499        delta.x=x-x_offset;
4500        delta.y=y-y_offset;
4501        luminance.x=GetPixelLuminance(source,p)-(double)
4502          GetPixelLuminance(source,p+3*GetPixelChannels(source));
4503        luminance.y=GetPixelLuminance(source,p+GetPixelChannels(source))-
4504          (double) GetPixelLuminance(source,p+2*GetPixelChannels(source));
4505        if (fabs(luminance.x) < fabs(luminance.y))
4506          {
4507            /*
4508              Diagonal 0-3 NW-SE.
4509            */
4510            if (delta.x <= delta.y)
4511              {
4512                /*
4513                  Bottom-left triangle (pixel: 2, diagonal: 0-3).
4514                */
4515                delta.y=1.0-delta.y;
4516                gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4517                gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4518                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4519                  MeshInterpolate(&delta,pixels[2],pixels[3],pixels[0])),pixel);
4520              }
4521            else
4522              {
4523                /*
4524                  Top-right triangle (pixel: 1, diagonal: 0-3).
4525                */
4526                delta.x=1.0-delta.x;
4527                gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
4528                gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4529                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4530                  MeshInterpolate(&delta,pixels[1],pixels[0],pixels[3])),pixel);
4531              }
4532          }
4533        else
4534          {
4535            /*
4536              Diagonal 1-2 NE-SW.
4537            */
4538            if (delta.x <= (1.0-delta.y))
4539              {
4540                /*
4541                  Top-left triangle (pixel: 0, diagonal: 1-2).
4542                */
4543                gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
4544                gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4545                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4546                  MeshInterpolate(&delta,pixels[0],pixels[1],pixels[2])),pixel);
4547              }
4548            else
4549              {
4550                /*
4551                  Bottom-right triangle (pixel: 3, diagonal: 1-2).
4552                */
4553                delta.x=1.0-delta.x;
4554                delta.y=1.0-delta.y;
4555                gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
4556                gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4557                SetPixelChannel(destination,channel,ClampToQuantum(gamma*
4558                  MeshInterpolate(&delta,pixels[3],pixels[2],pixels[1])),pixel);
4559              }
4560          }
4561      }
4562      break;
4563    }
4564    case SplineInterpolatePixel:
4565    {
4566      p=GetCacheViewVirtualPixels(source_view,x_offset-1,y_offset-1,4,4,
4567        exception);
4568      if (p == (const Quantum *) NULL)
4569        {
4570          status=MagickFalse;
4571          break;
4572        }
4573      for (i=0; i < (ssize_t) GetPixelChannels(source); i++)
4574      {
4575        double
4576          sum;
4577
4578        MagickRealType
4579          dx,
4580          dy;
4581
4582        PointInfo
4583          delta;
4584
4585        register ssize_t
4586          j;
4587
4588        ssize_t
4589          k,
4590          n;
4591
4592        channel=GetPixelChannelMapChannel(source,i);
4593        traits=GetPixelChannelMapTraits(source,channel);
4594        destination_traits=GetPixelChannelMapTraits(destination,channel);
4595        if ((traits == UndefinedPixelTrait) ||
4596            (destination_traits == UndefinedPixelTrait))
4597          continue;
4598        if ((traits & BlendPixelTrait) == 0)
4599          for (j=0; j < 16; j++)
4600          {
4601            alpha[j]=1.0;
4602            pixels[j]=(MagickRealType) p[j*GetPixelChannels(source)+i];
4603          }
4604        else
4605          for (j=0; j < 16; j++)
4606          {
4607            alpha[j]=QuantumScale*GetPixelAlpha(source,p+j*
4608              GetPixelChannels(source));
4609            pixels[j]=alpha[j]*p[j*GetPixelChannels(source)+i];
4610          }
4611        delta.x=x-x_offset;
4612        delta.y=y-y_offset;
4613        sum=0.0;
4614        n=0;
4615        for (j=(-1); j < 3L; j++)
4616        {
4617          dy=CubicWeightingFunction((MagickRealType) j-delta.y);
4618          for (k=(-1); k < 3L; k++)
4619          {
4620            dx=CubicWeightingFunction(delta.x-(MagickRealType) k);
4621            gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 :
4622              alpha[n]);
4623            sum+=gamma*dx*dy*pixels[n];
4624            n++;
4625          }
4626        }
4627        SetPixelChannel(destination,channel,p[i],pixel);
4628      }
4629      break;
4630    }
4631  }
4632  return(status);
4633}
4634
4635/*
4636%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4637%                                                                             %
4638%                                                                             %
4639%                                                                             %
4640%   I n t e r p o l a t e P i x e l I n f o                                   %
4641%                                                                             %
4642%                                                                             %
4643%                                                                             %
4644%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4645%
4646%  InterpolatePixelInfo() applies a pixel interpolation method between a
4647%  floating point coordinate and the pixels surrounding that coordinate.  No
4648%  pixel area resampling, or scaling of the result is performed.
4649%
4650%  The format of the InterpolatePixelInfo method is:
4651%
4652%      MagickBooleanType InterpolatePixelInfo(const Image *image,
4653%        const CacheView *image_view,const PixelInterpolateMethod method,
4654%        const double x,const double y,PixelInfo *pixel,
4655%        ExceptionInfo *exception)
4656%
4657%  A description of each parameter follows:
4658%
4659%    o image: the image.
4660%
4661%    o image_view: the image view.
4662%
4663%    o method: the pixel color interpolation method.
4664%
4665%    o x,y: A double representing the current (x,y) position of the pixel.
4666%
4667%    o pixel: return the interpolated pixel here.
4668%
4669%    o exception: return any errors or warnings in this structure.
4670%
4671*/
4672
4673static inline void AlphaBlendPixelInfo(const Image *image,
4674  const Quantum *pixel,PixelInfo *pixel_info,MagickRealType *alpha)
4675{
4676  if (image->matte == MagickFalse)
4677    {
4678      *alpha=1.0;
4679      pixel_info->red=(MagickRealType) GetPixelRed(image,pixel);
4680      pixel_info->green=(MagickRealType) GetPixelGreen(image,pixel);
4681      pixel_info->blue=(MagickRealType) GetPixelBlue(image,pixel);
4682      pixel_info->black=0.0;
4683      if (image->colorspace == CMYKColorspace)
4684        pixel_info->black=(MagickRealType) GetPixelBlack(image,pixel);
4685      pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
4686      return;
4687    }
4688  *alpha=QuantumScale*GetPixelAlpha(image,pixel);
4689  pixel_info->red=(*alpha*GetPixelRed(image,pixel));
4690  pixel_info->green=(*alpha*GetPixelGreen(image,pixel));
4691  pixel_info->blue=(*alpha*GetPixelBlue(image,pixel));
4692  pixel_info->black=0.0;
4693  if (image->colorspace == CMYKColorspace)
4694    pixel_info->black=(*alpha*GetPixelBlack(image,pixel));
4695  pixel_info->alpha=(MagickRealType) GetPixelAlpha(image,pixel);
4696}
4697
4698static void BicubicInterpolate(const PixelInfo *pixels,const double dx,
4699  PixelInfo *pixel)
4700{
4701  MagickRealType
4702    dx2,
4703    p,
4704    q,
4705    r,
4706    s;
4707
4708  dx2=dx*dx;
4709  p=(pixels[3].red-pixels[2].red)-(pixels[0].red-pixels[1].red);
4710  q=(pixels[0].red-pixels[1].red)-p;
4711  r=pixels[2].red-pixels[0].red;
4712  s=pixels[1].red;
4713  pixel->red=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4714  p=(pixels[3].green-pixels[2].green)-(pixels[0].green-pixels[1].green);
4715  q=(pixels[0].green-pixels[1].green)-p;
4716  r=pixels[2].green-pixels[0].green;
4717  s=pixels[1].green;
4718  pixel->green=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4719  p=(pixels[3].blue-pixels[2].blue)-(pixels[0].blue-pixels[1].blue);
4720  q=(pixels[0].blue-pixels[1].blue)-p;
4721  r=pixels[2].blue-pixels[0].blue;
4722  s=pixels[1].blue;
4723  pixel->blue=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4724  p=(pixels[3].alpha-pixels[2].alpha)-(pixels[0].alpha-pixels[1].alpha);
4725  q=(pixels[0].alpha-pixels[1].alpha)-p;
4726  r=pixels[2].alpha-pixels[0].alpha;
4727  s=pixels[1].alpha;
4728  pixel->alpha=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4729  if (pixel->colorspace == CMYKColorspace)
4730    {
4731      p=(pixels[3].black-pixels[2].black)-(pixels[0].black-pixels[1].black);
4732      q=(pixels[0].black-pixels[1].black)-p;
4733      r=pixels[2].black-pixels[0].black;
4734      s=pixels[1].black;
4735      pixel->black=(dx*dx2*p)+(dx2*q)+(dx*r)+s;
4736    }
4737}
4738
4739MagickExport MagickBooleanType InterpolatePixelInfo(const Image *image,
4740  const CacheView *image_view,const PixelInterpolateMethod method,
4741  const double x,const double y,PixelInfo *pixel,ExceptionInfo *exception)
4742{
4743  MagickBooleanType
4744    status;
4745
4746  MagickRealType
4747    alpha[16],
4748    gamma;
4749
4750  PixelInfo
4751    pixels[16];
4752
4753  register const Quantum
4754    *p;
4755
4756  register ssize_t
4757    i;
4758
4759  ssize_t
4760    x_offset,
4761    y_offset;
4762
4763  assert(image != (Image *) NULL);
4764  assert(image->signature == MagickSignature);
4765  assert(image_view != (CacheView *) NULL);
4766  status=MagickTrue;
4767  x_offset=(ssize_t) floor(x);
4768  y_offset=(ssize_t) floor(y);
4769  switch (method == UndefinedInterpolatePixel ? image->interpolate : method)
4770  {
4771    case AverageInterpolatePixel:
4772    {
4773      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4774        exception);
4775      if (p == (const Quantum *) NULL)
4776        {
4777          status=MagickFalse;
4778          break;
4779        }
4780      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4781      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4782      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4783      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4784      AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
4785      AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
4786      AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
4787      AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
4788      AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
4789      AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
4790      AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
4791        10);
4792      AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
4793        11);
4794      AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
4795        12);
4796      AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
4797        13);
4798      AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
4799        14);
4800      AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
4801        15);
4802      pixel->red=0.0;
4803      pixel->green=0.0;
4804      pixel->blue=0.0;
4805      pixel->black=0.0;
4806      pixel->alpha=0.0;
4807      for (i=0; i < 16L; i++)
4808      {
4809        gamma=1.0/(fabs((double) alpha[i]) <= MagickEpsilon ? 1.0 : alpha[i]);
4810        pixel->red+=gamma*0.0625*pixels[i].red;
4811        pixel->green+=gamma*0.0625*pixels[i].green;
4812        pixel->blue+=gamma*0.0625*pixels[i].blue;
4813        if (image->colorspace == CMYKColorspace)
4814          pixel->black+=gamma*0.0625*pixels[i].black;
4815        pixel->alpha+=0.0625*pixels[i].alpha;
4816      }
4817      break;
4818    }
4819    case BicubicInterpolatePixel:
4820    {
4821      PixelInfo
4822        u[4];
4823
4824      PointInfo
4825        delta;
4826
4827      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
4828        exception);
4829      if (p == (const Quantum *) NULL)
4830        {
4831          status=MagickFalse;
4832          break;
4833        }
4834      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4835      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4836      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4837      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4838      AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
4839      AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
4840      AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
4841      AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
4842      AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
4843      AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
4844      AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
4845        10);
4846      AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
4847        11);
4848      AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
4849        12);
4850      AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
4851        13);
4852      AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
4853        14);
4854      AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
4855        15);
4856      delta.x=x-x_offset;
4857      delta.y=y-y_offset;
4858      for (i=0; i < 4L; i++)
4859        BicubicInterpolate(pixels+4*i,delta.x,u+i);
4860      BicubicInterpolate(u,delta.y,pixel);
4861      break;
4862    }
4863    case BilinearInterpolatePixel:
4864    default:
4865    {
4866      PointInfo
4867        delta,
4868        epsilon;
4869
4870      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4871      if (p == (const Quantum *) NULL)
4872        {
4873          status=MagickFalse;
4874          break;
4875        }
4876      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4877      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4878      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4879      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4880      delta.x=x-x_offset;
4881      delta.y=y-y_offset;
4882      epsilon.x=1.0-delta.x;
4883      epsilon.y=1.0-delta.y;
4884      gamma=((epsilon.y*(epsilon.x*alpha[0]+delta.x*alpha[1])+delta.y*
4885        (epsilon.x*alpha[2]+delta.x*alpha[3])));
4886      gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4887      pixel->red=gamma*(epsilon.y*(epsilon.x*pixels[0].red+delta.x*
4888        pixels[1].red)+delta.y*(epsilon.x*pixels[2].red+delta.x*pixels[3].red));
4889      pixel->green=gamma*(epsilon.y*(epsilon.x*pixels[0].green+delta.x*
4890        pixels[1].green)+delta.y*(epsilon.x*pixels[2].green+delta.x*
4891        pixels[3].green));
4892      pixel->blue=gamma*(epsilon.y*(epsilon.x*pixels[0].blue+delta.x*
4893        pixels[1].blue)+delta.y*(epsilon.x*pixels[2].blue+delta.x*
4894        pixels[3].blue));
4895      if (image->colorspace == CMYKColorspace)
4896        pixel->black=gamma*(epsilon.y*(epsilon.x*pixels[0].black+delta.x*
4897          pixels[1].black)+delta.y*(epsilon.x*pixels[2].black+delta.x*
4898          pixels[3].black));
4899      gamma=((epsilon.y*(epsilon.x+delta.x)+delta.y*(epsilon.x+delta.x)));
4900      gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4901      pixel->alpha=(epsilon.y*(epsilon.x*pixels[0].alpha+delta.x*
4902        pixels[1].alpha)+delta.y*(epsilon.x*pixels[2].alpha+delta.x*
4903        pixels[3].alpha));
4904      break;
4905    }
4906    case FilterInterpolatePixel:
4907    {
4908      CacheView
4909        *filter_view;
4910
4911      Image
4912        *excerpt_image,
4913        *filter_image;
4914
4915      RectangleInfo
4916        geometry;
4917
4918      geometry.width=4L;
4919      geometry.height=4L;
4920      geometry.x=x_offset-1;
4921      geometry.y=y_offset-1;
4922      excerpt_image=ExcerptImage(image,&geometry,exception);
4923      if (excerpt_image == (Image *) NULL)
4924        {
4925          status=MagickFalse;
4926          break;
4927        }
4928      filter_image=ResizeImage(excerpt_image,1,1,image->filter,image->blur,
4929        exception);
4930      excerpt_image=DestroyImage(excerpt_image);
4931      if (filter_image == (Image *) NULL)
4932        break;
4933      filter_view=AcquireCacheView(filter_image);
4934      p=GetCacheViewVirtualPixels(filter_view,0,0,1,1,exception);
4935      if (p != (const Quantum *) NULL)
4936        GetPixelInfoPixel(image,p,pixel);
4937      filter_view=DestroyCacheView(filter_view);
4938      filter_image=DestroyImage(filter_image);
4939      break;
4940    }
4941    case IntegerInterpolatePixel:
4942    {
4943      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,1,1,exception);
4944      if (p == (const Quantum *) NULL)
4945        {
4946          status=MagickFalse;
4947          break;
4948        }
4949      GetPixelInfoPixel(image,p,pixel);
4950      break;
4951    }
4952    case MeshInterpolatePixel:
4953    {
4954      PointInfo
4955        delta,
4956        luminance;
4957
4958      p=GetCacheViewVirtualPixels(image_view,x_offset,y_offset,2,2,exception);
4959      if (p == (const Quantum *) NULL)
4960        {
4961          status=MagickFalse;
4962          break;
4963        }
4964      delta.x=x-x_offset;
4965      delta.y=y-y_offset;
4966      luminance.x=GetPixelLuminance(image,p)-(double)
4967        GetPixelLuminance(image,p+3*GetPixelChannels(image));
4968      luminance.y=GetPixelLuminance(image,p+GetPixelChannels(image))-(double)
4969        GetPixelLuminance(image,p+2*GetPixelChannels(image));
4970      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
4971      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
4972      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
4973      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
4974      if (fabs(luminance.x) < fabs(luminance.y))
4975        {
4976          /*
4977            Diagonal 0-3 NW-SE.
4978          */
4979          if (delta.x <= delta.y)
4980            {
4981              /*
4982                Bottom-left triangle (pixel: 2, diagonal: 0-3).
4983              */
4984              delta.y=1.0-delta.y;
4985              gamma=MeshInterpolate(&delta,alpha[2],alpha[3],alpha[0]);
4986              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
4987              pixel->red=gamma*MeshInterpolate(&delta,pixels[2].red,
4988                pixels[3].red,pixels[0].red);
4989              pixel->green=gamma*MeshInterpolate(&delta,pixels[2].green,
4990                pixels[3].green,pixels[0].green);
4991              pixel->blue=gamma*MeshInterpolate(&delta,pixels[2].blue,
4992                pixels[3].blue,pixels[0].blue);
4993              if (image->colorspace == CMYKColorspace)
4994                pixel->black=gamma*MeshInterpolate(&delta,pixels[2].black,
4995                  pixels[3].black,pixels[0].black);
4996              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
4997              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[2].alpha,
4998                pixels[3].alpha,pixels[0].alpha);
4999            }
5000          else
5001            {
5002              /*
5003                Top-right triangle (pixel:1 , diagonal: 0-3).
5004              */
5005              delta.x=1.0-delta.x;
5006              gamma=MeshInterpolate(&delta,alpha[1],alpha[0],alpha[3]);
5007              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
5008              pixel->red=gamma*MeshInterpolate(&delta,pixels[1].red,
5009                pixels[0].red,pixels[3].red);
5010              pixel->green=gamma*MeshInterpolate(&delta,pixels[1].green,
5011                pixels[0].green,pixels[3].green);
5012              pixel->blue=gamma*MeshInterpolate(&delta,pixels[1].blue,
5013                pixels[0].blue,pixels[3].blue);
5014              if (image->colorspace == CMYKColorspace)
5015                pixel->black=gamma*MeshInterpolate(&delta,pixels[1].black,
5016                  pixels[0].black,pixels[3].black);
5017              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5018              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[1].alpha,
5019                pixels[0].alpha,pixels[3].alpha);
5020            }
5021        }
5022      else
5023        {
5024          /*
5025            Diagonal 1-2 NE-SW.
5026          */
5027          if (delta.x <= (1.0-delta.y))
5028            {
5029              /*
5030                Top-left triangle (pixel: 0, diagonal: 1-2).
5031              */
5032              gamma=MeshInterpolate(&delta,alpha[0],alpha[1],alpha[2]);
5033              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
5034              pixel->red=gamma*MeshInterpolate(&delta,pixels[0].red,
5035                pixels[1].red,pixels[2].red);
5036              pixel->green=gamma*MeshInterpolate(&delta,pixels[0].green,
5037                pixels[1].green,pixels[2].green);
5038              pixel->blue=gamma*MeshInterpolate(&delta,pixels[0].blue,
5039                pixels[1].blue,pixels[2].blue);
5040              if (image->colorspace == CMYKColorspace)
5041                pixel->black=gamma*MeshInterpolate(&delta,pixels[0].black,
5042                  pixels[1].black,pixels[2].black);
5043              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5044              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[0].alpha,
5045                pixels[1].alpha,pixels[2].alpha);
5046            }
5047          else
5048            {
5049              /*
5050                Bottom-right triangle (pixel: 3, diagonal: 1-2).
5051              */
5052              delta.x=1.0-delta.x;
5053              delta.y=1.0-delta.y;
5054              gamma=MeshInterpolate(&delta,alpha[3],alpha[2],alpha[1]);
5055              gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
5056              pixel->red=gamma*MeshInterpolate(&delta,pixels[3].red,
5057                pixels[2].red,pixels[1].red);
5058              pixel->green=gamma*MeshInterpolate(&delta,pixels[3].green,
5059                pixels[2].green,pixels[1].green);
5060              pixel->blue=gamma*MeshInterpolate(&delta,pixels[3].blue,
5061                pixels[2].blue,pixels[1].blue);
5062              if (image->colorspace == CMYKColorspace)
5063                pixel->black=gamma*MeshInterpolate(&delta,pixels[3].black,
5064                  pixels[2].black,pixels[1].black);
5065              gamma=MeshInterpolate(&delta,1.0,1.0,1.0);
5066              pixel->alpha=gamma*MeshInterpolate(&delta,pixels[3].alpha,
5067                pixels[2].alpha,pixels[1].alpha);
5068            }
5069        }
5070      break;
5071    }
5072    case NearestNeighborInterpolatePixel:
5073    {
5074      p=GetCacheViewVirtualPixels(image_view,NearestNeighbor(x),
5075        NearestNeighbor(y),1,1,exception);
5076      if (p == (const Quantum *) NULL)
5077        {
5078          status=MagickFalse;
5079          break;
5080        }
5081      GetPixelInfoPixel(image,p,pixel);
5082      break;
5083    }
5084    case SplineInterpolatePixel:
5085    {
5086      MagickRealType
5087        dx,
5088        dy;
5089
5090      PointInfo
5091        delta;
5092
5093      ssize_t
5094        j,
5095        n;
5096
5097      p=GetCacheViewVirtualPixels(image_view,x_offset-1,y_offset-1,4,4,
5098        exception);
5099      if (p == (const Quantum *) NULL)
5100        {
5101          status=MagickFalse;
5102          break;
5103        }
5104      AlphaBlendPixelInfo(image,p,pixels+0,alpha+0);
5105      AlphaBlendPixelInfo(image,p+GetPixelChannels(image),pixels+1,alpha+1);
5106      AlphaBlendPixelInfo(image,p+2*GetPixelChannels(image),pixels+2,alpha+2);
5107      AlphaBlendPixelInfo(image,p+3*GetPixelChannels(image),pixels+3,alpha+3);
5108      AlphaBlendPixelInfo(image,p+4*GetPixelChannels(image),pixels+4,alpha+4);
5109      AlphaBlendPixelInfo(image,p+5*GetPixelChannels(image),pixels+5,alpha+5);
5110      AlphaBlendPixelInfo(image,p+6*GetPixelChannels(image),pixels+6,alpha+6);
5111      AlphaBlendPixelInfo(image,p+7*GetPixelChannels(image),pixels+7,alpha+7);
5112      AlphaBlendPixelInfo(image,p+8*GetPixelChannels(image),pixels+8,alpha+8);
5113      AlphaBlendPixelInfo(image,p+9*GetPixelChannels(image),pixels+9,alpha+9);
5114      AlphaBlendPixelInfo(image,p+10*GetPixelChannels(image),pixels+10,alpha+
5115        10);
5116      AlphaBlendPixelInfo(image,p+11*GetPixelChannels(image),pixels+11,alpha+
5117        11);
5118      AlphaBlendPixelInfo(image,p+12*GetPixelChannels(image),pixels+12,alpha+
5119        12);
5120      AlphaBlendPixelInfo(image,p+13*GetPixelChannels(image),pixels+13,alpha+
5121        13);
5122      AlphaBlendPixelInfo(image,p+14*GetPixelChannels(image),pixels+14,alpha+
5123        14);
5124      AlphaBlendPixelInfo(image,p+15*GetPixelChannels(image),pixels+15,alpha+
5125        15);
5126      pixel->red=0.0;
5127      pixel->green=0.0;
5128      pixel->blue=0.0;
5129      pixel->black=0.0;
5130      pixel->alpha=0.0;
5131      delta.x=x-x_offset;
5132      delta.y=y-y_offset;
5133      n=0;
5134      for (i=(-1); i < 3L; i++)
5135      {
5136        dy=CubicWeightingFunction((MagickRealType) i-delta.y);
5137        for (j=(-1); j < 3L; j++)
5138        {
5139          dx=CubicWeightingFunction(delta.x-(MagickRealType) j);
5140          gamma=1.0/(fabs((double) alpha[n]) <= MagickEpsilon ? 1.0 : alpha[n]);
5141          pixel->red+=gamma*dx*dy*pixels[n].red;
5142          pixel->green+=gamma*dx*dy*pixels[n].green;
5143          pixel->blue+=gamma*dx*dy*pixels[n].blue;
5144          if (image->colorspace == CMYKColorspace)
5145            pixel->black+=gamma*dx*dy*pixels[n].black;
5146          pixel->alpha+=dx*dy*pixels[n].alpha;
5147          n++;
5148        }
5149      }
5150      break;
5151    }
5152  }
5153  return(status);
5154}
5155
5156/*
5157%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5158%                                                                             %
5159%                                                                             %
5160%                                                                             %
5161+   I s F u z z y E q u i v a l e n c e P i x e l                             %
5162%                                                                             %
5163%                                                                             %
5164%                                                                             %
5165%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5166%
5167%  IsFuzzyEquivalencePixel() returns MagickTrue if the distance between two
5168%  pixels is less than the specified distance in a linear three (or four)u
5169%  dimensional color space.
5170%
5171%  The format of the IsFuzzyEquivalencePixel method is:
5172%
5173%      void IsFuzzyEquivalencePixel(const Image *source,const Quantum *p,
5174%        const Image *destination,const Quantum *q)
5175%
5176%  A description of each parameter follows:
5177%
5178%    o source: the source image.
5179%
5180%    o p: Pixel p.
5181%
5182%    o destination: the destination image.
5183%
5184%    o q: Pixel q.
5185%
5186*/
5187MagickExport MagickBooleanType IsFuzzyEquivalencePixel(const Image *source,
5188  const Quantum *p,const Image *destination,const Quantum *q)
5189{
5190  MagickRealType
5191    fuzz,
5192    pixel;
5193
5194  register MagickRealType
5195    distance,
5196    scale;
5197
5198  fuzz=MagickMax(source->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(
5199    destination->fuzz,(MagickRealType) MagickSQ1_2);
5200  scale=1.0;
5201  distance=0.0;
5202  if (source->matte != MagickFalse)
5203    {
5204      /*
5205        Transparencies are involved - set alpha distance
5206      */
5207      pixel=GetPixelAlpha(source,p)-(MagickRealType)
5208        GetPixelAlpha(destination,q);
5209      distance=pixel*pixel;
5210      if (distance > fuzz)
5211        return(MagickFalse);
5212      /*
5213        Generate a alpha scaling factor to generate a 4D cone on colorspace
5214        Note that if one color is transparent, distance has no color component.
5215      */
5216      scale=QuantumScale*GetPixelAlpha(source,p);
5217      scale*=QuantumScale*GetPixelAlpha(destination,q);
5218      if (scale <= MagickEpsilon)
5219        return(MagickTrue);
5220    }
5221  /*
5222    RGB or CMY color cube
5223  */
5224  distance*=3.0;  /* rescale appropriately */
5225  fuzz*=3.0;
5226  pixel=GetPixelRed(source,p)-(MagickRealType) GetPixelRed(destination,q);
5227  if ((source->colorspace == HSLColorspace) ||
5228      (source->colorspace == HSBColorspace) ||
5229      (source->colorspace == HWBColorspace))
5230    {
5231      /*
5232        Compute an arc distance for hue.  It should be a vector angle of
5233        'S'/'W' length with 'L'/'B' forming appropriate cones.
5234      */
5235      if (fabs((double) pixel) > (QuantumRange/2))
5236        pixel-=QuantumRange;
5237      pixel*=2;
5238    }
5239  distance+=scale*pixel*pixel;
5240  if (distance > fuzz)
5241    return(MagickFalse);
5242  pixel=GetPixelGreen(source,p)-(MagickRealType) GetPixelGreen(destination,q);
5243  distance+=scale*pixel*pixel;
5244  if (distance > fuzz)
5245    return(MagickFalse);
5246  pixel=GetPixelBlue(source,p)-(MagickRealType) GetPixelBlue(destination,q);
5247  distance+=scale*pixel*pixel;
5248  if (distance > fuzz)
5249    return(MagickFalse);
5250  return(MagickTrue);
5251}
5252
5253/*
5254%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5255%                                                                             %
5256%                                                                             %
5257%                                                                             %
5258+   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                     %
5259%                                                                             %
5260%                                                                             %
5261%                                                                             %
5262%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5263%
5264%  IsFuzzyEquivalencePixelInfo() returns true if the distance between two
5265%  colors is less than the specified distance in a linear three (or four)
5266%  dimensional color space.
5267%
5268%  This implements the equivalent of:
5269%    fuzz < sqrt(color_distance^2 * u.a*v.a  + alpha_distance^2)
5270%
5271%  Which produces a multi-dimensional cone for that colorspace along the
5272%  transparency vector.
5273%
5274%  For example for an RGB:
5275%    color_distance^2  = ( (u.r-v.r)^2 + (u.g-v.g)^2 + (u.b-v.b)^2 ) / 3
5276%
5277%  See http://www.imagemagick.org/Usage/bugs/fuzz_distance/
5278%
5279%  Hue colorspace distances need more work.  Hue is not a distance, it is an
5280%  angle!
5281%
5282%  A check that q is in the same color space as p should be made and the
5283%  appropriate mapping made.  -- Anthony Thyssen  8 December 2010
5284%
5285%  The format of the IsFuzzyEquivalencePixelInfo method is:
5286%
5287%      MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5288%        const PixelInfo *q)
5289%
5290%  A description of each parameter follows:
5291%
5292%    o p: Pixel p.
5293%
5294%    o q: Pixel q.
5295%
5296*/
5297MagickExport MagickBooleanType IsFuzzyEquivalencePixelInfo(const PixelInfo *p,
5298  const PixelInfo *q)
5299{
5300  MagickRealType
5301    fuzz,
5302    pixel;
5303
5304  register MagickRealType
5305    scale,
5306    distance;
5307
5308  if ((p->fuzz == 0.0) && (q->fuzz == 0.0))
5309    return(IsPixelInfoEquivalent(p,q));
5310  if (p->fuzz == 0.0)
5311    fuzz=MagickMax(q->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(q->fuzz,
5312      (MagickRealType) MagickSQ1_2);
5313  else if (q->fuzz == 0.0)
5314    fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(p->fuzz,
5315      (MagickRealType) MagickSQ1_2);
5316  else
5317    fuzz=MagickMax(p->fuzz,(MagickRealType) MagickSQ1_2)*MagickMax(q->fuzz,
5318      (MagickRealType) MagickSQ1_2);
5319  scale=1.0;
5320  distance=0.0;
5321  if ((p->matte != MagickFalse) || (q->matte != MagickFalse))
5322    {
5323      /*
5324        Transparencies are involved - set alpha distance.
5325      */
5326      pixel=(p->matte != MagickFalse ? p->alpha : OpaqueAlpha)-
5327        (q->matte != MagickFalse ? q->alpha : OpaqueAlpha);
5328      distance=pixel*pixel;
5329      if (distance > fuzz)
5330        return(MagickFalse);
5331      /*
5332        Generate a alpha scaling factor to generate a 4D cone on colorspace.
5333        If one color is transparent, distance has no color component.
5334      */
5335      if (p->matte != MagickFalse)
5336        scale=(QuantumScale*p->alpha);
5337      if (q->matte != MagickFalse)
5338        scale*=(QuantumScale*q->alpha);
5339      if (scale <= MagickEpsilon )
5340        return(MagickTrue);
5341    }
5342  /*
5343    CMYK create a CMY cube with a multi-dimensional cone toward black.
5344  */
5345  if (p->colorspace == CMYKColorspace)
5346    {
5347      pixel=p->black-q->black;
5348      distance+=pixel*pixel*scale;
5349      if (distance > fuzz)
5350        return(MagickFalse);
5351      scale*=(MagickRealType) (QuantumScale*(QuantumRange-p->black));
5352      scale*=(MagickRealType) (QuantumScale*(QuantumRange-q->black));
5353    }
5354  /*
5355    RGB or CMY color cube.
5356  */
5357  distance*=3.0;  /* rescale appropriately */
5358  fuzz*=3.0;
5359  pixel=p->red-q->red;
5360  if ((p->colorspace == HSLColorspace) || (p->colorspace == HSBColorspace) ||
5361      (p->colorspace == HWBColorspace))
5362    {
5363      /*
5364        This calculates a arc distance for hue-- it should be a vector angle
5365        of 'S'/'W' length with 'L'/'B' forming appropriate cones.  In other
5366        words this is a hack - Anthony.
5367      */
5368      if (fabs((double) pixel) > (QuantumRange/2))
5369        pixel-=QuantumRange;
5370      pixel*=2;
5371    }
5372  distance+=pixel*pixel*scale;
5373  if (distance > fuzz)
5374    return(MagickFalse);
5375  pixel=p->green-q->green;
5376  distance+=pixel*pixel*scale;
5377  if (distance > fuzz)
5378    return(MagickFalse);
5379  pixel=p->blue-q->blue;
5380  distance+=pixel*pixel*scale;
5381  if (distance > fuzz)
5382    return(MagickFalse);
5383  return(MagickTrue);
5384}
5385
5386/*
5387%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5388%                                                                             %
5389%                                                                             %
5390%                                                                             %
5391%   S e t P i x e l C h a n n e l M a p M a s k                               %
5392%                                                                             %
5393%                                                                             %
5394%                                                                             %
5395%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5396%
5397%  SetPixelChannelMapMask() sets the pixel channel map from the specified
5398%  channel mask.
5399%
5400%  The format of the SetPixelChannelMapMask method is:
5401%
5402%      void SetPixelChannelMapMask(Image *image,const ChannelType channel_mask)
5403%
5404%  A description of each parameter follows:
5405%
5406%    o image: the image.
5407%
5408%    o mask: the channel mask.
5409%
5410*/
5411MagickExport void SetPixelChannelMapMask(Image *image,
5412  const ChannelType channel_mask)
5413{
5414#define GetChannelBit(mask,bit)  (((size_t) (mask) >> (size_t) (bit)) & 0x01)
5415
5416  register ssize_t
5417    i;
5418
5419  image->channel_mask=channel_mask;
5420  for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
5421  {
5422    PixelChannel
5423      channel;
5424
5425    channel=GetPixelChannelMapChannel(image,i);
5426    SetPixelChannelMapTraits(image,channel,
5427      GetChannelBit(channel_mask,channel) == 0 ? CopyPixelTrait :
5428      image->matte == MagickFalse || (channel == AlphaPixelChannel) ?
5429      UpdatePixelTrait : (PixelTrait) (UpdatePixelTrait | BlendPixelTrait));
5430  }
5431  if (image->storage_class == PseudoClass)
5432    SetPixelChannelMapTraits(image,IndexPixelChannel,CopyPixelTrait);
5433  if (image->debug != MagickFalse)
5434    LogPixelChannels(image);
5435}
5436
5437/*
5438%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5439%                                                                             %
5440%                                                                             %
5441%                                                                             %
5442%   S e t P i x e l C h a n n e l M a s k                                     %
5443%                                                                             %
5444%                                                                             %
5445%                                                                             %
5446%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5447%
5448%  SetPixelChannelMask() sets the pixel channel mask from the specified channel
5449%  mask.
5450%
5451%  The format of the SetPixelChannelMask method is:
5452%
5453%      ChannelType SetPixelChannelMask(Image *image,
5454%        const ChannelType channel_mask)
5455%
5456%  A description of each parameter follows:
5457%
5458%    o image: the image.
5459%
5460%    o channel_mask: the channel mask.
5461%
5462*/
5463MagickExport ChannelType SetPixelChannelMask(Image *image,
5464  const ChannelType channel_mask)
5465{
5466  ChannelType
5467    mask;
5468
5469  mask=image->channel_mask;
5470  image->channel_mask=channel_mask;
5471  SetPixelChannelMapMask(image,channel_mask);
5472  return(mask);
5473}
5474