icon.c revision 7e41fe84a841d7b9d7b36b245b65e9dcb3314943
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IIIII CCCC OOO N N % 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I C O O NN N % 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I C O O N N N % 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I C O O N NN % 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IIIII CCCC OOO N N % 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Read Microsoft Windows Icon Format % 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Software Design % 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% John Cristy % 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% July 1992 % 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 207e41fe84a841d7b9d7b36b245b65e9dcb3314943cristy% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization % 213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% dedicated to making software imaging solutions freely available. % 223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% You may not use this file except in compliance with the License. You may % 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% obtain a copy of the License at % 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% http://www.imagemagick.org/script/license.php % 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Unless required by applicable law or agreed to in writing, software % 293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% distributed under the License is distributed on an "AS IS" BASIS, % 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% See the License for the specific language governing permissions and % 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% limitations under the License. % 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include declarations. 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/studio.h" 433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob.h" 443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob-private.h" 453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/cache.h" 46e7e40559f0408c5f987aec5c1a51c30b0456509fcristy#include "magick/colormap.h" 473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/colorspace.h" 483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception.h" 493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception-private.h" 503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/image.h" 513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/image-private.h" 523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/list.h" 533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/log.h" 543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/magick.h" 553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/memory_.h" 563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/monitor.h" 573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/monitor-private.h" 583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/nt-feature.h" 593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/quantize.h" 603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/quantum-private.h" 613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/static.h" 623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/string_.h" 633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/module.h" 643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Define declarations. 673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 680157aeadef2fce908277168097a160a8f15a6952cristy#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__MINGW32__) 693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RGB 0 703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RLE8 1 713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_BITFIELDS 3 723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MaxIcons 1024 743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Typedef declarations. 773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 783ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _IconEntry 793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width, 823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height, 833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colors, 843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reserved; 853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short int 873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy planes, 883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bits_per_pixel; 893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size, 923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset; 933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} IconEntry; 943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 953ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _IconFile 963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy short 983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reserved, 993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy resource_type, 1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IconEntry 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy directory[MaxIcons]; 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} IconFile; 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _IconInfo 1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 108bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy file_size, 1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ba_offset, 1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset_bits, 1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size; 1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 114bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width, 1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height; 1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy planes, 1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bits_per_pixel; 1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression, 1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_size, 1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_pixels, 1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_pixels, 1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors, 1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_mask, 1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_mask, 1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_mask, 1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_mask, 1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colors_important; 1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 134bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace; 1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} IconInfo; 1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Forward declaractions. 1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy WriteICONImage(const ImageInfo *,Image *); 1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d I C O N I m a g e % 1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadICONImage() reads a Microsoft icon image file and returns it. It 1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% allocates the memory necessary for the new Image structure and returns a 1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pointer to the new image. 1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadICONImage method is: 1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadICONImage(const ImageInfo *image_info, 1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadICONImage(const ImageInfo *image_info, 1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ExceptionInfo *exception) 1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IconFile 1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file; 1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IconInfo 1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info; 1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 183bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register IndexPacket 1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *indexes; 1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 192bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register PixelPacket 1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ssize_t 2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count, 2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset; 2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 206bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit, 208eaedf06777741da32408da72c1e512975c600c48cristy byte, 2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bytes_per_line, 210eaedf06777741da32408da72c1e512975c600c48cristy one, 2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scanline_pad; 2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",image_info->filename); 2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=AcquireImage(image_info); 2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.reserved=(short) ReadBlobLSBShort(image); 2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.resource_type=(short) ReadBlobLSBShort(image); 2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.count=(short) ReadBlobLSBShort(image); 2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((icon_file.reserved != 0) || 2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((icon_file.resource_type != 1) && (icon_file.resource_type != 2)) || 2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (icon_file.count > MaxIcons)) 2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < icon_file.count; i++) 2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].width=(unsigned char) ReadBlobByte(image); 2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].height=(unsigned char) ReadBlobByte(image); 2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].colors=(unsigned char) ReadBlobByte(image); 2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].reserved=(unsigned char) ReadBlobByte(image); 2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].planes=(unsigned short) ReadBlobLSBShort(image); 2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].bits_per_pixel=(unsigned short) 2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ReadBlobLSBShort(image); 2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].size=ReadBlobLSBLong(image); 2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].offset=ReadBlobLSBLong(image); 2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 247eaedf06777741da32408da72c1e512975c600c48cristy one=1; 2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < icon_file.count; i++) 2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify Icon identifier. 2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset=(ssize_t) SeekBlob(image,(MagickOffsetType) 2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[i].offset,SEEK_SET); 2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (offset < 0) 2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.size=ReadBlobLSBLong(image); 2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.width=(unsigned char) ReadBlobLSBLong(image); 2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.height=(unsigned char) ReadBlobLSBLong(image)/2; 2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((icon_file.directory[i].width == 0) && 2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (icon_file.directory[i].height == 0)) 2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *icon_image; 2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *read_info; 2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *png; 2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Icon image encoded as a compressed PNG image. 2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=icon_file.directory[i].size; 2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png=(unsigned char *) AcquireQuantumMemory(length+12,sizeof(*png)); 2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png == (unsigned char *) NULL) 2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(png,"\211PNG\r\n\032\n\000\000\000\015",12); 283c8817fecd6db32f06bf98be1f7a2ab8f3ae72a3dcristy count=ReadBlob(image,length-12,png+12); 284c8817fecd6db32f06bf98be1f7a2ab8f3ae72a3dcristy if (count != (ssize_t) (length-12)) 2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png=(unsigned char *) RelinquishMagickMemory(png); 2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError, 2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "InsufficientImageDataInFile"); 2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_info=CloneImageInfo(image_info); 2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(read_info->magick,"PNG",MaxTextExtent); 2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_image=BlobToImage(read_info,png,length+12,exception); 2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_info=DestroyImageInfo(read_info); 2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png=(unsigned char *) RelinquishMagickMemory(png); 2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_image == (Image *) NULL) 2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy DestroyBlob(icon_image); 3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_image->blob=ReferenceBlob(image->blob); 3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ReplaceImageInList(&image,icon_image); 3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.planes=ReadBlobLSBShort(image); 3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel=ReadBlobLSBShort(image); 3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_info.bits_per_pixel > 32) 3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.compression=ReadBlobLSBLong(image); 3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.image_size=ReadBlobLSBLong(image); 3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.x_pixels=ReadBlobLSBLong(image); 3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.y_pixels=ReadBlobLSBLong(image); 3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.number_colors=ReadBlobLSBLong(image); 3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.colors_important=ReadBlobLSBLong(image); 3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickTrue; 317bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->columns=(size_t) icon_file.directory[i].width; 318bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((ssize_t) image->columns > icon_info.width) 319bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->columns=(size_t) icon_info.width; 320bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->rows=(size_t) icon_file.directory[i].height; 321bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((ssize_t) image->rows > icon_info.height) 322bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->rows=(size_t) icon_info.height; 323c8817fecd6db32f06bf98be1f7a2ab8f3ae72a3dcristy image->depth=icon_info.bits_per_pixel; 3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 327e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene = %.20g",(double) i); 3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 329e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " size = %.20g",(double) icon_info.size); 3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 331e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " width = %.20g",(double) icon_file.directory[i].width); 3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 333e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " height = %.20g",(double) icon_file.directory[i].height); 3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 335e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " colors = %.20g",(double ) icon_info.number_colors); 3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 337e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " planes = %.20g",(double) icon_info.planes); 3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 339e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " bpp = %.20g",(double) icon_info.bits_per_pixel); 3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((icon_info.number_colors != 0) || (icon_info.bits_per_pixel <= 16)) 3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=PseudoClass; 3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=icon_info.number_colors; 3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colors == 0) 346eaedf06777741da32408da72c1e512975c600c48cristy image->colors=one << icon_info.bits_per_pixel; 3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 350bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *icon_colormap; 3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 356bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 3570b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy number_colors, 3580b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy one; 3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read Icon raster colormap. 3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3630b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy one=1; 3640b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy number_colors=one << icon_info.bits_per_pixel; 3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (AcquireImageColormap(image,number_colors) == MagickFalse) 3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_colormap=(unsigned char *) AcquireQuantumMemory((size_t) 3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors,4UL*sizeof(*icon_colormap)); 3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_colormap == (unsigned char *) NULL) 3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,(size_t) (4*image->colors),icon_colormap); 3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (count != (ssize_t) (4*image->colors)) 3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError, 3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "InsufficientImageDataInFile"); 3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=icon_colormap; 376bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=(Quantum) ScaleCharToQuantum(*p++); 3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=(Quantum) ScaleCharToQuantum(*p++); 3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=(Quantum) ScaleCharToQuantum(*p++); 3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_colormap=(unsigned char *) RelinquishMagickMemory(icon_colormap); 3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert Icon raster image to pixel packets. 3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->ping != MagickFalse) && 3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->number_scenes != 0)) 3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->scene >= (image_info->scene+image_info->number_scenes-1)) 3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bytes_per_line=(((image->columns*icon_info.bits_per_pixel)+31) & 3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ~31) >> 3; 3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scanline_pad=((((image->columns*icon_info.bits_per_pixel)+31) & ~31)- 3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->columns*icon_info.bits_per_pixel)) >> 3; 3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (icon_info.bits_per_pixel) 3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 1: 3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert bitmap scanline. 4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 403bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=(ssize_t) image->rows-1; y >= 0; y--) 4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes=GetAuthenticIndexQueue(image); 409bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) (image->columns-7); x+=8) 4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 411bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (bit=0; bit < 8; bit++) 4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes[x+bit]=(IndexPacket) 4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((byte & (0x80 >> bit)) != 0 ? 0x01 : 0x00); 4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 8) != 0) 4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 418bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (bit=0; bit < (image->columns % 8); bit++) 4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes[x+bit]=(IndexPacket) 4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((byte & (0x80 >> bit)) != 0 ? 0x01 : 0x00); 4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 423bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) scanline_pad; x++) 4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobByte(image); 4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,image->rows-y-1, 4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows); 4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 4: 4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read 4-bit Icon scanline. 4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 442bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=(ssize_t) image->rows-1; y >= 0; y--) 4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes=GetAuthenticIndexQueue(image); 448bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < ((ssize_t) image->columns-1); x+=2) 4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 450bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes[x]=(IndexPacket) ((byte >> 4) & 0xf); 4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes[x+1]=(IndexPacket) ((byte) & 0xf); 4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 2) != 0) 4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 456bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes[x]=(IndexPacket) ((byte >> 4) & 0xf); 4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 459bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) scanline_pad; x++) 4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobByte(image); 4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,image->rows-y-1, 4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows); 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoColor scanline. 4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 478bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=(ssize_t) image->rows-1; y >= 0; y--) 4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes=GetAuthenticIndexQueue(image); 484bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 486bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes[x]=(IndexPacket) byte; 4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 489bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) scanline_pad; x++) 4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobByte(image); 4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,image->rows-y-1, 4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows); 4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoColor scanline. 5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 508bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=(ssize_t) image->rows-1; y >= 0; y--) 5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes=GetAuthenticIndexQueue(image); 514bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 516bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 517bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte|=(size_t) (ReadBlobByte(image) << 8); 5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes[x]=(IndexPacket) byte; 5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 520bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) scanline_pad; x++) 5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobByte(image); 5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,image->rows-y-1, 5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows); 5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 24: 5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert DirectColor scanline. 5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 540bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=(ssize_t) image->rows-1; y >= 0; y--) 5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 545bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->blue=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); 5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->green=ScaleCharToQuantum((unsigned char) 5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ReadBlobByte(image)); 5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->red=ScaleCharToQuantum((unsigned char) ReadBlobByte(image)); 5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_info.bits_per_pixel == 32) 5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(Quantum) (QuantumRange-ScaleCharToQuantum( 5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (unsigned char) ReadBlobByte(image))); 5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_info.bits_per_pixel == 24) 557bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) scanline_pad; x++) 5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobByte(image); 5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,image->rows-y-1, 5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows); 5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5745dd718802969a0ef5386a9f68ddaee5469fd9e87cristy if (image_info->ping == MagickFalse) 5755dd718802969a0ef5386a9f68ddaee5469fd9e87cristy (void) SyncImage(image); 5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_info.bits_per_pixel != 32) 5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read the ICON alpha mask. 5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=DirectClass; 582bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=(ssize_t) image->rows-1; y >= 0; y--) 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 587bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < ((ssize_t) image->columns-7); x+=8) 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 589bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (bit=0; bit < 8; bit++) 5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q[x+bit].opacity=(Quantum) (((byte & (0x80 >> bit)) != 0) ? 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy TransparentOpacity : OpaqueOpacity); 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 8) != 0) 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 596bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte=(size_t) ReadBlobByte(image); 5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (bit=0; bit < (image->columns % 8); bit++) 5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q[x+bit].opacity=(Quantum) (((byte & (0x80 >> bit)) != 0) ? 5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy TransparentOpacity : OpaqueOpacity); 6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6010e8200f78c4cb859725d32da48fcaf6f41f6ca02cristy if ((image->columns % 32) != 0) 602bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) ((32-(image->columns % 32))/8); x++) 6030e8200f78c4cb859725d32da48fcaf6f41f6ca02cristy (void) ReadBlobByte(image); 6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (EOFBlob(image) != MagickFalse) 6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowFileException(exception,CorruptImageError, 6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "UnexpectedEndOfFile",image->filename); 6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Proceed to next image. 6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0) 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->scene >= (image_info->scene+image_info->number_scenes-1)) 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 621bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (i < (ssize_t) (icon_file.count-1)) 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetBlobSize(image)); 6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e g i s t e r I C O N I m a g e % 6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% RegisterICONImage() adds attributes for the Icon image format to 6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the list of supported formats. The attributes include the image format 6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% tag, a method to read and/or write the format, whether the format 6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% supports the saving of more than one frame to the same file or blob, 6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% whether the format supports native in-memory I/O, and a brief 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% description of the format. 6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the RegisterICONImage method is: 6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 663bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t RegisterICONImage(void) 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 666bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterICONImage(void) 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("CUR"); 6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadICONImage; 6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteICONImage; 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->seekable_stream=MagickTrue; 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("Microsoft icon"); 6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("CUR"); 6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("ICO"); 6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadICONImage; 6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteICONImage; 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickTrue; 6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->seekable_stream=MagickTrue; 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("Microsoft icon"); 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("ICON"); 6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("ICON"); 6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadICONImage; 6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteICONImage; 6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->seekable_stream=MagickTrue; 6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("Microsoft icon"); 6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("ICON"); 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% U n r e g i s t e r I C O N I m a g e % 7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterICONImage() removes format registrations made by the 7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ICON module from the list of supported formats. 7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the UnregisterICONImage method is: 7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterICONImage(void) 7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterICONImage(void) 7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("CUR"); 7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("ICO"); 7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("ICON"); 7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e I C O N I m a g e % 7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteICONImage() writes an image in Microsoft Windows bitmap encoded 7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image format, version 3 for Windows or (if the image has a matte channel) 7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% version 4. 7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteICONImage method is: 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType WriteICONImage(const ImageInfo *image_info, 7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *image) 7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteICONImage(const ImageInfo *image_info, 7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image *image) 7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IconFile 7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file; 7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IconInfo 7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info; 7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next; 7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 763bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset, 7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const IndexPacket 7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *indexes; 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 779bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit, 7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte, 7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 791bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bytes_per_line, 7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scanline_pad; 7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open output image file. 7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"%s",image->filename); 8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); 8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=image; 8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns > 256L) || (image->rows > 256L)) 8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); 8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene++; 8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=SyncNextImageInList(next); 8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse)); 8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Dump out a ICON header template to be properly initialized later. 8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,0); 8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,1); 8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,(unsigned char) scene); 8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(&icon_file,0,sizeof(icon_file)); 8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(&icon_info,0,sizeof(icon_info)); 8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=image; 8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].width); 8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].height); 8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].colors); 8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].reserved); 8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,icon_file.directory[scene].planes); 8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,icon_file.directory[scene].bits_per_pixel); 8330b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy (void) WriteBlobLSBLong(image,(unsigned int) 8340b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_file.directory[scene].size); 8350b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy (void) WriteBlobLSBLong(image,(unsigned int) 8360b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_file.directory[scene].offset); 8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene++; 8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=SyncNextImageInList(next); 8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse)); 8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=image; 8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next->columns == 256) && (next->rows == 256)) 8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *write_image; 8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *write_info; 8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *png; 8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Icon image encoded as a compressed PNG image. 8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_image=CloneImage(next,0,0,MagickTrue,&image->exception); 8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_image == (Image *) NULL) 8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=CloneImageInfo(image_info); 8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(write_info->filename,"PNG:",MaxTextExtent); 8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png=(unsigned char *) ImageToBlob(write_info,write_image,&length, 8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_image=DestroyImage(write_image); 8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=DestroyImageInfo(write_info); 8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png == (unsigned char *) NULL) 8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].width=0; 8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].height=0; 8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].colors=0; 8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].reserved=0; 8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].planes=1; 8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].bits_per_pixel=32; 878bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_file.directory[scene].size=(size_t) length; 879bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_file.directory[scene].offset=(size_t) TellBlob(image); 8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) length,png); 8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png=(unsigned char *) RelinquishMagickMemory(png); 8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize ICON raster file header. 8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->colorspace != RGBColorspace) 8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) TransformImageColorspace(next,RGBColorspace); 8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.file_size=14+12+28; 8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.offset_bits=icon_info.file_size; 8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.compression=BI_RGB; 8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next->storage_class != DirectClass) && (next->colors > 256)) 8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageStorageClass(next,DirectClass); 8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->storage_class == DirectClass) 8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Full color ICON raster. 8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.number_colors=0; 9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel=32; 902bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.compression=(size_t) BI_RGB; 9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90635ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 90735ef824baa82511126ff0072ae30eee0da9c05a3cristy one; 90835ef824baa82511126ff0072ae30eee0da9c05a3cristy 9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Colormapped ICON raster. 9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel=8; 9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->colors <= 256) 9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel=8; 9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->colors <= 16) 9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel=4; 9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->colors <= 2) 9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel=1; 91935ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 92035ef824baa82511126ff0072ae30eee0da9c05a3cristy icon_info.number_colors=one << icon_info.bits_per_pixel; 9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_info.number_colors < next->colors) 9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageStorageClass(next,DirectClass); 9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.number_colors=0; 9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel=(unsigned short) 24; 926bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.compression=(size_t) BI_RGB; 9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9300b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy size_t 9310b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy one; 9320b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy 9330b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy one=1; 9340b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_info.file_size+=3*(one << icon_info.bits_per_pixel); 9350b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_info.offset_bits+=3*(one << icon_info.bits_per_pixel); 9360b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_info.file_size+=(one << icon_info.bits_per_pixel); 9370b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_info.offset_bits+=(one << icon_info.bits_per_pixel); 9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bytes_per_line=(((next->columns*icon_info.bits_per_pixel)+31) & 9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ~31) >> 3; 9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.ba_offset=0; 943bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.width=(ssize_t) next->columns; 944bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.height=(ssize_t) next->rows; 9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.planes=1; 9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.image_size=bytes_per_line*next->rows; 9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.size=40; 9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.size+=(4*icon_info.number_colors); 9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.size+=icon_info.image_size; 9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.size+=(((icon_info.width+31) & ~31) >> 3)*icon_info.height; 9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.file_size+=icon_info.image_size; 9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.x_pixels=0; 9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.y_pixels=0; 9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (next->units) 9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case UndefinedResolution: 9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case PixelsPerInchResolution: 9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 959bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.x_pixels=(size_t) (100.0*next->x_resolution/2.54); 960bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.y_pixels=(size_t) (100.0*next->y_resolution/2.54); 9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case PixelsPerCentimeterResolution: 9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 965bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.x_pixels=(size_t) (100.0*next->x_resolution); 966bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_info.y_pixels=(size_t) (100.0*next->y_resolution); 9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.colors_important=icon_info.number_colors; 9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert MIFF to ICON raster pixels. 9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) AcquireQuantumMemory((size_t) 9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.image_size,sizeof(*pixels)); 9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (pixels == (unsigned char *) NULL) 9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(pixels,0,(size_t) icon_info.image_size); 9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (icon_info.bits_per_pixel) 9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 1: 9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 983bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit, 9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte; 9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoClass image to a ICON monochrome image. 9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 990bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) next->rows; y++) 9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); 9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes=GetVirtualIndexQueue(next); 9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=pixels+(next->rows-y-1)*bytes_per_line; 9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit=0; 9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte=0; 999bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) next->columns; x++) 10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte<<=1; 10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte|=indexes[x] != 0 ? 0x01 : 0x00; 10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit++; 10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (bit == 8) 10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) byte; 10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit=0; 10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte=0; 10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (bit != 0) 10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) (byte << (8-bit)); 10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->previous == (Image *) NULL) 10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(next,SaveImageTag,y,next->rows); 10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 4: 10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1024bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibble, 10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte; 10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoClass image to a ICON monochrome image. 10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1031bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) next->rows; y++) 10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); 10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes=GetVirtualIndexQueue(next); 10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=pixels+(next->rows-y-1)*bytes_per_line; 10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibble=0; 10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte=0; 1040bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) next->columns; x++) 10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte<<=4; 1043bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy byte|=((size_t) indexes[x] & 0x0f); 10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibble++; 10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (nibble == 2) 10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) byte; 10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibble=0; 10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte=0; 10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (nibble != 0) 10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) (byte << 4); 10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->previous == (Image *) NULL) 10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(next,SaveImageTag,y,next->rows); 10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoClass packet to ICON pixel. 10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1068bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) next->rows; y++) 10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); 10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexes=GetVirtualIndexQueue(next); 10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=pixels+(next->rows-y-1)*bytes_per_line; 1075bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) next->columns; x++) 10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) indexes[x]; 10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->previous == (Image *) NULL) 10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(next,SaveImageTag,y,next->rows); 10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 24: 10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert DirectClass packet to ICON BGR888 or BGRA8888 pixel. 10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1092bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) next->rows; y++) 10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); 10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=pixels+(next->rows-y-1)*bytes_per_line; 1098bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) next->columns; x++) 10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1100ce70c17bb6433add2eb069515a4f3105989e0662cristy *q++=ScaleQuantumToChar(GetBluePixelComponent(p)); 1101ce70c17bb6433add2eb069515a4f3105989e0662cristy *q++=ScaleQuantumToChar(GetGreenPixelComponent(p)); 1102ce70c17bb6433add2eb069515a4f3105989e0662cristy *q++=ScaleQuantumToChar(GetRedPixelComponent(p)); 11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->matte == MagickFalse) 11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=ScaleQuantumToChar(QuantumRange); 11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 110646f08209f719f4adeea742c45873c2714e80cdb9cristy *q++=ScaleQuantumToChar(GetAlphaPixelComponent(p)); 11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_info.bits_per_pixel == 24) 1110bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=3L*(ssize_t) next->columns; x < (ssize_t) bytes_per_line; x++) 11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=0x00; 11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->previous == (Image *) NULL) 11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(next,SaveImageTag,y,next->rows); 11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write 40-byte version 3+ bitmap header. 11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].width=(unsigned char) icon_info.width; 11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].height=(unsigned char) icon_info.height; 11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].colors=(unsigned char) 11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.number_colors; 11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].reserved=0; 11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].planes=icon_info.planes; 11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].bits_per_pixel=icon_info.bits_per_pixel; 11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_file.directory[scene].size=icon_info.size; 1133bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy icon_file.directory[scene].offset=(size_t) TellBlob(image); 113435ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) 40); 113535ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.width); 113635ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.height*2); 11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,icon_info.planes); 11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,icon_info.bits_per_pixel); 113935ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.compression); 114035ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.image_size); 114135ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.x_pixels); 114235ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.y_pixels); 114335ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.number_colors); 114435ef824baa82511126ff0072ae30eee0da9c05a3cristy (void) WriteBlobLSBLong(image,(unsigned int) icon_info.colors_important); 11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->storage_class == PseudoClass) 11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *icon_colormap; 11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Dump colormap to file. 11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_colormap=(unsigned char *) AcquireQuantumMemory((size_t) 11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (1UL << icon_info.bits_per_pixel),4UL*sizeof(*icon_colormap)); 11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (icon_colormap == (unsigned char *) NULL) 11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=icon_colormap; 1158bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) next->colors; i++) 11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=ScaleQuantumToChar(next->colormap[i].blue); 11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=ScaleQuantumToChar(next->colormap[i].green); 11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=ScaleQuantumToChar(next->colormap[i].red); 11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) 0x0; 11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1165bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for ( ; i < (ssize_t) (1UL << icon_info.bits_per_pixel); i++) 11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) 0x00; 11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) 0x00; 11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) 0x00; 11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q++=(unsigned char) 0x00; 11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) (4UL*(1UL << 11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_info.bits_per_pixel)),icon_colormap); 11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_colormap=(unsigned char *) RelinquishMagickMemory( 11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy icon_colormap); 11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) icon_info.image_size,pixels); 11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) RelinquishMagickMemory(pixels); 11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write matte mask. 11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scanline_pad=(((next->columns+31) & ~31)-next->columns) >> 3; 1183bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=((ssize_t) next->rows - 1); y >= 0; y--) 11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(next,0,y,next->columns,1,&next->exception); 11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit=0; 11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte=0; 1190bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) next->columns; x++) 11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte<<=1; 11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next->matte == MagickTrue) && 11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p->opacity == (Quantum) TransparentOpacity)) 11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte|=0x01; 11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit++; 11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (bit == 8) 11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,(unsigned char) byte); 12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit=0; 12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy byte=0; 12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (bit != 0) 12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,(unsigned char) (byte << (8-bit))); 1207bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) scanline_pad; i++) 12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,(unsigned char) 0); 12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(next) == (Image *) NULL) 12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=SyncNextImageInList(next); 12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(next,SaveImagesTag,scene++, 12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageListLength(next)); 12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse)); 12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset=SeekBlob(image,0,SEEK_SET); 12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,0); 12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,1); 12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,(unsigned short) (scene+1)); 12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=image; 12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].width); 12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].height); 12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].colors); 12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,icon_file.directory[scene].reserved); 12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,icon_file.directory[scene].planes); 12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobLSBShort(image,icon_file.directory[scene].bits_per_pixel); 12330b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy (void) WriteBlobLSBLong(image,(unsigned int) 12340b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_file.directory[scene].size); 12350b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy (void) WriteBlobLSBLong(image,(unsigned int) 12360b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy icon_file.directory[scene].offset); 12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene++; 12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=SyncNextImageInList(next); 12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while ((next != (Image *) NULL) && (image_info->adjoin != MagickFalse)); 12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1243