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