13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M IIIII FFFFF FFFFF % 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MM MM I F F % 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M M I FFF FFF % 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M I F F % 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% M M IIIII F F % 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Read/Write MIFF Image Format % 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Software Design % 16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy% Cristy % 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% July 1992 % 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy% Copyright 1999-2016 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*/ 424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h" 434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/attribute.h" 444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h" 454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h" 464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h" 474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h" 484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h" 494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap.h" 504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap-private.h" 514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h" 52325cfdc2db361433ba7583e9479cb5bc40167cf5cristy#include "MagickCore/colorspace-private.h" 534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/constitute.h" 544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h" 554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h" 564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/geometry.h" 574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h" 584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h" 59abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/linked-list.h" 604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h" 614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h" 624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h" 634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h" 644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h" 654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h" 664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h" 674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel.h" 684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h" 694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/profile.h" 704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h" 714c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h" 724c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h" 734c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/statistic.h" 744c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h" 754c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string-private.h" 763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "bzlib.h" 783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 79263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_LZMA_DELEGATE) 80263771792ed48bef0e1293323aa32c66d0e3617dcristy#include "lzma.h" 81263771792ed48bef0e1293323aa32c66d0e3617dcristy#endif 82263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 83263771792ed48bef0e1293323aa32c66d0e3617dcristy#include "zlib.h" 84263771792ed48bef0e1293323aa32c66d0e3617dcristy#endif 853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 87a7a341e9f3ddd1041f5f01ebea9b00f1a3c58632cristy Define declarations. 88a7a341e9f3ddd1041f5f01ebea9b00f1a3c58632cristy*/ 89a7a341e9f3ddd1041f5f01ebea9b00f1a3c58632cristy#if !defined(LZMA_OK) 90a7a341e9f3ddd1041f5f01ebea9b00f1a3c58632cristy#define LZMA_OK 0 91a7a341e9f3ddd1041f5f01ebea9b00f1a3c58632cristy#endif 92a7a341e9f3ddd1041f5f01ebea9b00f1a3c58632cristy 93a7a341e9f3ddd1041f5f01ebea9b00f1a3c58632cristy/* 943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Forward declarations. 953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 963ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 971e178e70fb3c956f9fc1e30c3ba863e882666465cristy WriteMIFFImage(const ImageInfo *,Image *,ExceptionInfo *); 983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s M I F F % 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsMIFF() returns MagickTrue if the image format type, identified by the 1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is MIFF. 1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsMIFF method is: 1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsMIFF(const unsigned char *magick,const size_t length) 1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsMIFF(const unsigned char *magick,const size_t length) 1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 14) 1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare((const char *) magick,"id=ImageMagick",14) == 0) 1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d M I F F I m a g e % 1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadMIFFImage() reads a MIFF image file and returns it. It allocates the 1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% memory necessary for the new Image structure and returns a pointer to the 1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% new image. 1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadMIFFImage method is: 1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadMIFFImage(const ImageInfo *image_info, 1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Decompression code contributed by Kyle Shorter. 1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void *AcquireBZIPMemory(void *context,int items,int size) 1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) context; 1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((void *) AcquireQuantumMemory((size_t) items,(size_t) size)); 1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1714b46dbab6cc03f190444a3159ac3784c597a5357cristy#if defined(MAGICKCORE_LZMA_DELEGATE) 1724b46dbab6cc03f190444a3159ac3784c597a5357cristystatic void *AcquireLZMAMemory(void *context,size_t items,size_t size) 1734b46dbab6cc03f190444a3159ac3784c597a5357cristy{ 1744b46dbab6cc03f190444a3159ac3784c597a5357cristy (void) context; 1754b46dbab6cc03f190444a3159ac3784c597a5357cristy return((void *) AcquireQuantumMemory((size_t) items,(size_t) size)); 1764b46dbab6cc03f190444a3159ac3784c597a5357cristy} 1774b46dbab6cc03f190444a3159ac3784c597a5357cristy#endif 1784b46dbab6cc03f190444a3159ac3784c597a5357cristy 1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic voidpf AcquireZIPMemory(voidpf context,unsigned int items, 1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int size) 1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) context; 1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((voidpf) AcquireQuantumMemory(items,size)); 1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PushRunlengthPacket(Image *image,const unsigned char *pixels, 189c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy size_t *length,PixelInfo *pixel,ExceptionInfo *exception) 1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const unsigned char 1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=pixels; 1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1974c08aed51c5899665ade97263692328eea4af106cristy pixel->index=0; 1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->depth) 1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2025467fcf6dfee9d372efee47bb4eb1fb8f3e118b4cristy pixel->index=ConstrainColormapIndex(image,((size_t) *p << 24) | 2035467fcf6dfee9d372efee47bb4eb1fb8f3e118b4cristy ((size_t) *(p+1) << 16) | ((size_t) *(p+2) << 8) | (size_t) *(p+3), 2045467fcf6dfee9d372efee47bb4eb1fb8f3e118b4cristy exception); 2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 210c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy pixel->index=ConstrainColormapIndex(image,(*p << 8) | *(p+1), 211c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy exception); 2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=2; 2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 217c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy pixel->index=ConstrainColormapIndex(image,*p,exception); 2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 222c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy (void) ThrowMagickException(exception,GetMagickModule(), 2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CorruptImageError,"ImageDepthNotSupported","`%s'",image->filename); 2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->depth) 2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2329f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushCharPixel(p,&quantum); 2354c08aed51c5899665ade97263692328eea4af106cristy pixel->alpha=ScaleCharToQuantum(quantum); 2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2449f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushShortPixel(MSBEndian,p,&quantum); 2474c08aed51c5899665ade97263692328eea4af106cristy pixel->alpha=(Quantum) (quantum >> (image->depth- 2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MAGICKCORE_QUANTUM_DEPTH)); 2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2544cb162a81b4dfaf673e94c9dea88ad0a92f0a3d7cristy unsigned int 2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2579f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushLongPixel(MSBEndian,p,&quantum); 2604c08aed51c5899665ade97263692328eea4af106cristy pixel->alpha=(Quantum) (quantum >> (image->depth- 2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MAGICKCORE_QUANTUM_DEPTH)); 2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 266c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy (void) ThrowMagickException(exception,GetMagickModule(), 2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CorruptImageError,"ImageDepthNotSupported","`%s'",image->filename); 2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *length=(size_t) (*p++)+1; 2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return; 2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->depth) 2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushCharPixel(p,&quantum); 2804c08aed51c5899665ade97263692328eea4af106cristy pixel->red=ScaleCharToQuantum(quantum); 281325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->green=pixel->red; 282325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->blue=pixel->red; 283325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) == MagickFalse) 284325cfdc2db361433ba7583e9479cb5bc40167cf5cristy { 285325cfdc2db361433ba7583e9479cb5bc40167cf5cristy p=PushCharPixel(p,&quantum); 286325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->green=ScaleCharToQuantum(quantum); 287325cfdc2db361433ba7583e9479cb5bc40167cf5cristy p=PushCharPixel(p,&quantum); 288325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->blue=ScaleCharToQuantum(quantum); 289325cfdc2db361433ba7583e9479cb5bc40167cf5cristy } 2904c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushCharPixel(p,&quantum); 2934c08aed51c5899665ade97263692328eea4af106cristy pixel->black=ScaleCharToQuantum(quantum); 2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2959f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushCharPixel(p,&quantum); 2984c08aed51c5899665ade97263692328eea4af106cristy pixel->alpha=ScaleCharToQuantum(quantum); 2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushShortPixel(MSBEndian,p,&quantum); 3084c08aed51c5899665ade97263692328eea4af106cristy pixel->red=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 309325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->green=pixel->red; 310325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->blue=pixel->red; 311325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) == MagickFalse) 312325cfdc2db361433ba7583e9479cb5bc40167cf5cristy { 313325cfdc2db361433ba7583e9479cb5bc40167cf5cristy p=PushShortPixel(MSBEndian,p,&quantum); 314325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->green=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 315325cfdc2db361433ba7583e9479cb5bc40167cf5cristy p=PushShortPixel(MSBEndian,p,&quantum); 316325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->blue=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 317325cfdc2db361433ba7583e9479cb5bc40167cf5cristy } 3184c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushShortPixel(MSBEndian,p,&quantum); 3214c08aed51c5899665ade97263692328eea4af106cristy pixel->black=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3239f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushShortPixel(MSBEndian,p,&quantum); 3264c08aed51c5899665ade97263692328eea4af106cristy pixel->alpha=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3324cb162a81b4dfaf673e94c9dea88ad0a92f0a3d7cristy unsigned int 3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushLongPixel(MSBEndian,p,&quantum); 3364c08aed51c5899665ade97263692328eea4af106cristy pixel->red=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 337325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->green=pixel->red; 338325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->blue=pixel->red; 339325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) == MagickFalse) 340325cfdc2db361433ba7583e9479cb5bc40167cf5cristy { 341325cfdc2db361433ba7583e9479cb5bc40167cf5cristy p=PushLongPixel(MSBEndian,p,&quantum); 342325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->green=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 343325cfdc2db361433ba7583e9479cb5bc40167cf5cristy p=PushLongPixel(MSBEndian,p,&quantum); 344325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->blue=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 345325cfdc2db361433ba7583e9479cb5bc40167cf5cristy } 3464c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushLongPixel(MSBEndian,p,&quantum); 3494c08aed51c5899665ade97263692328eea4af106cristy pixel->black=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3519f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushLongPixel(MSBEndian,p,&quantum); 3544c08aed51c5899665ade97263692328eea4af106cristy pixel->alpha=quantum >> (image->depth-MAGICKCORE_QUANTUM_DEPTH); 3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 359c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageError, 360c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy "ImageDepthNotSupported","`%s'",image->filename); 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *length=(size_t) (*p++)+1; 3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3654b46dbab6cc03f190444a3159ac3784c597a5357cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 3664b46dbab6cc03f190444a3159ac3784c597a5357cristystatic void RelinquishBZIPMemory(void *context,void *memory) 3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) context; 3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memory=RelinquishMagickMemory(memory); 3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3734b46dbab6cc03f190444a3159ac3784c597a5357cristy#if defined(MAGICKCORE_LZMA_DELEGATE) 3744b46dbab6cc03f190444a3159ac3784c597a5357cristystatic void RelinquishLZMAMemory(void *context,void *memory) 3754b46dbab6cc03f190444a3159ac3784c597a5357cristy{ 3764b46dbab6cc03f190444a3159ac3784c597a5357cristy (void) context; 3774b46dbab6cc03f190444a3159ac3784c597a5357cristy memory=RelinquishMagickMemory(memory); 3784b46dbab6cc03f190444a3159ac3784c597a5357cristy} 3794b46dbab6cc03f190444a3159ac3784c597a5357cristy#endif 3804b46dbab6cc03f190444a3159ac3784c597a5357cristy 3814b46dbab6cc03f190444a3159ac3784c597a5357cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 3824b46dbab6cc03f190444a3159ac3784c597a5357cristystatic void RelinquishZIPMemory(voidpf context,voidpf memory) 3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) context; 3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memory=RelinquishMagickMemory(memory); 3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMIFFImage(const ImageInfo *image_info, 3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ExceptionInfo *exception) 3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BZipMaxExtent(x) ((x)+((x)/100)+600) 393263771792ed48bef0e1293323aa32c66d0e3617dcristy#define LZMAMaxExtent(x) ((x)+((x)/3)+128) 3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ZipMaxExtent(x) ((x)+(((x)+7) >> 3)+(((x)+63) >> 6)+11) 3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bz_stream 3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bzip_info; 3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 402151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy id[MagickPathExtent], 403151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy keyword[MagickPathExtent], 4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *options; 4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const unsigned char 4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy double 4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy version; 4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GeometryInfo 4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy geometry_info; 4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 4193a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy c; 4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 421de626a2fb5f58f0f3d9676a3655c12393ed41957cristy LinkedListInfo 422de626a2fb5f58f0f3d9676a3655c12393ed41957cristy *profiles; 423de626a2fb5f58f0f3d9676a3655c12393ed41957cristy 424263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_LZMA_DELEGATE) 425263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_stream 426330af6c00116155c122d0f4d697c176bbcc31768cristy initialize_lzma = LZMA_STREAM_INIT, 427330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info; 4284b46dbab6cc03f190444a3159ac3784c597a5357cristy 4294b46dbab6cc03f190444a3159ac3784c597a5357cristy lzma_allocator 4304b46dbab6cc03f190444a3159ac3784c597a5357cristy allocator; 431263771792ed48bef0e1293323aa32c66d0e3617dcristy#endif 432263771792ed48bef0e1293323aa32c66d0e3617dcristy 4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4364c08aed51c5899665ade97263692328eea4af106cristy PixelInfo 4374c08aed51c5899665ade97263692328eea4af106cristy pixel; 4384c08aed51c5899665ade97263692328eea4af106cristy 4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickStatusType 4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy flags; 4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumFormatType 4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format; 4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumType 4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type; 4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 451bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 4551d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy compress_extent, 4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length, 4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size; 4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ssize_t 4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *compress_pixels, 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 466bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colors; 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 469263771792ed48bef0e1293323aa32c66d0e3617dcristy ssize_t 470263771792ed48bef0e1293323aa32c66d0e3617dcristy y; 471263771792ed48bef0e1293323aa32c66d0e3617dcristy 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy z_stream 4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy zip_info; 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 481e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->debug != MagickFalse) 4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 486e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 4879950d57e1124b73f684fb5946e206994cefda628cristy image=AcquireImage(image_info,exception); 4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Decode image header; header terminates one character beyond a ':'. 4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (c == EOF) 4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *id='\0'; 5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(keyword,0,sizeof(keyword)); 5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy version=0.0; 50351f4b1b9d99133954b89b7c5641aa8bcead324f1cristy (void) version; 5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Decode image header; header terminates one character beyond a ':'. 5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 509151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy length=MagickPathExtent; 5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options=AcquireString((char *) NULL); 5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format=UndefinedQuantumFormat; 5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profiles=(LinkedListInfo *) NULL; 5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colors=0; 5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=8UL; 5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->compression=NoCompression; 5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while ((isgraph(c) != MagickFalse) && (c != (int) ':')) 5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register char 5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (c == (int) '{') 5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *comment; 5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read comment-- any text between { }. 5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 529151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy length=MagickPathExtent; 5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy comment=AcquireString((char *) NULL); 5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=comment; comment != (char *) NULL; p++) 5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 534b880ee80fc15868f8fbd99acfa30a68710615b72cristy if (c == (int) '\\') 535b880ee80fc15868f8fbd99acfa30a68710615b72cristy c=ReadBlobByte(image); 536b880ee80fc15868f8fbd99acfa30a68710615b72cristy else 537b880ee80fc15868f8fbd99acfa30a68710615b72cristy if ((c == EOF) || (c == (int) '}')) 538b880ee80fc15868f8fbd99acfa30a68710615b72cristy break; 5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((size_t) (p-comment+1) >= length) 5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p='\0'; 5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length<<=1; 5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy comment=(char *) ResizeQuantumMemory(comment,length+ 544151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent,sizeof(*comment)); 5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (comment == (char *) NULL) 5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=comment+strlen(comment); 5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p=(char) c; 5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (comment == (char *) NULL) 5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p='\0'; 554d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,"comment",comment,exception); 5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy comment=DestroyString(comment); 5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (isalnum(c) != MagickFalse) 5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Get the keyword. 5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 564151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy length=MagickPathExtent; 5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=keyword; 5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (c == (int) '=') 5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 570151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy if ((size_t) (p-keyword) < (MagickPathExtent-1)) 5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(char) c; 5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (c != EOF); 5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p='\0'; 5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=options; 57693505cf912e53a94018da2ead51883ba070aebd6cristy while ((isspace((int) ((unsigned char) c)) != 0) && (c != EOF)) 5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (c == (int) '=') 5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Get the keyword value. 5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while ((c != (int) '}') && (c != EOF)) 5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((size_t) (p-options+1) >= length) 5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p='\0'; 5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length<<=1; 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options=(char *) ResizeQuantumMemory(options,length+ 591151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent,sizeof(*options)); 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (options == (char *) NULL) 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=options+strlen(options); 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(char) c; 5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 598b880ee80fc15868f8fbd99acfa30a68710615b72cristy if (c == '\\') 599b880ee80fc15868f8fbd99acfa30a68710615b72cristy { 600b880ee80fc15868f8fbd99acfa30a68710615b72cristy c=ReadBlobByte(image); 601b880ee80fc15868f8fbd99acfa30a68710615b72cristy if (c == (int) '}') 602b880ee80fc15868f8fbd99acfa30a68710615b72cristy { 603b880ee80fc15868f8fbd99acfa30a68710615b72cristy *p++=(char) c; 604b880ee80fc15868f8fbd99acfa30a68710615b72cristy c=ReadBlobByte(image); 605b880ee80fc15868f8fbd99acfa30a68710615b72cristy } 606b880ee80fc15868f8fbd99acfa30a68710615b72cristy } 6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*options != '{') 6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (isspace((int) ((unsigned char) c)) != 0) 6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6103788976d96f9ba0baddec070b0268f95ed12590ecristy } 6113788976d96f9ba0baddec070b0268f95ed12590ecristy if (options == (char *) NULL) 6123788976d96f9ba0baddec070b0268f95ed12590ecristy ThrowReaderException(ResourceLimitError, 6133788976d96f9ba0baddec070b0268f95ed12590ecristy "MemoryAllocationFailed"); 6143788976d96f9ba0baddec070b0268f95ed12590ecristy } 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p='\0'; 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*options == '{') 617bfae51d5f746a6757c7b30e14ef9cb7c8649d7a6cristy (void) CopyMagickString(options,options+1,strlen(options)); 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Assign a value to the specified keyword. 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (*keyword) 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6238a46d827a124555f0c48fb2368ec1bba8e079ab6cristy case 'a': 6248a46d827a124555f0c48fb2368ec1bba8e079ab6cristy case 'A': 6258a46d827a124555f0c48fb2368ec1bba8e079ab6cristy { 626b797b2c96f796f4920c9ee807dc5f47e6f160418dirk if (LocaleCompare(keyword,"alpha-color") == 0) 627b797b2c96f796f4920c9ee807dc5f47e6f160418dirk { 628b797b2c96f796f4920c9ee807dc5f47e6f160418dirk (void) QueryColorCompliance(options,AllCompliance, 629b797b2c96f796f4920c9ee807dc5f47e6f160418dirk &image->alpha_color,exception); 630b797b2c96f796f4920c9ee807dc5f47e6f160418dirk break; 631b797b2c96f796f4920c9ee807dc5f47e6f160418dirk } 6328a46d827a124555f0c48fb2368ec1bba8e079ab6cristy if (LocaleCompare(keyword,"alpha-trait") == 0) 6338a46d827a124555f0c48fb2368ec1bba8e079ab6cristy { 6348a46d827a124555f0c48fb2368ec1bba8e079ab6cristy ssize_t 6358a46d827a124555f0c48fb2368ec1bba8e079ab6cristy alpha_trait; 6368a46d827a124555f0c48fb2368ec1bba8e079ab6cristy 6378a46d827a124555f0c48fb2368ec1bba8e079ab6cristy alpha_trait=ParseCommandOption(MagickPixelTraitOptions, 6388a46d827a124555f0c48fb2368ec1bba8e079ab6cristy MagickFalse,options); 6398a46d827a124555f0c48fb2368ec1bba8e079ab6cristy if (alpha_trait < 0) 6408a46d827a124555f0c48fb2368ec1bba8e079ab6cristy break; 6418a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=(PixelTrait) alpha_trait; 6428a46d827a124555f0c48fb2368ec1bba8e079ab6cristy break; 6438a46d827a124555f0c48fb2368ec1bba8e079ab6cristy } 6448a46d827a124555f0c48fb2368ec1bba8e079ab6cristy (void) SetImageProperty(image,keyword,options,exception); 6458a46d827a124555f0c48fb2368ec1bba8e079ab6cristy break; 6468a46d827a124555f0c48fb2368ec1bba8e079ab6cristy } 6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'b': 6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'B': 6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"background-color") == 0) 6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6529950d57e1124b73f684fb5946e206994cefda628cristy (void) QueryColorCompliance(options,AllCompliance, 6539950d57e1124b73f684fb5946e206994cefda628cristy &image->background_color,exception); 6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"blue-primary") == 0) 6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy flags=ParseGeometry(options,&geometry_info); 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.x=geometry_info.rho; 6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.y=geometry_info.sigma; 6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((flags & SigmaValue) == 0) 6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.y= 6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.x; 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"border-color") == 0) 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6689950d57e1124b73f684fb5946e206994cefda628cristy (void) QueryColorCompliance(options,AllCompliance, 6699950d57e1124b73f684fb5946e206994cefda628cristy &image->border_color,exception); 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 672d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'c': 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'C': 6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"class") == 0) 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 680bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class; 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 683042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy storage_class=ParseCommandOption(MagickClassOptions, 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickFalse,options); 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (storage_class < 0) 6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=(ClassType) storage_class; 6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"colors") == 0) 6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 692e27293e706ca05b6b121e9512a83b16f7ad887f2cristy colors=StringToUnsignedLong(options); 6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"colorspace") == 0) 6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 697bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace; 6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 700042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy colorspace=ParseCommandOption(MagickColorspaceOptions, 7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickFalse,options); 7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (colorspace < 0) 7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 70402a27d5c2c9fa8e2c90782107b1e66c05f49f9cccristy image->colorspace=(ColorspaceType) colorspace; 7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"compression") == 0) 7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 709bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression; 7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 712042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy compression=ParseCommandOption(MagickCompressOptions, 7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickFalse,options); 7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (compression < 0) 7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->compression=(CompressionType) compression; 7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"columns") == 0) 7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 721e27293e706ca05b6b121e9512a83b16f7ad887f2cristy image->columns=StringToUnsignedLong(options); 7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 724d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'd': 7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'D': 7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"delay") == 0) 7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 732e27293e706ca05b6b121e9512a83b16f7ad887f2cristy image->delay=StringToUnsignedLong(options); 7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"depth") == 0) 7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 737e27293e706ca05b6b121e9512a83b16f7ad887f2cristy image->depth=StringToUnsignedLong(options); 7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"dispose") == 0) 7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 742bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dispose; 7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 745042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse, 7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options); 7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (dispose < 0) 7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->dispose=(DisposeType) dispose; 7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 752d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'e': 7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'E': 7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"endian") == 0) 7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 760bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy endian; 7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 763042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy endian=ParseCommandOption(MagickEndianOptions,MagickFalse, 7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options); 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (endian < 0) 7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->endian=(EndianType) endian; 7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 770d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'g': 7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'G': 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"gamma") == 0) 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 778dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy image->gamma=StringToDouble(options,(char **) NULL); 7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"gravity") == 0) 7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 783bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy gravity; 7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 786042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy gravity=ParseCommandOption(MagickGravityOptions,MagickFalse, 7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options); 7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (gravity < 0) 7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->gravity=(GravityType) gravity; 7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"green-primary") == 0) 7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy flags=ParseGeometry(options,&geometry_info); 7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.x=geometry_info.rho; 7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.y=geometry_info.sigma; 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((flags & SigmaValue) == 0) 7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.y= 8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.x; 8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 803d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'i': 8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'I': 8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"id") == 0) 8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 811151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(id,options,MagickPathExtent); 8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"iterations") == 0) 8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 816e27293e706ca05b6b121e9512a83b16f7ad887f2cristy image->iterations=StringToUnsignedLong(options); 8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 819d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'm': 8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'M': 8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"matte") == 0) 8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 827bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte; 8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 830042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy matte=ParseCommandOption(MagickBooleanOptions,MagickFalse, 8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options); 8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (matte < 0) 8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8348a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=matte == 0 ? UndefinedPixelTrait : 8358a46d827a124555f0c48fb2368ec1bba8e079ab6cristy BlendPixelTrait; 8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"montage") == 0) 8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloneString(&image->montage,options); 8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 843d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'o': 8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'O': 8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"orientation") == 0) 8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 851bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy orientation; 8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 854042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy orientation=ParseCommandOption(MagickOrientationOptions, 8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickFalse,options); 8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (orientation < 0) 8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->orientation=(OrientationType) orientation; 8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 861d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'p': 8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'P': 8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"page") == 0) 8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *geometry; 8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy geometry=GetPageGeometry(options); 8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ParseAbsoluteGeometry(geometry,&image->page); 8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy geometry=DestroyString(geometry); 8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8773e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy if (LocaleCompare(keyword,"pixel-intensity") == 0) 8783e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy { 8793e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy ssize_t 8803e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy intensity; 8813e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy 8823e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy intensity=ParseCommandOption(MagickPixelIntensityOptions, 8833e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy MagickFalse,options); 8843e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy if (intensity < 0) 8853e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy break; 8863e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy image->intensity=(PixelIntensityMethod) intensity; 8873e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy break; 8883e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy } 8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((LocaleNCompare(keyword,"profile:",8) == 0) || 8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (LocaleNCompare(keyword,"profile-",8) == 0)) 8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profiles == (LinkedListInfo *) NULL) 8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profiles=NewLinkedList(0); 8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AppendValueToLinkedList(profiles, 8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireString(keyword+8)); 89963f9b8efb784ffa10dea0cd6a8cd5cdbe09ce07fcristy profile=BlobToStringInfo((const void *) NULL,(size_t) 90063f9b8efb784ffa10dea0cd6a8cd5cdbe09ce07fcristy StringToLong(options)); 90149f5e9f1c957e4a5ecf64220c2db80f101b572ffcristy if (profile == (StringInfo *) NULL) 90263f9b8efb784ffa10dea0cd6a8cd5cdbe09ce07fcristy ThrowReaderException(ResourceLimitError, 90363f9b8efb784ffa10dea0cd6a8cd5cdbe09ce07fcristy "MemoryAllocationFailed"); 904d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProfile(image,keyword+8,profile,exception); 9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 908d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'q': 9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'Q': 9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"quality") == 0) 9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 916e27293e706ca05b6b121e9512a83b16f7ad887f2cristy image->quality=StringToUnsignedLong(options); 9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((LocaleCompare(keyword,"quantum-format") == 0) || 9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (LocaleCompare(keyword,"quantum:format") == 0)) 9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 922bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy format; 9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 925042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy format=ParseCommandOption(MagickQuantumFormatOptions, 9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickFalse,options); 9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (format < 0) 9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_format=(QuantumFormatType) format; 9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 932d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'r': 9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'R': 9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"red-primary") == 0) 9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy flags=ParseGeometry(options,&geometry_info); 9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.x=geometry_info.rho; 9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.y=geometry_info.sigma; 9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((flags & SigmaValue) == 0) 9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.y= 9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.x; 9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"rendering-intent") == 0) 9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 950bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rendering_intent; 9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 953042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy rendering_intent=ParseCommandOption(MagickIntentOptions, 9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickFalse,options); 9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (rendering_intent < 0) 9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rendering_intent=(RenderingIntent) rendering_intent; 9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"resolution") == 0) 9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy flags=ParseGeometry(options,&geometry_info); 9632a11befa48257796843468409d77bb8cfb129cdccristy image->resolution.x=geometry_info.rho; 9642a11befa48257796843468409d77bb8cfb129cdccristy image->resolution.y=geometry_info.sigma; 9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((flags & SigmaValue) == 0) 9662a11befa48257796843468409d77bb8cfb129cdccristy image->resolution.y=image->resolution.x; 9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"rows") == 0) 9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 971e27293e706ca05b6b121e9512a83b16f7ad887f2cristy image->rows=StringToUnsignedLong(options); 9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 974d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 's': 9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'S': 9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"scene") == 0) 9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 982e27293e706ca05b6b121e9512a83b16f7ad887f2cristy image->scene=StringToUnsignedLong(options); 9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 985d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 't': 9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'T': 9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"ticks-per-second") == 0) 9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99315893a425ef211a38a5b9bc05945a0a43049e7b1cristy image->ticks_per_second=(ssize_t) StringToLong(options); 9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"tile-offset") == 0) 9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *geometry; 10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy geometry=GetPageGeometry(options); 10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ParseAbsoluteGeometry(geometry,&image->tile_offset); 10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy geometry=DestroyString(geometry); 10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"type") == 0) 10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1008bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type; 10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1011042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy type=ParseCommandOption(MagickTypeOptions,MagickFalse, 10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options); 10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (type < 0) 10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->type=(ImageType) type; 10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1018d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'u': 10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'U': 10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"units") == 0) 10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1026bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy units; 10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1029fbbafc9959951fde07b4673d5d7e42b90512bd1bcristy units=ParseCommandOption(MagickResolutionOptions, 1030fbbafc9959951fde07b4673d5d7e42b90512bd1bcristy MagickFalse,options); 10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (units < 0) 10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=(ResolutionType) units; 10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1036d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'v': 10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'V': 10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"version") == 0) 10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1044dbdd0e35efc03c9bccda644f5407db38b7c17eeccristy version=StringToDouble(options,(char **) NULL); 10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1047d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'w': 10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 'W': 10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(keyword,"white-point") == 0) 10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy flags=ParseGeometry(options,&geometry_info); 10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.x=geometry_info.rho; 105737f88d9243795b2af3a44d426c699160758d2a0bcristy image->chromaticity.white_point.y=geometry_info.sigma; 105874ca15014e8d5d35c5d891926c3ea8ce1c0b881dcristy if ((flags & SigmaValue) == 0) 10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.y= 10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.x; 10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1063d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1068d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,keyword,options,exception); 10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (isspace((int) ((unsigned char) c)) != 0) 10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy options=DestroyString(options); 10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobByte(image); 10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify that required image information is defined. 10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((LocaleCompare(id,"ImageMagick") != 0) || 10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->storage_class == UndefinedClass) || 1085cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy (image->compression == UndefinedCompression) || 1086cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy (image->colorspace == UndefinedColorspace) || 10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->columns == 0) || (image->rows == 0)) 1088cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy { 1089cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy if (image->previous == (Image *) NULL) 1090cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 1091cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy (void) ThrowMagickException(exception,GetMagickModule(), 1092cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy CorruptImageError,"ImproperImageHeader","`%s'",image->filename); 1093cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy break; 1094cdc1b38be1e6fd49f50f8fbf52abd14bcf5d3cf1Cristy } 10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->montage != (char *) NULL) 10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register char 10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image directory. 11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1103151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy length=MagickPathExtent; 11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->directory=AcquireString((char *) NULL); 11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=image->directory; 11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p='\0'; 1109151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy if ((strlen(image->directory)+MagickPathExtent) >= length) 11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate more memory for the image directory. 11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length<<=1; 11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->directory=(char *) ResizeQuantumMemory(image->directory, 1116151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy length+MagickPathExtent,sizeof(*image->directory)); 11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->directory == (char *) NULL) 11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"UnableToReadImageData"); 11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=image->directory+strlen(image->directory); 11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(char) c; 11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (c != (int) '\0'); 11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profiles != (LinkedListInfo *) NULL) 11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name; 11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read image profiles. 11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetLinkedListIterator(profiles); 11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=(const char *) GetNextValueInLinkedList(profiles); 11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (name != (const char *) NULL) 11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile != (StringInfo *) NULL) 11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetStringInfoDatum(profile); 11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,GetStringInfoLength(profile),p); 1148da16f16767eb31921af855f17bda465fffc4e000cristy (void) count; 11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=(const char *) GetNextValueInLinkedList(profiles); 11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profiles=DestroyLinkedList(profiles,RelinquishMagickMemory); 11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=GetImageQuantumDepth(image,MagickFalse); 11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Create image colormap. 11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1160018f07f7333b25743d0afff892450cebdb905c1acristy status=AcquireImageColormap(image,colors != 0 ? colors : 256,exception); 11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (colors != 0) 11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size; 11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *colormap; 11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read image colormap from file. 11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size=(size_t) (3UL*image->depth/8UL); 11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap=(unsigned char *) AcquireQuantumMemory(image->colors, 11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size*sizeof(*colormap)); 11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (colormap == (unsigned char *) NULL) 11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,packet_size*image->colors,colormap); 11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=colormap; 11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->depth) 11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError, 11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "ImageDepthNotSupported"); 11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel; 11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1191bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushCharPixel(p,&pixel); 11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=ScaleCharToQuantum(pixel); 11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushCharPixel(p,&pixel); 11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=ScaleCharToQuantum(pixel); 11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushCharPixel(p,&pixel); 11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=ScaleCharToQuantum(pixel); 11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel; 12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1207bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushShortPixel(MSBEndian,p,&pixel); 12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=ScaleShortToQuantum(pixel); 12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushShortPixel(MSBEndian,p,&pixel); 12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=ScaleShortToQuantum(pixel); 12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushShortPixel(MSBEndian,p,&pixel); 12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=ScaleShortToQuantum(pixel); 12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12204cb162a81b4dfaf673e94c9dea88ad0a92f0a3d7cristy unsigned int 12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel; 12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1223bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushLongPixel(MSBEndian,p,&pixel); 12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=ScaleLongToQuantum(pixel); 12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushLongPixel(MSBEndian,p,&pixel); 12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=ScaleLongToQuantum(pixel); 12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=PushLongPixel(MSBEndian,p,&pixel); 12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=ScaleLongToQuantum(pixel); 12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap=(unsigned char *) RelinquishMagickMemory(colormap); 12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0)) 12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->scene >= (image_info->scene+image_info->number_scenes-1)) 12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1241acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy status=SetImageExtent(image,image->columns,image->rows,exception); 1242acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy if (status == MagickFalse) 1243acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy return(DestroyImageList(image)); 12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate image pixels. 12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 12475f766ef8b0cd9906c2c3a56d845828380a251073cristy quantum_info=AcquireQuantumInfo(image_info,image); 12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info == (QuantumInfo *) NULL) 12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_format != UndefinedQuantumFormat) 12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetQuantumFormat(image,quantum_info,quantum_format); 12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size=(size_t) (quantum_info->depth/8); 12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == DirectClass) 12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size=(size_t) (3*quantum_info->depth/8); 1259325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) != MagickFalse) 12600a30e1843b1bd833e6ea8487d2fb176e79c14535cristy packet_size=quantum_info->depth/8; 12619f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size+=quantum_info->depth/8; 12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colorspace == CMYKColorspace) 12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size+=quantum_info->depth/8; 12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->compression == RLECompression) 12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size++; 12671d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy compress_extent=MagickMax(MagickMax(BZipMaxExtent(packet_size* 12681d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy image->columns),LZMAMaxExtent(packet_size*image->columns)), 12691d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy ZipMaxExtent(packet_size*image->columns)); 12701d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy compress_pixels=(unsigned char *) AcquireQuantumMemory(compress_extent, 12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*compress_pixels)); 12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (compress_pixels == (unsigned char *) NULL) 12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read image pixels. 12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=RGBQuantum; 12789f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=RGBAQuantum; 12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colorspace == CMYKColorspace) 12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=CMYKQuantum; 12839f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=CMYKAQuantum; 12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1286325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) != MagickFalse) 12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=GrayQuantum; 12899f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=GrayAlphaQuantum; 12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1292bdbf4b6badc87b831f515e4453ebc8bbff1fcec0cristy if (image->storage_class == PseudoClass) 1293bdbf4b6badc87b831f515e4453ebc8bbff1fcec0cristy { 1294bdbf4b6badc87b831f515e4453ebc8bbff1fcec0cristy quantum_type=IndexQuantum; 12959f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 1296bdbf4b6badc87b831f515e4453ebc8bbff1fcec0cristy quantum_type=IndexAlphaQuantum; 1297bdbf4b6badc87b831f515e4453ebc8bbff1fcec0cristy } 1298330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickTrue; 1299d9a94d37e078d131b10de3778713f9b0fe181c6acristy GetPixelInfo(image,&pixel); 130016abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 130116abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy (void) ResetMagickMemory(&bzip_info,0,sizeof(bzip_info)); 130216abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy#endif 130316abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy#if defined(MAGICKCORE_LZMA_DELEGATE) 130416abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy (void) ResetMagickMemory(&allocator,0,sizeof(allocator)); 130516abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy#endif 130616abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 130716abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy (void) ResetMagickMemory(&zip_info,0,sizeof(zip_info)); 130816abe0bc9b38cc34ff254b8ea557a8a6ca0c395fcristy#endif 1309330af6c00116155c122d0f4d697c176bbcc31768cristy switch (image->compression) 1310330af6c00116155c122d0f4d697c176bbcc31768cristy { 1311330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 1312330af6c00116155c122d0f4d697c176bbcc31768cristy case BZipCompression: 1313330af6c00116155c122d0f4d697c176bbcc31768cristy { 13143a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 13153a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 13163a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 1317330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.bzalloc=AcquireBZIPMemory; 1318330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.bzfree=RelinquishBZIPMemory; 1319330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.opaque=(void *) NULL; 1320330af6c00116155c122d0f4d697c176bbcc31768cristy code=BZ2_bzDecompressInit(&bzip_info,(int) image_info->verbose, 1321330af6c00116155c122d0f4d697c176bbcc31768cristy MagickFalse); 1322330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != BZ_OK) 1323330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 1324330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1325330af6c00116155c122d0f4d697c176bbcc31768cristy } 1326330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 1327330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_LZMA_DELEGATE) 1328330af6c00116155c122d0f4d697c176bbcc31768cristy case LZMACompression: 1329330af6c00116155c122d0f4d697c176bbcc31768cristy { 13303a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 13313a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 13323a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 13339d72f1a800b88a59673d77b1da69d047daa88523cristy allocator.alloc=AcquireLZMAMemory; 13349d72f1a800b88a59673d77b1da69d047daa88523cristy allocator.free=RelinquishLZMAMemory; 1335330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info=initialize_lzma; 13369d72f1a800b88a59673d77b1da69d047daa88523cristy lzma_info.allocator=(&allocator); 1337330af6c00116155c122d0f4d697c176bbcc31768cristy code=lzma_auto_decoder(&lzma_info,-1,0); 1338330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != LZMA_OK) 1339330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 1340330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1341330af6c00116155c122d0f4d697c176bbcc31768cristy } 1342330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 1343330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 1344330af6c00116155c122d0f4d697c176bbcc31768cristy case LZWCompression: 1345330af6c00116155c122d0f4d697c176bbcc31768cristy case ZipCompression: 1346330af6c00116155c122d0f4d697c176bbcc31768cristy { 13473a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 13483a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 13493a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 1350330af6c00116155c122d0f4d697c176bbcc31768cristy zip_info.zalloc=AcquireZIPMemory; 1351330af6c00116155c122d0f4d697c176bbcc31768cristy zip_info.zfree=RelinquishZIPMemory; 1352330af6c00116155c122d0f4d697c176bbcc31768cristy zip_info.opaque=(voidpf) NULL; 1353330af6c00116155c122d0f4d697c176bbcc31768cristy code=inflateInit(&zip_info); 1354330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != Z_OK) 1355330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 1356330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1357330af6c00116155c122d0f4d697c176bbcc31768cristy } 1358330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 1359330af6c00116155c122d0f4d697c176bbcc31768cristy case RLECompression: 1360330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1361330af6c00116155c122d0f4d697c176bbcc31768cristy default: 1362330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1363330af6c00116155c122d0f4d697c176bbcc31768cristy } 1364b3f97ae45019a91b30792a6fa42d81a2689a7025cristy pixels=(unsigned char *) GetQuantumPixels(quantum_info); 13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=0; 1366bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1368bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13714c08aed51c5899665ade97263692328eea4af106cristy register Quantum 137205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk *magick_restrict q; 13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1374330af6c00116155c122d0f4d697c176bbcc31768cristy if (status == MagickFalse) 1375330af6c00116155c122d0f4d697c176bbcc31768cristy break; 13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 1377acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy if (q == (Quantum *) NULL) 13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->compression) 13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1381263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 1382263771792ed48bef0e1293323aa32c66d0e3617dcristy case BZipCompression: 13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1384263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.next_out=(char *) pixels; 1385263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.avail_out=(unsigned int) (packet_size*image->columns); 13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 138889f839d02a8f261c94f7f7075c3cf90724802958cristy int 138989f839d02a8f261c94f7f7075c3cf90724802958cristy code; 139089f839d02a8f261c94f7f7075c3cf90724802958cristy 1391263771792ed48bef0e1293323aa32c66d0e3617dcristy if (bzip_info.avail_in == 0) 13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1393263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.next_in=(char *) compress_pixels; 1394263771792ed48bef0e1293323aa32c66d0e3617dcristy length=(size_t) BZipMaxExtent(packet_size*image->columns); 1395261ce828574bd0c1a102eaf9c9bddbe79c290849cristy if (version != 0.0) 13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=(size_t) ReadBlobMSBLong(image); 13971d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy if (length > compress_extent) 1398fda8bdce0a38d77595a3a34eedce25019611304ecristy { 1399fda8bdce0a38d77595a3a34eedce25019611304ecristy (void) BZ2_bzDecompressEnd(&bzip_info); 1400fda8bdce0a38d77595a3a34eedce25019611304ecristy ThrowReaderException(CorruptImageError, 1401fda8bdce0a38d77595a3a34eedce25019611304ecristy "UnableToReadImageData"); 1402fda8bdce0a38d77595a3a34eedce25019611304ecristy } 1403263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.avail_in=(unsigned int) ReadBlob(image,length, 1404263771792ed48bef0e1293323aa32c66d0e3617dcristy (unsigned char *) bzip_info.next_in); 14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 140689f839d02a8f261c94f7f7075c3cf90724802958cristy code=BZ2_bzDecompress(&bzip_info); 140789f839d02a8f261c94f7f7075c3cf90724802958cristy if (code < 0) 140889f839d02a8f261c94f7f7075c3cf90724802958cristy { 140989f839d02a8f261c94f7f7075c3cf90724802958cristy status=MagickFalse; 141089f839d02a8f261c94f7f7075c3cf90724802958cristy break; 141189f839d02a8f261c94f7f7075c3cf90724802958cristy } 141289f839d02a8f261c94f7f7075c3cf90724802958cristy if (code == BZ_STREAM_END) 14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1414263771792ed48bef0e1293323aa32c66d0e3617dcristy } while (bzip_info.avail_out != 0); 14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type,pixels,exception); 14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1420263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_LZMA_DELEGATE) 1421263771792ed48bef0e1293323aa32c66d0e3617dcristy case LZMACompression: 14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1423263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_info.next_out=pixels; 1424330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info.avail_out=packet_size*image->columns; 14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14273a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 14283a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 14293a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 1430263771792ed48bef0e1293323aa32c66d0e3617dcristy if (lzma_info.avail_in == 0) 14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1432263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_info.next_in=compress_pixels; 1433263771792ed48bef0e1293323aa32c66d0e3617dcristy length=(size_t) ReadBlobMSBLong(image); 14341d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy if (length > compress_extent) 1435fda8bdce0a38d77595a3a34eedce25019611304ecristy { 1436fda8bdce0a38d77595a3a34eedce25019611304ecristy lzma_end(&lzma_info); 1437fda8bdce0a38d77595a3a34eedce25019611304ecristy ThrowReaderException(CorruptImageError, 1438fda8bdce0a38d77595a3a34eedce25019611304ecristy "UnableToReadImageData"); 1439fda8bdce0a38d77595a3a34eedce25019611304ecristy } 1440263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_info.avail_in=(unsigned int) ReadBlob(image,length, 1441263771792ed48bef0e1293323aa32c66d0e3617dcristy (unsigned char *) lzma_info.next_in); 1442263771792ed48bef0e1293323aa32c66d0e3617dcristy } 1443263771792ed48bef0e1293323aa32c66d0e3617dcristy code=lzma_code(&lzma_info,LZMA_RUN); 1444330af6c00116155c122d0f4d697c176bbcc31768cristy if (code < 0) 1445330af6c00116155c122d0f4d697c176bbcc31768cristy { 1446330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 1447330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1448330af6c00116155c122d0f4d697c176bbcc31768cristy } 1449330af6c00116155c122d0f4d697c176bbcc31768cristy if (code == LZMA_STREAM_END) 1450263771792ed48bef0e1293323aa32c66d0e3617dcristy break; 1451263771792ed48bef0e1293323aa32c66d0e3617dcristy } while (lzma_info.avail_out != 0); 1452263771792ed48bef0e1293323aa32c66d0e3617dcristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 1453263771792ed48bef0e1293323aa32c66d0e3617dcristy quantum_type,pixels,exception); 1454263771792ed48bef0e1293323aa32c66d0e3617dcristy break; 1455263771792ed48bef0e1293323aa32c66d0e3617dcristy } 1456263771792ed48bef0e1293323aa32c66d0e3617dcristy#endif 1457263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 1458263771792ed48bef0e1293323aa32c66d0e3617dcristy case LZWCompression: 1459263771792ed48bef0e1293323aa32c66d0e3617dcristy case ZipCompression: 1460263771792ed48bef0e1293323aa32c66d0e3617dcristy { 1461263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.next_out=pixels; 1462263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.avail_out=(uInt) (packet_size*image->columns); 1463263771792ed48bef0e1293323aa32c66d0e3617dcristy do 1464263771792ed48bef0e1293323aa32c66d0e3617dcristy { 146589f839d02a8f261c94f7f7075c3cf90724802958cristy int 146689f839d02a8f261c94f7f7075c3cf90724802958cristy code; 146789f839d02a8f261c94f7f7075c3cf90724802958cristy 1468263771792ed48bef0e1293323aa32c66d0e3617dcristy if (zip_info.avail_in == 0) 1469263771792ed48bef0e1293323aa32c66d0e3617dcristy { 1470263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.next_in=compress_pixels; 1471263771792ed48bef0e1293323aa32c66d0e3617dcristy length=(size_t) ZipMaxExtent(packet_size*image->columns); 1472261ce828574bd0c1a102eaf9c9bddbe79c290849cristy if (version != 0.0) 14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=(size_t) ReadBlobMSBLong(image); 14741d3be430d3ce0f8a6ac06178d3064e4853b29f4ccristy if (length > compress_extent) 1475fda8bdce0a38d77595a3a34eedce25019611304ecristy { 1476fda8bdce0a38d77595a3a34eedce25019611304ecristy (void) inflateEnd(&zip_info); 1477fda8bdce0a38d77595a3a34eedce25019611304ecristy ThrowReaderException(CorruptImageError, 1478fda8bdce0a38d77595a3a34eedce25019611304ecristy "UnableToReadImageData"); 1479fda8bdce0a38d77595a3a34eedce25019611304ecristy } 1480263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.avail_in=(unsigned int) ReadBlob(image,length, 1481263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.next_in); 14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 148389f839d02a8f261c94f7f7075c3cf90724802958cristy code=inflate(&zip_info,Z_SYNC_FLUSH); 148489f839d02a8f261c94f7f7075c3cf90724802958cristy if (code < 0) 148589f839d02a8f261c94f7f7075c3cf90724802958cristy { 148689f839d02a8f261c94f7f7075c3cf90724802958cristy status=MagickFalse; 148789f839d02a8f261c94f7f7075c3cf90724802958cristy break; 148889f839d02a8f261c94f7f7075c3cf90724802958cristy } 148989f839d02a8f261c94f7f7075c3cf90724802958cristy if (code == Z_STREAM_END) 14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 1491263771792ed48bef0e1293323aa32c66d0e3617dcristy } while (zip_info.avail_out != 0); 14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type,pixels,exception); 14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case RLECompression: 14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1499bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 0) 15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,packet_size,pixels); 1504c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy PushRunlengthPacket(image,pixels,&length,&pixel,exception); 15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length--; 15074c08aed51c5899665ade97263692328eea4af106cristy if (image->storage_class == PseudoClass) 150894b11835effe9f2ded8638e50db5fb7acd92ea0bcristy SetPixelIndex(image,ClampToQuantum(pixel.index),q); 15094c08aed51c5899665ade97263692328eea4af106cristy else 15104c08aed51c5899665ade97263692328eea4af106cristy { 151194b11835effe9f2ded8638e50db5fb7acd92ea0bcristy SetPixelRed(image,ClampToQuantum(pixel.red),q); 151294b11835effe9f2ded8638e50db5fb7acd92ea0bcristy SetPixelGreen(image,ClampToQuantum(pixel.green),q); 151394b11835effe9f2ded8638e50db5fb7acd92ea0bcristy SetPixelBlue(image,ClampToQuantum(pixel.blue),q); 15144c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 151594b11835effe9f2ded8638e50db5fb7acd92ea0bcristy SetPixelBlack(image,ClampToQuantum(pixel.black),q); 15164c08aed51c5899665ade97263692328eea4af106cristy } 15179f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 151894b11835effe9f2ded8638e50db5fb7acd92ea0bcristy SetPixelAlpha(image,ClampToQuantum(pixel.alpha),q); 1519ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,packet_size*image->columns,pixels); 15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type,pixels,exception); 15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetQuantumImageType(image,quantum_type); 1535330af6c00116155c122d0f4d697c176bbcc31768cristy switch (image->compression) 1536330af6c00116155c122d0f4d697c176bbcc31768cristy { 1537330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 1538330af6c00116155c122d0f4d697c176bbcc31768cristy case BZipCompression: 1539330af6c00116155c122d0f4d697c176bbcc31768cristy { 15403a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 15413a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 15423a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 1543261ce828574bd0c1a102eaf9c9bddbe79c290849cristy if (version == 0.0) 1544330af6c00116155c122d0f4d697c176bbcc31768cristy { 1545330af6c00116155c122d0f4d697c176bbcc31768cristy MagickOffsetType 1546330af6c00116155c122d0f4d697c176bbcc31768cristy offset; 1547330af6c00116155c122d0f4d697c176bbcc31768cristy 1548330af6c00116155c122d0f4d697c176bbcc31768cristy offset=SeekBlob(image,-((MagickOffsetType) 1549330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.avail_in),SEEK_CUR); 1550330af6c00116155c122d0f4d697c176bbcc31768cristy if (offset < 0) 15513e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 1552330af6c00116155c122d0f4d697c176bbcc31768cristy } 1553330af6c00116155c122d0f4d697c176bbcc31768cristy code=BZ2_bzDecompressEnd(&bzip_info); 1554330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != BZ_OK) 1555330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 1556330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1557330af6c00116155c122d0f4d697c176bbcc31768cristy } 1558330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 1559330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_LZMA_DELEGATE) 1560330af6c00116155c122d0f4d697c176bbcc31768cristy case LZMACompression: 1561330af6c00116155c122d0f4d697c176bbcc31768cristy { 15623a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 15633a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 15643a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 15653b788a0085d11ad0ab49bd28931e939b18be1b15cristy code=lzma_code(&lzma_info,LZMA_FINISH); 15663b788a0085d11ad0ab49bd28931e939b18be1b15cristy if ((code != LZMA_STREAM_END) && (code != LZMA_OK)) 1567b977da59e655d91f923b52cf81dd75a3e0dc7e37cristy status=MagickFalse; 1568330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_end(&lzma_info); 1569330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1570330af6c00116155c122d0f4d697c176bbcc31768cristy } 1571330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 1572330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 1573330af6c00116155c122d0f4d697c176bbcc31768cristy case LZWCompression: 1574330af6c00116155c122d0f4d697c176bbcc31768cristy case ZipCompression: 1575330af6c00116155c122d0f4d697c176bbcc31768cristy { 15763a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 15773a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 15783a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 1579261ce828574bd0c1a102eaf9c9bddbe79c290849cristy if (version == 0.0) 1580330af6c00116155c122d0f4d697c176bbcc31768cristy { 1581330af6c00116155c122d0f4d697c176bbcc31768cristy MagickOffsetType 1582330af6c00116155c122d0f4d697c176bbcc31768cristy offset; 1583330af6c00116155c122d0f4d697c176bbcc31768cristy 1584330af6c00116155c122d0f4d697c176bbcc31768cristy offset=SeekBlob(image,-((MagickOffsetType) zip_info.avail_in), 1585330af6c00116155c122d0f4d697c176bbcc31768cristy SEEK_CUR); 1586330af6c00116155c122d0f4d697c176bbcc31768cristy if (offset < 0) 15873e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 1588330af6c00116155c122d0f4d697c176bbcc31768cristy } 1589330af6c00116155c122d0f4d697c176bbcc31768cristy code=inflateEnd(&zip_info); 1590330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != LZMA_OK) 1591330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 1592330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1593330af6c00116155c122d0f4d697c176bbcc31768cristy } 1594330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 1595330af6c00116155c122d0f4d697c176bbcc31768cristy default: 1596330af6c00116155c122d0f4d697c176bbcc31768cristy break; 1597330af6c00116155c122d0f4d697c176bbcc31768cristy } 15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info=DestroyQuantumInfo(quantum_info); 15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compress_pixels=(unsigned char *) RelinquishMagickMemory(compress_pixels); 1600bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (((y != (ssize_t) image->rows)) || (status == MagickFalse)) 16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (EOFBlob(image) != MagickFalse) 16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile", 16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Proceed to next image. 16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0) 16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->scene >= (image_info->scene+image_info->number_scenes-1)) 16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy c=ReadBlobByte(image); 16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while ((isgraph(c) == MagickFalse) && (c != EOF)); 16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (c != EOF) 16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 16269950d57e1124b73f684fb5946e206994cefda628cristy AcquireNextImage(image_info,image,exception); 16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetBlobSize(image)); 16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (c != EOF); 16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 16413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e g i s t e r M I F F I m a g e % 16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% RegisterMIFFImage() adds properties for the MIFF image format to the list of 16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% supported formats. The properties include the image format tag, a method to 16563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% read and/or write the format, whether the format supports the saving of more 16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% than one frame to the same file or blob, whether the format supports native 16583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% in-memory I/O, and a brief description of the format. 16593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the RegisterMIFFImage method is: 16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1662bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t RegisterMIFFImage(void) 16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1665bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterMIFFImage(void) 16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 1668151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy version[MagickPathExtent]; 16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 16723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MagickImageCoderSignatureText) 1675151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(version,MagickLibVersionText,MagickPathExtent); 16763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(ZLIB_VERSION) 1677151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version," with Zlib ",MagickPathExtent); 1678151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,ZLIB_VERSION,MagickPathExtent); 16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 1681151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version," and BZlib",MagickPathExtent); 16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 168406b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("MIFF","MIFF","Magick Image File Format"); 16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadMIFFImage; 16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteMIFFImage; 16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsMIFF; 168808e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags|=CoderSeekableStreamFlag; 16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% U n r e g i s t e r M I F F I m a g e % 17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterMIFFImage() removes format registrations made by the MIFF module 17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% from the list of supported formats. 17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the UnregisterMIFFImage method is: 17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterMIFFImage(void) 17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterMIFFImage(void) 17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("MIFF"); 17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e M I F F I m a g e % 17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteMIFFImage() writes a MIFF image to a file. 17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteMIFFImage method is: 17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType WriteMIFFImage(const ImageInfo *image_info, 17351e178e70fb3c956f9fc1e30c3ba863e882666465cristy% Image *image,ExceptionInfo *exception) 17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Compression code contributed by Kyle Shorter. 17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: the image. 17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 17451e178e70fb3c956f9fc1e30c3ba863e882666465cristy% o exception: return any errors or warnings in this structure. 17461e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic unsigned char *PopRunlengthPacket(Image *image,unsigned char *pixels, 1750c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy size_t length,PixelInfo *pixel,ExceptionInfo *exception) 17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class != DirectClass) 17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 175442c36c10f5190bdf458c219b6e53c31bf18f1439cristy unsigned int 175542c36c10f5190bdf458c219b6e53c31bf18f1439cristy value; 175642c36c10f5190bdf458c219b6e53c31bf18f1439cristy 175742c36c10f5190bdf458c219b6e53c31bf18f1439cristy value=(unsigned int) ClampToQuantum(pixel->index); 17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->depth) 17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 176242c36c10f5190bdf458c219b6e53c31bf18f1439cristy *pixels++=(unsigned char) (value >> 24); 176342c36c10f5190bdf458c219b6e53c31bf18f1439cristy *pixels++=(unsigned char) (value >> 16); 17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 176642c36c10f5190bdf458c219b6e53c31bf18f1439cristy *pixels++=(unsigned char) (value >> 8); 17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 176942c36c10f5190bdf458c219b6e53c31bf18f1439cristy *pixels++=(unsigned char) value; 17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 1773c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy (void) ThrowMagickException(exception,GetMagickModule(), 17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CorruptImageError,"ImageDepthNotSupported","`%s'",image->filename); 17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->depth) 17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17804cb162a81b4dfaf673e94c9dea88ad0a92f0a3d7cristy unsigned int 17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value; 17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17839f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 178594b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToLong(ClampToQuantum(pixel->alpha)); 17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopLongPixel(MSBEndian,value,pixels); 17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value; 17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17959f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 179794b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToShort(ClampToQuantum(pixel->alpha)); 17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopShortPixel(MSBEndian,value,pixels); 17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 18013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value; 18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18079f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 180994b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=(unsigned char) ScaleQuantumToChar(ClampToQuantum( 181094b11835effe9f2ded8638e50db5fb7acd92ea0bcristy pixel->alpha)); 18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopCharPixel(value,pixels); 18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 1816c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy (void) ThrowMagickException(exception,GetMagickModule(), 18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CorruptImageError,"ImageDepthNotSupported","`%s'",image->filename); 18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels++=(unsigned char) length; 18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(pixels); 18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (image->depth) 18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 18253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18264cb162a81b4dfaf673e94c9dea88ad0a92f0a3d7cristy unsigned int 18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value; 18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 182994b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToLong(ClampToQuantum(pixel->red)); 18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopLongPixel(MSBEndian,value,pixels); 1831325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) == MagickFalse) 1832325cfdc2db361433ba7583e9479cb5bc40167cf5cristy { 1833325cfdc2db361433ba7583e9479cb5bc40167cf5cristy value=ScaleQuantumToLong(ClampToQuantum(pixel->green)); 1834325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixels=PopLongPixel(MSBEndian,value,pixels); 1835325cfdc2db361433ba7583e9479cb5bc40167cf5cristy value=ScaleQuantumToLong(ClampToQuantum(pixel->blue)); 1836325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixels=PopLongPixel(MSBEndian,value,pixels); 1837325cfdc2db361433ba7583e9479cb5bc40167cf5cristy } 18384c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 184094b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToLong(ClampToQuantum(pixel->black)); 18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopLongPixel(MSBEndian,value,pixels); 18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18439f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 184594b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToLong(ClampToQuantum(pixel->alpha)); 18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopLongPixel(MSBEndian,value,pixels); 18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value; 18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 185594b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToShort(ClampToQuantum(pixel->red)); 18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopShortPixel(MSBEndian,value,pixels); 1857325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) == MagickFalse) 1858325cfdc2db361433ba7583e9479cb5bc40167cf5cristy { 1859325cfdc2db361433ba7583e9479cb5bc40167cf5cristy value=ScaleQuantumToShort(ClampToQuantum(pixel->green)); 1860325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixels=PopShortPixel(MSBEndian,value,pixels); 1861325cfdc2db361433ba7583e9479cb5bc40167cf5cristy value=ScaleQuantumToShort(ClampToQuantum(pixel->blue)); 1862325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixels=PopShortPixel(MSBEndian,value,pixels); 1863325cfdc2db361433ba7583e9479cb5bc40167cf5cristy } 18644c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 186694b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToShort(ClampToQuantum(pixel->black)); 18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopShortPixel(MSBEndian,value,pixels); 18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18699f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 187194b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=ScaleQuantumToShort(ClampToQuantum(pixel->alpha)); 18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopShortPixel(MSBEndian,value,pixels); 18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value; 18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 188194b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=(unsigned char) ScaleQuantumToChar(ClampToQuantum(pixel->red)); 18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopCharPixel(value,pixels); 1883325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) == MagickFalse) 1884325cfdc2db361433ba7583e9479cb5bc40167cf5cristy { 1885325cfdc2db361433ba7583e9479cb5bc40167cf5cristy value=(unsigned char) ScaleQuantumToChar(ClampToQuantum( 1886325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixel->green)); 1887325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixels=PopCharPixel(value,pixels); 1888325cfdc2db361433ba7583e9479cb5bc40167cf5cristy value=(unsigned char) ScaleQuantumToChar(ClampToQuantum(pixel->blue)); 1889325cfdc2db361433ba7583e9479cb5bc40167cf5cristy pixels=PopCharPixel(value,pixels); 1890325cfdc2db361433ba7583e9479cb5bc40167cf5cristy } 18914c08aed51c5899665ade97263692328eea4af106cristy if (image->colorspace == CMYKColorspace) 18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 189394b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=(unsigned char) ScaleQuantumToChar(ClampToQuantum( 189494b11835effe9f2ded8638e50db5fb7acd92ea0bcristy pixel->black)); 18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopCharPixel(value,pixels); 18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18979f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 189994b11835effe9f2ded8638e50db5fb7acd92ea0bcristy value=(unsigned char) ScaleQuantumToChar(ClampToQuantum( 190094b11835effe9f2ded8638e50db5fb7acd92ea0bcristy pixel->alpha)); 19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=PopCharPixel(value,pixels); 19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 1906c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageError, 1907c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy "ImageDepthNotSupported","`%s'",image->filename); 19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels++=(unsigned char) length; 19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(pixels); 19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteMIFFImage(const ImageInfo *image_info, 19141e178e70fb3c956f9fc1e30c3ba863e882666465cristy Image *image,ExceptionInfo *exception) 19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 19173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bz_stream 19183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bzip_info; 19193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 1922151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy buffer[MagickPathExtent]; 19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CompressionType 19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression; 19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *property, 19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1931263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_LZMA_DELEGATE) 19324b46dbab6cc03f190444a3159ac3784c597a5357cristy lzma_allocator 19334b46dbab6cc03f190444a3159ac3784c597a5357cristy allocator; 19344b46dbab6cc03f190444a3159ac3784c597a5357cristy 1935263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_stream 1936330af6c00116155c122d0f4d697c176bbcc31768cristy initialize_lzma = LZMA_STREAM_INIT, 1937330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info; 1938263771792ed48bef0e1293323aa32c66d0e3617dcristy#endif 19393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 19423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19464c08aed51c5899665ade97263692328eea4af106cristy PixelInfo 19474c08aed51c5899665ade97263692328eea4af106cristy pixel, 19484c08aed51c5899665ade97263692328eea4af106cristy target; 19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumType 19543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type; 19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1956bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 19573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 19583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length, 19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size; 19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1963263771792ed48bef0e1293323aa32c66d0e3617dcristy ssize_t 1964263771792ed48bef0e1293323aa32c66d0e3617dcristy y; 1965263771792ed48bef0e1293323aa32c66d0e3617dcristy 19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *compress_pixels, 19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels, 19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy z_stream 19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy zip_info; 19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open output image file. 19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 1980e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 1982e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 19853a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy assert(exception != (ExceptionInfo *) NULL); 1986e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 19871e178e70fb3c956f9fc1e30c3ba863e882666465cristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate image pixels. 19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1996d7f0393d8c44756b4f0c314ba63cf8f89163d07ccristy if ((image->storage_class == PseudoClass) && 1997d7f0393d8c44756b4f0c314ba63cf8f89163d07ccristy (image->colors > (size_t) (GetQuantumRange(image->depth)+1))) 1998d7f0393d8c44756b4f0c314ba63cf8f89163d07ccristy (void) SetImageStorageClass(image,DirectClass,exception); 1999ca5fbf35b9ab5940e70d4fe01e090f24706f03a4cristy image->depth=image->depth <= 8 ? 8UL : image->depth <= 16 ? 16UL : 2000ca5fbf35b9ab5940e70d4fe01e090f24706f03a4cristy image->depth <= 32 ? 32UL : 64UL; 20015f766ef8b0cd9906c2c3a56d845828380a251073cristy quantum_info=AcquireQuantumInfo(image_info,image); 20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info == (QuantumInfo *) NULL) 20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->storage_class != PseudoClass) && (image->depth >= 32) && 20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (quantum_info->format == UndefinedQuantumFormat) && 20061e178e70fb3c956f9fc1e30c3ba863e882666465cristy (IsHighDynamicRangeImage(image,exception) != MagickFalse)) 20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat); 20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 201229dd80efe8d7489d5f689a8a723454e684f92a8fdirk compression=UndefinedCompression; 20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression != UndefinedCompression) 20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression=image_info->compression; 20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (compression) 20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 201749f95c243b7c191ec04a1fb65912109b8d1b6daacristy#if !defined(MAGICKCORE_LZMA_DELEGATE) 2018263771792ed48bef0e1293323aa32c66d0e3617dcristy case LZMACompression: compression=NoCompression; break; 2019263771792ed48bef0e1293323aa32c66d0e3617dcristy#endif 2020263771792ed48bef0e1293323aa32c66d0e3617dcristy#if !defined(MAGICKCORE_ZLIB_DELEGATE) 20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case LZWCompression: 20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case ZipCompression: compression=NoCompression; break; 20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(MAGICKCORE_BZLIB_DELEGATE) 20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case BZipCompression: compression=NoCompression; break; 20263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case RLECompression: 20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info->format == FloatingPointQuantumFormat) 20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression=NoCompression; 20314c08aed51c5899665ade97263692328eea4af106cristy GetPixelInfo(image,&target); 20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size=(size_t) (quantum_info->depth/8); 20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == DirectClass) 20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size=(size_t) (3*quantum_info->depth/8); 2040325cfdc2db361433ba7583e9479cb5bc40167cf5cristy if (IsGrayColorspace(image->colorspace) != MagickFalse) 20410a30e1843b1bd833e6ea8487d2fb176e79c14535cristy packet_size=(size_t) (quantum_info->depth/8); 20429f36ba7e4919cc3b03ba53776a8423995db60714cristy if (image->alpha_trait != UndefinedPixelTrait) 20433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size+=quantum_info->depth/8; 20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colorspace == CMYKColorspace) 20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size+=quantum_info->depth/8; 20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (compression == RLECompression) 20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size++; 20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=MagickMax(BZipMaxExtent(packet_size*image->columns),ZipMaxExtent( 20493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size*image->columns)); 20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((compression == BZipCompression) || (compression == ZipCompression)) 20513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length != (size_t) ((unsigned int) length)) 20523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression=NoCompression; 20533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compress_pixels=(unsigned char *) AcquireQuantumMemory(length, 20543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*compress_pixels)); 20553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (compress_pixels == (unsigned char *) NULL) 20563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 20573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MIFF header. 20593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 206026645017b983b22ccab5340341e79a55df20494dCristy (void) WriteBlobString(image,"id=ImageMagick version=1.0\n"); 2061151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent, 20628a46d827a124555f0c48fb2368ec1bba8e079ab6cristy "class=%s colors=%.20g alpha-trait=%s\n",CommandOptionToMnemonic( 2063e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy MagickClassOptions,image->storage_class),(double) image->colors, 20648a46d827a124555f0c48fb2368ec1bba8e079ab6cristy CommandOptionToMnemonic(MagickPixelTraitOptions,(ssize_t) 20659f36ba7e4919cc3b03ba53776a8423995db60714cristy image->alpha_trait)); 20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 20674cb7acb78b8f24b639830e4dc5e0babc910c6b56Cristy if (image->alpha_trait != UndefinedPixelTrait) 20684cb7acb78b8f24b639830e4dc5e0babc910c6b56Cristy (void) WriteBlobString(image,"matte=True\n"); 20696ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy (void) FormatLocaleString(buffer,MagickPathExtent, 20706ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy "columns=%.20g rows=%.20g depth=%.20g\n",(double) image->columns, 20716ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy (double) image->rows,(double) image->depth); 20723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 20735f1c1fff2a55c4d8756556e78c1f307d352ed1b8cristy if (image->type != UndefinedType) 20743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2075151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"type=%s\n", 2076042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickTypeOptions,image->type)); 20773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colorspace != UndefinedColorspace) 20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2081151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"colorspace=%s\n", 2082042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickColorspaceOptions,image->colorspace)); 20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20853e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy if (image->intensity != UndefinedPixelIntensityMethod) 20863e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy { 20876ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy (void) FormatLocaleString(buffer,MagickPathExtent, 20886ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy "pixel-intensity=%s\n",CommandOptionToMnemonic( 20896ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy MagickPixelIntensityOptions,image->intensity)); 20903e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy (void) WriteBlobString(image,buffer); 20913e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy } 20923e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy if (image->endian != UndefinedEndian) 20933e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy { 2094151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"endian=%s\n", 20953e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy CommandOptionToMnemonic(MagickEndianOptions,image->endian)); 20963e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy (void) WriteBlobString(image,buffer); 20973e4e9f4bb2ad239eed2dfbdc01b5a061c89b59d9cristy } 20983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (compression != UndefinedCompression) 20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2100151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"compression=%s " 2101042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy "quality=%.20g\n",CommandOptionToMnemonic(MagickCompressOptions, 2102e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy compression),(double) image->quality); 21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units != UndefinedResolution) 21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2107151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"units=%s\n", 2108042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickResolutionOptions,image->units)); 21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21112a11befa48257796843468409d77bb8cfb129cdccristy if ((image->resolution.x != 0) || (image->resolution.y != 0)) 21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2113151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent, 21142a11befa48257796843468409d77bb8cfb129cdccristy "resolution=%gx%g\n",image->resolution.x,image->resolution.y); 21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->page.width != 0) || (image->page.height != 0)) 21183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2119151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent, 2120e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "page=%.20gx%.20g%+.20g%+.20g\n",(double) image->page.width,(double) 2121e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy image->page.height,(double) image->page.x,(double) image->page.y); 21223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 21253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->page.x != 0) || (image->page.y != 0)) 21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2127151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"page=%+ld%+ld\n", 2128f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (long) image->page.x,(long) image->page.y); 21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->tile_offset.x != 0) || (image->tile_offset.y != 0)) 21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21336ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy (void) FormatLocaleString(buffer,MagickPathExtent, 21346ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy "tile-offset=%+ld%+ld\n",(long) image->tile_offset.x,(long) 21356ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy image->tile_offset.y); 21363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((GetNextImageInList(image) != (Image *) NULL) || 21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetPreviousImageInList(image) != (Image *) NULL)) 21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->scene == 0) 2142151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"iterations=%.20g " 2143e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "delay=%.20g ticks-per-second=%.20g\n",(double) image->iterations, 2144e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->delay,(double) image->ticks_per_second); 21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2146151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"scene=%.20g " 2147e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "iterations=%.20g delay=%.20g ticks-per-second=%.20g\n",(double) 2148e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy image->scene,(double) image->iterations,(double) image->delay, 2149e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->ticks_per_second); 21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 21533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->scene != 0) 21553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2156151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"scene=%.20g\n", 2157e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->scene); 21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations != 0) 21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21626ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy (void) FormatLocaleString(buffer,MagickPathExtent, 21636ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy "iterations=%.20g\n",(double) image->iterations); 21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay != 0) 21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2168151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"delay=%.20g\n", 2169e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->delay); 21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->ticks_per_second != UndefinedTicksPerSecond) 21733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2174151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent, 2175e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "ticks-per-second=%.20g\n",(double) image->ticks_per_second); 21763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gravity != UndefinedGravity) 21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2181151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"gravity=%s\n", 2182042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickGravityOptions,image->gravity)); 21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->dispose != UndefinedDispose) 21863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2187151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"dispose=%s\n", 2188042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickDisposeOptions,image->dispose)); 21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21936ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy (void) FormatLocaleString(buffer,MagickPathExtent, 21946ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy "rendering-intent=%s\n",CommandOptionToMnemonic(MagickIntentOptions, 21956ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy image->rendering_intent)); 21963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma != 0.0) 21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2200151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"gamma=%g\n", 22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->gamma); 22023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->chromaticity.white_point.x != 0.0) 22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note chomaticity points. 22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2209151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"red-primary=%g," 2210e7f5109f30fc7242d04a26174a9138483dda5b6acristy "%g green-primary=%g,%g blue-primary=%g,%g\n", 22113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.x,image->chromaticity.red_primary.y, 22123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.x, 22133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.y, 22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.x, 22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.y); 22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 2217151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent, 2218e7f5109f30fc7242d04a26174a9138483dda5b6acristy "white-point=%g,%g\n",image->chromaticity.white_point.x, 22198cd5b3193212b4aebce08c4e7afbb66b09778029cristy image->chromaticity.white_point.y); 22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 22213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->orientation != UndefinedOrientation) 22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2224151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"orientation=%s\n", 2225042ee78fa9004bf1ac6a95f09d9d1faca631dda1cristy CommandOptionToMnemonic(MagickOrientationOptions,image->orientation)); 22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->profiles != (void *) NULL) 22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name; 22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write image profiles. 22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImageProfileIterator(image); 22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (name != (const char *) NULL) 22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile != (StringInfo *) NULL) 22453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2246151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent, 2247e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "profile:%s=%.20g\n",name,(double) 2248e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy GetStringInfoLength(profile)); 22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 22523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->montage != (char *) NULL) 22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2256151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"montage=%s\n", 22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->montage); 22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info->format == FloatingPointQuantumFormat) 2261d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,"quantum:format","floating-point", 2262d15e65928aec551b7388c2863de3e3e628e2e0ddcristy exception); 22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImagePropertyIterator(image); 22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy property=GetNextImageProperty(image); 22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (property != (const char *) NULL) 22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2267151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(buffer,MagickPathExtent,"%s=",property); 22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,buffer); 2269d15e65928aec551b7388c2863de3e3e628e2e0ddcristy value=GetImageProperty(image,property,exception); 22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (const char *) NULL) 22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2272d76ed5d9fc4bd7d91bfd0db22ab8caf655039bc5cristy size_t 2273d76ed5d9fc4bd7d91bfd0db22ab8caf655039bc5cristy length; 2274d76ed5d9fc4bd7d91bfd0db22ab8caf655039bc5cristy 22750e75d758bce83dfe6356e643870a297c1f1b5cfecristy length=strlen(value); 22760e75d758bce83dfe6356e643870a297c1f1b5cfecristy for (i=0; i < (ssize_t) length; i++) 22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (isspace((int) ((unsigned char) value[i])) != 0) 22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 227904e917fc989a40d7bf0061aea8d0f558f068763ecristy if ((i == (ssize_t) length) && (i != 0)) 22800e75d758bce83dfe6356e643870a297c1f1b5cfecristy (void) WriteBlob(image,length,(const unsigned char *) value); 2281b880ee80fc15868f8fbd99acfa30a68710615b72cristy else 2282b880ee80fc15868f8fbd99acfa30a68710615b72cristy { 2283b880ee80fc15868f8fbd99acfa30a68710615b72cristy (void) WriteBlobByte(image,'{'); 22843d136bd62a1e38ab0b69ea3b3260ac4f4ee385decristy if (strchr(value,'}') == (char *) NULL) 22850e75d758bce83dfe6356e643870a297c1f1b5cfecristy (void) WriteBlob(image,length,(const unsigned char *) value); 22863d136bd62a1e38ab0b69ea3b3260ac4f4ee385decristy else 22870e75d758bce83dfe6356e643870a297c1f1b5cfecristy for (i=0; i < (ssize_t) length; i++) 22883d136bd62a1e38ab0b69ea3b3260ac4f4ee385decristy { 22893d136bd62a1e38ab0b69ea3b3260ac4f4ee385decristy if (value[i] == (int) '}') 22903d136bd62a1e38ab0b69ea3b3260ac4f4ee385decristy (void) WriteBlobByte(image,'\\'); 22913d136bd62a1e38ab0b69ea3b3260ac4f4ee385decristy (void) WriteBlobByte(image,value[i]); 22923d136bd62a1e38ab0b69ea3b3260ac4f4ee385decristy } 2293b880ee80fc15868f8fbd99acfa30a68710615b72cristy (void) WriteBlobByte(image,'}'); 2294b880ee80fc15868f8fbd99acfa30a68710615b72cristy } 22953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,'\n'); 22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy property=GetNextImageProperty(image); 22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobString(image,"\f\n:\032"); 23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->montage != (char *) NULL) 23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write montage tile directory. 23043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->directory != (char *) NULL) 23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,strlen(image->directory),(unsigned char *) 23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->directory); 23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobByte(image,'\0'); 23093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->profiles != (void *) NULL) 23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name; 23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Generic profile. 23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 23213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImageProfileIterator(image); 23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (name != (const char *) NULL) 23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,GetStringInfoLength(profile), 23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetStringInfoDatum(profile)); 23283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 23323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size; 23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *colormap, 23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 23413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate colormap. 23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 23433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size=(size_t) (3*quantum_info->depth/8); 23443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap=(unsigned char *) AcquireQuantumMemory(image->colors, 23453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_size*sizeof(*colormap)); 23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (colormap == (unsigned char *) NULL) 23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 23483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 23493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write colormap to file. 23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=colormap; 2352bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (quantum_info->depth) 23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(CorruptImageError,"ImageDepthNotSupported"); 23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 32: 23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23604cb162a81b4dfaf673e94c9dea88ad0a92f0a3d7cristy register unsigned int 23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel; 23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=ScaleQuantumToLong(image->colormap[i].red); 23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopLongPixel(MSBEndian,pixel,q); 23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=ScaleQuantumToLong(image->colormap[i].green); 23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopLongPixel(MSBEndian,pixel,q); 23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=ScaleQuantumToLong(image->colormap[i].blue); 23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopLongPixel(MSBEndian,pixel,q); 23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned short 23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel; 23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=ScaleQuantumToShort(image->colormap[i].red); 23773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopShortPixel(MSBEndian,pixel,q); 23783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=ScaleQuantumToShort(image->colormap[i].green); 23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopShortPixel(MSBEndian,pixel,q); 23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=ScaleQuantumToShort(image->colormap[i].blue); 23813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopShortPixel(MSBEndian,pixel,q); 23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel; 23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=(unsigned char) ScaleQuantumToChar(image->colormap[i].red); 23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopCharPixel(pixel,q); 23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=(unsigned char) ScaleQuantumToChar( 23923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green); 23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopCharPixel(pixel,q); 23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel=(unsigned char) ScaleQuantumToChar(image->colormap[i].blue); 23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=PopCharPixel(pixel,q); 23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,packet_size*image->colors,colormap); 24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap=(unsigned char *) RelinquishMagickMemory(colormap); 24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 24043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write image pixels to file. 24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2406330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickTrue; 2407330af6c00116155c122d0f4d697c176bbcc31768cristy switch (compression) 2408330af6c00116155c122d0f4d697c176bbcc31768cristy { 2409330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 2410330af6c00116155c122d0f4d697c176bbcc31768cristy case BZipCompression: 2411330af6c00116155c122d0f4d697c176bbcc31768cristy { 24123a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 24133a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 24143a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2415330af6c00116155c122d0f4d697c176bbcc31768cristy (void) ResetMagickMemory(&bzip_info,0,sizeof(bzip_info)); 2416330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.bzalloc=AcquireBZIPMemory; 2417330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.bzfree=RelinquishBZIPMemory; 2418330af6c00116155c122d0f4d697c176bbcc31768cristy code=BZ2_bzCompressInit(&bzip_info,(int) (image->quality == 24196ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy UndefinedCompressionQuality ? 7 : MagickMin(image->quality/10,9)), 24206ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy (int) image_info->verbose,0); 2421330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != BZ_OK) 2422330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 2423330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2424330af6c00116155c122d0f4d697c176bbcc31768cristy } 2425330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 2426330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_LZMA_DELEGATE) 2427330af6c00116155c122d0f4d697c176bbcc31768cristy case LZMACompression: 2428330af6c00116155c122d0f4d697c176bbcc31768cristy { 24293a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 24303a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 24313a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2432330af6c00116155c122d0f4d697c176bbcc31768cristy (void) ResetMagickMemory(&allocator,0,sizeof(allocator)); 2433330af6c00116155c122d0f4d697c176bbcc31768cristy allocator.alloc=AcquireLZMAMemory; 2434330af6c00116155c122d0f4d697c176bbcc31768cristy allocator.free=RelinquishLZMAMemory; 24359d72f1a800b88a59673d77b1da69d047daa88523cristy lzma_info=initialize_lzma; 2436330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info.allocator=&allocator; 24379d72f1a800b88a59673d77b1da69d047daa88523cristy code=lzma_easy_encoder(&lzma_info,image->quality/10,LZMA_CHECK_SHA256); 24389d72f1a800b88a59673d77b1da69d047daa88523cristy if (code != LZMA_OK) 24399d72f1a800b88a59673d77b1da69d047daa88523cristy status=MagickTrue; 2440330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2441330af6c00116155c122d0f4d697c176bbcc31768cristy } 2442330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 2443330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 2444330af6c00116155c122d0f4d697c176bbcc31768cristy case LZWCompression: 2445330af6c00116155c122d0f4d697c176bbcc31768cristy case ZipCompression: 2446330af6c00116155c122d0f4d697c176bbcc31768cristy { 24473a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 24483a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 24493a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2450330af6c00116155c122d0f4d697c176bbcc31768cristy (void) ResetMagickMemory(&zip_info,0,sizeof(zip_info)); 2451330af6c00116155c122d0f4d697c176bbcc31768cristy zip_info.zalloc=AcquireZIPMemory; 2452330af6c00116155c122d0f4d697c176bbcc31768cristy zip_info.zfree=RelinquishZIPMemory; 2453330af6c00116155c122d0f4d697c176bbcc31768cristy code=deflateInit(&zip_info,(int) (image->quality == 2454330af6c00116155c122d0f4d697c176bbcc31768cristy UndefinedCompressionQuality ? 7 : MagickMin(image->quality/10,9))); 2455330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != Z_OK) 2456330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 2457330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2458330af6c00116155c122d0f4d697c176bbcc31768cristy } 2459330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 2460330af6c00116155c122d0f4d697c176bbcc31768cristy default: 2461330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2462330af6c00116155c122d0f4d697c176bbcc31768cristy } 24631e178e70fb3c956f9fc1e30c3ba863e882666465cristy quantum_type=GetQuantumType(image,exception); 2464b3f97ae45019a91b30792a6fa42d81a2689a7025cristy pixels=(unsigned char *) GetQuantumPixels(quantum_info); 2465bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24674c08aed51c5899665ade97263692328eea4af106cristy register const Quantum 246805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk *magick_restrict p; 24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2470bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2473330af6c00116155c122d0f4d697c176bbcc31768cristy if (status == MagickFalse) 2474330af6c00116155c122d0f4d697c176bbcc31768cristy break; 24751e178e70fb3c956f9fc1e30c3ba863e882666465cristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 24764c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 24783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=pixels; 24793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy switch (compression) 24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2481263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 2482263771792ed48bef0e1293323aa32c66d0e3617dcristy case BZipCompression: 24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2484263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.next_in=(char *) pixels; 2485263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.avail_in=(unsigned int) (packet_size*image->columns); 2486deec0c22aa898ec2490b3830147f359487913a64cristy (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info, 2487deec0c22aa898ec2490b3830147f359487913a64cristy quantum_type,pixels,exception); 24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 24893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24903a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 24913a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 24923a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2493263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.next_out=(char *) compress_pixels; 2494263771792ed48bef0e1293323aa32c66d0e3617dcristy bzip_info.avail_out=(unsigned int) BZipMaxExtent(packet_size* 2495263771792ed48bef0e1293323aa32c66d0e3617dcristy image->columns); 2496263771792ed48bef0e1293323aa32c66d0e3617dcristy code=BZ2_bzCompress(&bzip_info,BZ_FLUSH); 2497263771792ed48bef0e1293323aa32c66d0e3617dcristy if (code != BZ_OK) 2498263771792ed48bef0e1293323aa32c66d0e3617dcristy status=MagickFalse; 2499263771792ed48bef0e1293323aa32c66d0e3617dcristy length=(size_t) (bzip_info.next_out-(char *) compress_pixels); 25003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length != 0) 25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBLong(image,(unsigned int) length); 25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,compress_pixels); 25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2505263771792ed48bef0e1293323aa32c66d0e3617dcristy } while (bzip_info.avail_in != 0); 2506263771792ed48bef0e1293323aa32c66d0e3617dcristy break; 2507263771792ed48bef0e1293323aa32c66d0e3617dcristy } 2508263771792ed48bef0e1293323aa32c66d0e3617dcristy#endif 2509263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_LZMA_DELEGATE) 2510263771792ed48bef0e1293323aa32c66d0e3617dcristy case LZMACompression: 2511263771792ed48bef0e1293323aa32c66d0e3617dcristy { 2512263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_info.next_in=pixels; 2513330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info.avail_in=packet_size*image->columns; 2514deec0c22aa898ec2490b3830147f359487913a64cristy (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info, 2515deec0c22aa898ec2490b3830147f359487913a64cristy quantum_type,pixels,exception); 2516263771792ed48bef0e1293323aa32c66d0e3617dcristy do 2517263771792ed48bef0e1293323aa32c66d0e3617dcristy { 25183a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 25193a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 25203a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2521263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_info.next_out=compress_pixels; 2522263771792ed48bef0e1293323aa32c66d0e3617dcristy lzma_info.avail_out=packet_size*image->columns; 2523263771792ed48bef0e1293323aa32c66d0e3617dcristy code=lzma_code(&lzma_info,LZMA_RUN); 2524263771792ed48bef0e1293323aa32c66d0e3617dcristy if (code != LZMA_OK) 2525263771792ed48bef0e1293323aa32c66d0e3617dcristy status=MagickFalse; 2526263771792ed48bef0e1293323aa32c66d0e3617dcristy length=(size_t) (lzma_info.next_out-compress_pixels); 2527263771792ed48bef0e1293323aa32c66d0e3617dcristy if (length != 0) 2528263771792ed48bef0e1293323aa32c66d0e3617dcristy { 2529263771792ed48bef0e1293323aa32c66d0e3617dcristy (void) WriteBlobMSBLong(image,(unsigned int) length); 2530263771792ed48bef0e1293323aa32c66d0e3617dcristy (void) WriteBlob(image,length,compress_pixels); 2531263771792ed48bef0e1293323aa32c66d0e3617dcristy } 2532263771792ed48bef0e1293323aa32c66d0e3617dcristy } while (lzma_info.avail_in != 0); 25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2536263771792ed48bef0e1293323aa32c66d0e3617dcristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 2537263771792ed48bef0e1293323aa32c66d0e3617dcristy case LZWCompression: 2538263771792ed48bef0e1293323aa32c66d0e3617dcristy case ZipCompression: 25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2540263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.next_in=pixels; 2541263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.avail_in=(uInt) (packet_size*image->columns); 2542deec0c22aa898ec2490b3830147f359487913a64cristy (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info, 2543deec0c22aa898ec2490b3830147f359487913a64cristy quantum_type,pixels,exception); 25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 25453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25463a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 25473a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 25483a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2549263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.next_out=compress_pixels; 2550263771792ed48bef0e1293323aa32c66d0e3617dcristy zip_info.avail_out=(uInt) ZipMaxExtent(packet_size*image->columns); 2551263771792ed48bef0e1293323aa32c66d0e3617dcristy code=deflate(&zip_info,Z_SYNC_FLUSH); 2552263771792ed48bef0e1293323aa32c66d0e3617dcristy if (code != Z_OK) 2553263771792ed48bef0e1293323aa32c66d0e3617dcristy status=MagickFalse; 2554263771792ed48bef0e1293323aa32c66d0e3617dcristy length=(size_t) (zip_info.next_out-compress_pixels); 25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length != 0) 25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBLong(image,(unsigned int) length); 25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,compress_pixels); 25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2560263771792ed48bef0e1293323aa32c66d0e3617dcristy } while (zip_info.avail_in != 0); 25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 25643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case RLECompression: 25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25664c08aed51c5899665ade97263692328eea4af106cristy length=0; 2567803640d20a6a664315eddfff6f8531d0c5e0871dcristy GetPixelInfoPixel(image,p,&pixel); 2568ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 25694c08aed51c5899665ade97263692328eea4af106cristy for (x=1; x < (ssize_t) image->columns; x++) 25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2571803640d20a6a664315eddfff6f8531d0c5e0871dcristy GetPixelInfoPixel(image,p,&target); 25724c08aed51c5899665ade97263692328eea4af106cristy if ((length < 255) && 25734c08aed51c5899665ade97263692328eea4af106cristy (IsPixelInfoEquivalent(&pixel,&target) != MagickFalse)) 25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length++; 25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2577c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy q=PopRunlengthPacket(image,q,length,&pixel,exception); 25783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=0; 25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2580803640d20a6a664315eddfff6f8531d0c5e0871dcristy GetPixelInfoPixel(image,p,&pixel); 2581ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy p+=GetPixelChannels(image); 25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2583c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy q=PopRunlengthPacket(image,q,length,&pixel,exception); 25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) (q-pixels),pixels); 25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2589deec0c22aa898ec2490b3830147f359487913a64cristy (void) ExportQuantumPixels(image,(CacheView *) NULL,quantum_info, 2590deec0c22aa898ec2490b3830147f359487913a64cristy quantum_type,pixels,exception); 25913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,packet_size*image->columns,pixels); 25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2595cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy if (image->previous == (Image *) NULL) 2596cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy { 2597cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, 2598cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy image->rows); 2599cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy if (status == MagickFalse) 2600cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy break; 2601cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy } 26023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2603330af6c00116155c122d0f4d697c176bbcc31768cristy switch (compression) 2604330af6c00116155c122d0f4d697c176bbcc31768cristy { 2605330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_BZLIB_DELEGATE) 2606330af6c00116155c122d0f4d697c176bbcc31768cristy case BZipCompression: 2607330af6c00116155c122d0f4d697c176bbcc31768cristy { 26083a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 26093a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 26103a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2611330af6c00116155c122d0f4d697c176bbcc31768cristy for ( ; ; ) 2612330af6c00116155c122d0f4d697c176bbcc31768cristy { 2613330af6c00116155c122d0f4d697c176bbcc31768cristy if (status == MagickFalse) 2614330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2615330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.next_out=(char *) compress_pixels; 2616330af6c00116155c122d0f4d697c176bbcc31768cristy bzip_info.avail_out=(unsigned int) BZipMaxExtent(packet_size* 2617330af6c00116155c122d0f4d697c176bbcc31768cristy image->columns); 2618330af6c00116155c122d0f4d697c176bbcc31768cristy code=BZ2_bzCompress(&bzip_info,BZ_FINISH); 2619330af6c00116155c122d0f4d697c176bbcc31768cristy length=(size_t) (bzip_info.next_out-(char *) compress_pixels); 2620330af6c00116155c122d0f4d697c176bbcc31768cristy if (length != 0) 2621330af6c00116155c122d0f4d697c176bbcc31768cristy { 2622330af6c00116155c122d0f4d697c176bbcc31768cristy (void) WriteBlobMSBLong(image,(unsigned int) length); 2623330af6c00116155c122d0f4d697c176bbcc31768cristy (void) WriteBlob(image,length,compress_pixels); 2624330af6c00116155c122d0f4d697c176bbcc31768cristy } 2625330af6c00116155c122d0f4d697c176bbcc31768cristy if (code == BZ_STREAM_END) 2626330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2627330af6c00116155c122d0f4d697c176bbcc31768cristy } 2628330af6c00116155c122d0f4d697c176bbcc31768cristy code=BZ2_bzCompressEnd(&bzip_info); 2629330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != BZ_OK) 2630330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 2631330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2632330af6c00116155c122d0f4d697c176bbcc31768cristy } 2633330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 2634330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_LZMA_DELEGATE) 2635330af6c00116155c122d0f4d697c176bbcc31768cristy case LZMACompression: 2636330af6c00116155c122d0f4d697c176bbcc31768cristy { 26373a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 26383a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 26393a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2640330af6c00116155c122d0f4d697c176bbcc31768cristy for ( ; ; ) 2641330af6c00116155c122d0f4d697c176bbcc31768cristy { 2642330af6c00116155c122d0f4d697c176bbcc31768cristy if (status == MagickFalse) 2643330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2644330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info.next_out=compress_pixels; 2645330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_info.avail_out=packet_size*image->columns; 2646330af6c00116155c122d0f4d697c176bbcc31768cristy code=lzma_code(&lzma_info,LZMA_FINISH); 2647330af6c00116155c122d0f4d697c176bbcc31768cristy length=(size_t) (lzma_info.next_out-compress_pixels); 2648330af6c00116155c122d0f4d697c176bbcc31768cristy if (length > 6) 2649330af6c00116155c122d0f4d697c176bbcc31768cristy { 2650330af6c00116155c122d0f4d697c176bbcc31768cristy (void) WriteBlobMSBLong(image,(unsigned int) length); 2651330af6c00116155c122d0f4d697c176bbcc31768cristy (void) WriteBlob(image,length,compress_pixels); 2652330af6c00116155c122d0f4d697c176bbcc31768cristy } 2653330af6c00116155c122d0f4d697c176bbcc31768cristy if (code == LZMA_STREAM_END) 2654330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2655330af6c00116155c122d0f4d697c176bbcc31768cristy } 2656330af6c00116155c122d0f4d697c176bbcc31768cristy lzma_end(&lzma_info); 2657330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2658330af6c00116155c122d0f4d697c176bbcc31768cristy } 2659330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 2660330af6c00116155c122d0f4d697c176bbcc31768cristy#if defined(MAGICKCORE_ZLIB_DELEGATE) 2661330af6c00116155c122d0f4d697c176bbcc31768cristy case LZWCompression: 2662330af6c00116155c122d0f4d697c176bbcc31768cristy case ZipCompression: 2663330af6c00116155c122d0f4d697c176bbcc31768cristy { 26643a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy int 26653a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy code; 26663a99dcf3776e0bd61aaf98ff01e6e9621a9156c2cristy 2667330af6c00116155c122d0f4d697c176bbcc31768cristy for ( ; ; ) 2668330af6c00116155c122d0f4d697c176bbcc31768cristy { 2669330af6c00116155c122d0f4d697c176bbcc31768cristy if (status == MagickFalse) 2670330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2671330af6c00116155c122d0f4d697c176bbcc31768cristy zip_info.next_out=compress_pixels; 2672c3ca81bfe9830392ae5f82da41219932f0d501e8cristy zip_info.avail_out=(uInt) ZipMaxExtent(packet_size*image->columns); 2673330af6c00116155c122d0f4d697c176bbcc31768cristy code=deflate(&zip_info,Z_FINISH); 2674330af6c00116155c122d0f4d697c176bbcc31768cristy length=(size_t) (zip_info.next_out-compress_pixels); 2675330af6c00116155c122d0f4d697c176bbcc31768cristy if (length > 6) 2676330af6c00116155c122d0f4d697c176bbcc31768cristy { 2677330af6c00116155c122d0f4d697c176bbcc31768cristy (void) WriteBlobMSBLong(image,(unsigned int) length); 2678330af6c00116155c122d0f4d697c176bbcc31768cristy (void) WriteBlob(image,length,compress_pixels); 2679330af6c00116155c122d0f4d697c176bbcc31768cristy } 2680330af6c00116155c122d0f4d697c176bbcc31768cristy if (code == Z_STREAM_END) 2681330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2682330af6c00116155c122d0f4d697c176bbcc31768cristy } 2683330af6c00116155c122d0f4d697c176bbcc31768cristy code=deflateEnd(&zip_info); 2684330af6c00116155c122d0f4d697c176bbcc31768cristy if (code != Z_OK) 2685330af6c00116155c122d0f4d697c176bbcc31768cristy status=MagickFalse; 2686330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2687330af6c00116155c122d0f4d697c176bbcc31768cristy } 2688330af6c00116155c122d0f4d697c176bbcc31768cristy#endif 2689330af6c00116155c122d0f4d697c176bbcc31768cristy default: 2690330af6c00116155c122d0f4d697c176bbcc31768cristy break; 2691330af6c00116155c122d0f4d697c176bbcc31768cristy } 26923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info=DestroyQuantumInfo(quantum_info); 26933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compress_pixels=(unsigned char *) RelinquishMagickMemory(compress_pixels); 26943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 26976ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy status=SetImageProgress(image,SaveImagesTag,scene++,GetImageListLength( 26986ffac4f82693ad89a3bee1bb27047f3b8bf03ba0Cristy image)); 26993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 27003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 27013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (image_info->adjoin != MagickFalse); 27023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 27033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 27043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 2705