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