13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            PPPP   SSSSS  22222                              %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            P   P  SS        22                              %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            PPPP    SSS    222                               %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            P         SS  22                                 %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            P      SSSSS  22222                              %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                      Write Postscript Level II 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/compress.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/constitute.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/draw.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/geometry.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h"
664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/resource_.h"
684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
714c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/utility.h"
72809758622d7d1135d333c5394ce4edd4b4c3f150cristy
73809758622d7d1135d333c5394ce4edd4b4c3f150cristy/*
74809758622d7d1135d333c5394ce4edd4b4c3f150cristy  Define declarations.
75809758622d7d1135d333c5394ce4edd4b4c3f150cristy*/
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_TIFF_DELEGATE)
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CCITTParam  "-1"
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define CCITTParam  "0"
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
861e178e70fb3c956f9fc1e30c3ba863e882666465cristy  WritePS2Image(const ImageInfo *,Image *,ExceptionInfo *);
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r P S 2 I m a g e                                           %
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterPS2Image() adds properties for the PS2 image format to
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The properties include the image format
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterPS2Image method is:
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
108bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterPS2Image(void)
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
111bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterPS2Image(void)
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11606b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("PS2","EPS2","Level II Encapsulated PostScript");
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WritePS2Image;
11808e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
11908e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderSeekableStreamFlag;
1205aefbeb81737693a3f7acf34330f140c64ebe381cristy  entry->mime_type=ConstantString("application/postscript");
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
12206b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("PS2","PS2","Level II PostScript");
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WritePS2Image;
12408e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderSeekableStreamFlag;
1255aefbeb81737693a3f7acf34330f140c64ebe381cristy  entry->mime_type=ConstantString("application/postscript");
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r P S 2 I m a g e                                       %
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterPS2Image() removes format registrations made by the
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PS2 module from the list of supported formats.
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterPS2Image method is:
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterPS2Image(void)
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterPS2Image(void)
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("EPS2");
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("PS2");
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   W r i t e P S 2 I m a g e                                                 %
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WritePS2Image translates an image to encapsulated Postscript
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Level II for printing.  If the supplied geometry is null, the image is
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  centered on the Postscript page.  Otherwise, the image is positioned as
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  specified by the geometry.
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the WritePS2Image method is:
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1731e178e70fb3c956f9fc1e30c3ba863e882666465cristy%      MagickBooleanType WritePS2Image(const ImageInfo *image_info,
1741e178e70fb3c956f9fc1e30c3ba863e882666465cristy%        Image *image,ExceptionInfo *exception)
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1821e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o exception: return any errors or warnings in this structure.
1831e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
18547b838c54284694d178fd59bf14baf5d9268875ccristy
18647b838c54284694d178fd59bf14baf5d9268875ccristystatic MagickBooleanType Huffman2DEncodeImage(const ImageInfo *image_info,
187018f07f7333b25743d0afff892450cebdb905c1acristy  Image *image,Image *inject_image,ExceptionInfo *exception)
18847b838c54284694d178fd59bf14baf5d9268875ccristy{
18947b838c54284694d178fd59bf14baf5d9268875ccristy  Image
190809758622d7d1135d333c5394ce4edd4b4c3f150cristy    *group4_image;
19147b838c54284694d178fd59bf14baf5d9268875ccristy
19247b838c54284694d178fd59bf14baf5d9268875ccristy  ImageInfo
19347b838c54284694d178fd59bf14baf5d9268875ccristy    *write_info;
19447b838c54284694d178fd59bf14baf5d9268875ccristy
19547b838c54284694d178fd59bf14baf5d9268875ccristy  MagickBooleanType
19647b838c54284694d178fd59bf14baf5d9268875ccristy    status;
19747b838c54284694d178fd59bf14baf5d9268875ccristy
198809758622d7d1135d333c5394ce4edd4b4c3f150cristy  size_t
199809758622d7d1135d333c5394ce4edd4b4c3f150cristy    length;
20047b838c54284694d178fd59bf14baf5d9268875ccristy
20147b838c54284694d178fd59bf14baf5d9268875ccristy  unsigned char
202809758622d7d1135d333c5394ce4edd4b4c3f150cristy    *group4;
20347b838c54284694d178fd59bf14baf5d9268875ccristy
20442751fe3c232b8c71613932551099cb49be2971acristy  status=MagickTrue;
20547b838c54284694d178fd59bf14baf5d9268875ccristy  write_info=CloneImageInfo(image_info);
206151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(write_info->filename,"GROUP4:",MagickPathExtent);
207151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) CopyMagickString(write_info->magick,"GROUP4",MagickPathExtent);
208018f07f7333b25743d0afff892450cebdb905c1acristy  group4_image=CloneImage(inject_image,0,0,MagickTrue,exception);
209809758622d7d1135d333c5394ce4edd4b4c3f150cristy  if (group4_image == (Image *) NULL)
210809758622d7d1135d333c5394ce4edd4b4c3f150cristy    return(MagickFalse);
211809758622d7d1135d333c5394ce4edd4b4c3f150cristy  group4=(unsigned char *) ImageToBlob(write_info,group4_image,&length,
212018f07f7333b25743d0afff892450cebdb905c1acristy    exception);
213809758622d7d1135d333c5394ce4edd4b4c3f150cristy  group4_image=DestroyImage(group4_image);
214809758622d7d1135d333c5394ce4edd4b4c3f150cristy  if (group4 == (unsigned char *) NULL)
215809758622d7d1135d333c5394ce4edd4b4c3f150cristy    return(MagickFalse);
21647b838c54284694d178fd59bf14baf5d9268875ccristy  write_info=DestroyImageInfo(write_info);
217809758622d7d1135d333c5394ce4edd4b4c3f150cristy  if (WriteBlob(image,length,group4) != (ssize_t) length)
218809758622d7d1135d333c5394ce4edd4b4c3f150cristy    status=MagickFalse;
219809758622d7d1135d333c5394ce4edd4b4c3f150cristy  group4=(unsigned char *) RelinquishMagickMemory(group4);
220809758622d7d1135d333c5394ce4edd4b4c3f150cristy  return(status);
22147b838c54284694d178fd59bf14baf5d9268875ccristy}
22247b838c54284694d178fd59bf14baf5d9268875ccristy
2231e178e70fb3c956f9fc1e30c3ba863e882666465cristystatic MagickBooleanType WritePS2Image(const ImageInfo *image_info,Image *image,
2241e178e70fb3c956f9fc1e30c3ba863e882666465cristy  ExceptionInfo *exception)
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
227629f80558ba1e82b0317a3d778deaf195c8e37e5Cristy    *const PostscriptProlog[]=
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "%%%%BeginProlog",
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "%%",
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "%% Display a color image.  The image is displayed in color on",
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "%% Postscript viewers or printers that support color, otherwise",
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "%% it is displayed as grayscale.",
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "%%",
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "/DirectClassImage",
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "{",
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %% Display a DirectClass image.",
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  colorspace 0 eq",
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  {",
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    /DeviceRGB setcolorspace",
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    <<",
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageType 1",
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Width columns",
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Height rows",
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /BitsPerComponent 8",
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Decode [0 1 0 1 0 1]",
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      compression 0 gt",
251809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "      { /DataSource pixel_stream %s }",
252809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "      { /DataSource pixel_stream %s } ifelse",
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    >> image",
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  }",
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  {",
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    /DeviceCMYK setcolorspace",
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    <<",
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageType 1",
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Width columns",
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Height rows",
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /BitsPerComponent 8",
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Decode [1 0 1 0 1 0 1 0]",
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      compression 0 gt",
265809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "      { /DataSource pixel_stream %s }",
266809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "      { /DataSource pixel_stream %s } ifelse",
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    >> image",
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  } ifelse",
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "} bind def",
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "",
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "/PseudoClassImage",
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "{",
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %% Display a PseudoClass image.",
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %% Parameters:",
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   colors: number of colors in the colormap.",
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /colors exch def pop",
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  colors 0 eq",
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  {",
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    %%",
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    %% Image is grayscale.",
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    %%",
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    currentfile buffer readline pop",
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    token pop /bits exch def pop",
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    /DeviceGray setcolorspace",
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    <<",
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageType 1",
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Width columns",
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Height rows",
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /BitsPerComponent bits",
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Decode [0 1]",
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      compression 0 gt",
297809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "      { /DataSource pixel_stream %s }",
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      {",
299809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "        /DataSource pixel_stream %s",
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "        <<",
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "           /K "CCITTParam,
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "           /Columns columns",
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "           /Rows rows",
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "        >> /CCITTFaxDecode filter",
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      } ifelse",
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    >> image",
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  }",
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  {",
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    %%",
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    %% Parameters:",
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    %%   colormap: red, green, blue color packets.",
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    %%",
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    /colormap colors 3 mul string def",
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    currentfile colormap readhexstring pop pop",
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    currentfile buffer readline pop",
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    [ /Indexed /DeviceRGB colors 1 sub colormap ] setcolorspace",
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    <<",
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageType 1",
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Width columns",
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Height rows",
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /BitsPerComponent 8",
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /Decode [0 255]",
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      /ImageMatrix [columns 0 0 rows neg 0 rows]",
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "      compression 0 gt",
325809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "      { /DataSource pixel_stream %s }",
326809758622d7d1135d333c5394ce4edd4b4c3f150cristy      "      { /DataSource pixel_stream %s } ifelse",
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "    >> image",
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  } ifelse",
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "} bind def",
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "",
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "/DisplayImage",
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "{",
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %% Display a DirectClass or PseudoClass image.",
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %% Parameters:",
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   x & y translation.",
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   x & y scale.",
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   label pointsize.",
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   image label.",
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   image columns & rows.",
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   class: 0-DirectClass or 1-PseudoClass.",
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   colorspace: 0-RGB or 1-CMYK.",
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   compression: 0-RLECompression or 1-NoCompression.",
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%   hex color packets.",
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  %%",
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  gsave",
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  /buffer 512 string def",
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  /pixel_stream currentfile def",
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "",
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /x exch def",
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /y exch def pop",
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  x y translate",
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /x exch def",
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /y exch def pop",
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /pointsize exch def pop",
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  /Helvetica findfont pointsize scalefont setfont",
361629f80558ba1e82b0317a3d778deaf195c8e37e5Cristy      (const char *) NULL
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    },
363629f80558ba1e82b0317a3d778deaf195c8e37e5Cristy    *const PostscriptEpilog[]=
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  x y scale",
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /columns exch def",
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /rows exch def pop",
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /class exch def pop",
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /colorspace exch def pop",
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  currentfile buffer readline pop",
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  token pop /compression exch def pop",
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "  class 0 gt { PseudoClassImage } { DirectClassImage } ifelse",
3768b4ff226f4bd96875f113eccedaa435e5486cb57cristy      "  grestore",
377629f80558ba1e82b0317a3d778deaf195c8e37e5Cristy      (const char *) NULL
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
381151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    buffer[MagickPathExtent],
382151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    date[MagickPathExtent],
383151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    page_geometry[MagickPathExtent],
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **labels;
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  CompressionType
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    compression;
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
390629f80558ba1e82b0317a3d778deaf195c8e37e5Cristy    *const *q,
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *value;
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  double
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pointsize;
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  GeometryInfo
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    geometry_info;
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickOffsetType
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scene,
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    start,
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stop;
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    progress,
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickOffsetType
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    offset;
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickSizeType
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_pixels;
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickStatusType
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    flags;
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  PointInfo
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delta,
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    resolution,
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scale;
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RectangleInfo
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    geometry,
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    media_info,
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    page_info;
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4274c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
430bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
433bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SegmentInfo
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bounds;
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
440802d364f093d693396e7052869766dd9fbe4d94bcristy    length,
441802d364f093d693396e7052869766dd9fbe4d94bcristy    page,
442802d364f093d693396e7052869766dd9fbe4d94bcristy    text_size;
443802d364f093d693396e7052869766dd9fbe4d94bcristy
444802d364f093d693396e7052869766dd9fbe4d94bcristy  ssize_t
445802d364f093d693396e7052869766dd9fbe4d94bcristy    j,
446802d364f093d693396e7052869766dd9fbe4d94bcristy    y;
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  time_t
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    timer;
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open output image file.
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
458e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
460e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
4633a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception != (ExceptionInfo *) NULL);
464e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
4651e178e70fb3c956f9fc1e30c3ba863e882666465cristy  status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
468af8d391906d11f0a1f2bbf4e2adbc4995c852d33cristy  compression=image->compression;
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->compression != UndefinedCompression)
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    compression=image_info->compression;
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (compression)
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(MAGICKCORE_JPEG_DELEGATE)
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case JPEGCompression:
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      compression=RLECompression;
4771e178e70fb3c956f9fc1e30c3ba863e882666465cristy      (void) ThrowMagickException(exception,GetMagickModule(),
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MissingDelegateError,"DelegateLibrarySupportNotBuiltIn","`%s' (JPEG)",
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&bounds,0,sizeof(bounds));
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  page=1;
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scene=0;
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Scale relative to dots-per-inch.
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delta.x=DefaultResolution;
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    delta.y=DefaultResolution;
4962a11befa48257796843468409d77bb8cfb129cdccristy    resolution.x=image->resolution.x;
4972a11befa48257796843468409d77bb8cfb129cdccristy    resolution.y=image->resolution.y;
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((resolution.x == 0.0) || (resolution.y == 0.0))
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags=ParseGeometry(PSDensityGeometry,&geometry_info);
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resolution.x=geometry_info.rho;
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resolution.y=geometry_info.sigma;
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((flags & SigmaValue) == 0)
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resolution.y=resolution.x;
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image_info->density != (char *) NULL)
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags=ParseGeometry(image_info->density,&geometry_info);
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resolution.x=geometry_info.rho;
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        resolution.y=geometry_info.sigma;
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((flags & SigmaValue) == 0)
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          resolution.y=resolution.x;
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->units == PixelsPerCentimeterResolution)
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
516bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        resolution.x=(size_t) (100.0*2.54*resolution.x+0.5)/100.0;
517bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        resolution.y=(size_t) (100.0*2.54*resolution.y+0.5)/100.0;
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    SetGeometry(image,&geometry);
520151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(page_geometry,MagickPathExtent,"%.20gx%.20g",
521e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy      (double) image->columns,(double) image->rows);
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image_info->page != (char *) NULL)
523151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) CopyMagickString(page_geometry,image_info->page,MagickPathExtent);
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((image->page.width != 0) && (image->page.height != 0))
526151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(page_geometry,MagickPathExtent,
527e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy          "%.20gx%.20g%+.20g%+.20g",(double) image->page.width,(double)
528e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy          image->page.height,(double) image->page.x,(double) image->page.y);
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->gravity != UndefinedGravity) &&
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (LocaleCompare(image_info->magick,"PS") == 0))
532151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) CopyMagickString(page_geometry,PSPageGeometry,MagickPathExtent);
533151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) ConcatenateMagickString(page_geometry,">",MagickPathExtent);
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) ParseMetaGeometry(page_geometry,&geometry.x,&geometry.y,
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      &geometry.width,&geometry.height);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scale.x=(double) (geometry.width*delta.x)/resolution.x;
537bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    geometry.width=(size_t) floor(scale.x+0.5);
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scale.y=(double) (geometry.height*delta.y)/resolution.y;
539bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    geometry.height=(size_t) floor(scale.y+0.5);
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) ParseAbsoluteGeometry(page_geometry,&media_info);
5411e178e70fb3c956f9fc1e30c3ba863e882666465cristy    (void) ParseGravityGeometry(image,page_geometry,&page_info,exception);
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->gravity != UndefinedGravity)
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        geometry.x=(-page_info.x);
545bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        geometry.y=(ssize_t) (media_info.height+page_info.y-image->rows);
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    pointsize=12.0;
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image_info->pointsize != 0.0)
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pointsize=image_info->pointsize;
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text_size=0;
551d15e65928aec551b7388c2863de3e3e628e2e0ddcristy    value=GetImageProperty(image,"label",exception);
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (value != (const char *) NULL)
553bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      text_size=(size_t) (MultilineCensus(value)*pointsize+12);
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (page == 1)
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Output Postscript header.
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(image_info->magick,"PS2") == 0)
560151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) CopyMagickString(buffer,"%!PS-Adobe-3.0\n",MagickPathExtent);
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(buffer,"%!PS-Adobe-3.0 EPSF-3.0\n",
563151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            MagickPathExtent);
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,buffer);
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"%%Creator: (ImageMagick)\n");
566151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(buffer,MagickPathExtent,"%%%%Title: (%s)\n",
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->filename);
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,buffer);
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        timer=time((time_t *) NULL);
570151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatMagickTime(timer,MagickPathExtent,date);
571151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(buffer,MagickPathExtent,
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "%%%%CreationDate: (%s)\n",date);
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,buffer);
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bounds.x1=(double) geometry.x;
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bounds.y1=(double) geometry.y;
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bounds.x2=(double) geometry.x+geometry.width;
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bounds.y2=(double) geometry.y+geometry.height+text_size;
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image_info->adjoin != MagickFalse) &&
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (GetNextImageInList(image) != (Image *) NULL))
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) CopyMagickString(buffer,"%%BoundingBox: (atend)\n",
581151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            MagickPathExtent);
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
584151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) FormatLocaleString(buffer,MagickPathExtent,
585e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy              "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5),
5868071c47b0ca8f471cbd6175e0f2e45739983bf4ecristy              ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5));
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,buffer);
588151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) FormatLocaleString(buffer,MagickPathExtent,
589e7f5109f30fc7242d04a26174a9138483dda5b6acristy              "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,
5908cd5b3193212b4aebce08c4e7afbb66b09778029cristy              bounds.y1,bounds.x2,bounds.y2);
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,buffer);
593d15e65928aec551b7388c2863de3e3e628e2e0ddcristy        value=GetImageProperty(image,"label",exception);
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (value != (const char *) NULL)
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            "%%DocumentNeededResources: font Helvetica\n");
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"%%LanguageLevel: 2\n");
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(image_info->magick,"PS2") != 0)
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,"%%Pages: 1\n");
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,"%%Orientation: Portrait\n");
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,"%%PageOrder: Ascend\n");
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (image_info->adjoin == MagickFalse)
605151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) CopyMagickString(buffer,"%%Pages: 1\n",MagickPathExtent);
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
607151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) FormatLocaleString(buffer,MagickPathExtent,
608e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy                "%%%%Pages: %.20g\n",(double) GetImageListLength(image));
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,buffer);
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
61157219ffb10215e3894a1ebe2035a2c97e84d2a52cristy        if (image->colorspace == CMYKColorspace)
61257219ffb10215e3894a1ebe2035a2c97e84d2a52cristy          (void) WriteBlobString(image,
61357219ffb10215e3894a1ebe2035a2c97e84d2a52cristy            "%%DocumentProcessColors: Cyan Magenta Yellow Black\n");
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"%%EndComments\n");
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"\n%%BeginDefaults\n");
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"%%EndDefaults\n\n");
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Output Postscript commands.
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q=PostscriptProlog; *q; q++)
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch (compression)
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case NoCompression:
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
626151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) FormatLocaleString(buffer,MagickPathExtent,*q,
627809758622d7d1135d333c5394ce4edd4b4c3f150cristy                "/ASCII85Decode filter");
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case JPEGCompression:
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
632151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) FormatLocaleString(buffer,MagickPathExtent,*q,
633809758622d7d1135d333c5394ce4edd4b4c3f150cristy                "/DCTDecode filter");
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case LZWCompression:
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
638151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) FormatLocaleString(buffer,MagickPathExtent,*q,
639809758622d7d1135d333c5394ce4edd4b4c3f150cristy                "/LZWDecode filter");
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case FaxCompression:
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case Group4Compression:
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
645151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) FormatLocaleString(buffer,MagickPathExtent,*q," ");
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
650151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy              (void) FormatLocaleString(buffer,MagickPathExtent,*q,
651809758622d7d1135d333c5394ce4edd4b4c3f150cristy                "/RunLengthDecode filter");
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobByte(image,'\n');
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
658d15e65928aec551b7388c2863de3e3e628e2e0ddcristy        value=GetImageProperty(image,"label",exception);
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (value != (const char *) NULL)
660bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (j=(ssize_t) MultilineCensus(value)-1; j >= 0; j--)
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,"  /label 512 string def\n");
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,"  currentfile label readline pop\n");
664151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) FormatLocaleString(buffer,MagickPathExtent,
665e7f5109f30fc7242d04a26174a9138483dda5b6acristy              "  0 y %g add moveto label show pop\n",j*pointsize+12);
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,buffer);
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (q=PostscriptEpilog; *q; q++)
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
670151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(buffer,MagickPathExtent,"%s\n",*q);
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (LocaleCompare(image_info->magick,"PS2") == 0)
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,"  showpage\n");
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"} bind def\n");
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"%%EndProlog\n");
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
678151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent,"%%%%Page:  1 %.20g\n",
679e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy      (double) page++);
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
681151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent,
682e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy      "%%%%PageBoundingBox: %.20g %.20g %.20g %.20g\n",(double) geometry.x,
683e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy      (double) geometry.y,geometry.x+(double) geometry.width,geometry.y+(double)
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (geometry.height+text_size));
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((double) geometry.x < bounds.x1)
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bounds.x1=(double) geometry.x;
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((double) geometry.y < bounds.y1)
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bounds.y1=(double) geometry.y;
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((double) (geometry.x+geometry.width-1) > bounds.x2)
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bounds.x2=(double) geometry.x+geometry.width-1;
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((double) (geometry.y+(geometry.height+text_size)-1) > bounds.y2)
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bounds.y2=(double) geometry.y+(geometry.height+text_size)-1;
694d15e65928aec551b7388c2863de3e3e628e2e0ddcristy    value=GetImageProperty(image,"label",exception);
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (value != (const char *) NULL)
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlobString(image,"%%PageResources: font Times-Roman\n");
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(image_info->magick,"PS2") != 0)
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlobString(image,"userdict begin\n");
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    start=TellBlob(image);
700151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent,
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "%%%%BeginData:%13ld %s Bytes\n",0L,
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      compression == NoCompression ? "ASCII" : "Binary");
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stop=TellBlob(image);
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,"DisplayImage\n");
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Output image data.
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
709151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent,"%.20g %.20g\n%g %g\n%g\n",
710e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy      (double) geometry.x,(double) geometry.y,scale.x,scale.y,pointsize);
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    labels=(char **) NULL;
713d15e65928aec551b7388c2863de3e3e628e2e0ddcristy    value=GetImageProperty(image,"label",exception);
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (value != (const char *) NULL)
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      labels=StringToList(value);
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (labels != (char **) NULL)
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i=0; labels[i] != (char *) NULL; i++)
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
720151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(buffer,MagickPathExtent,"%s \n",
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            labels[i]);
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          labels[i]=DestroyString(labels[i]);
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        labels=(char **) RelinquishMagickMemory(labels);
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_pixels=(MagickSizeType) image->columns*image->rows;
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (number_pixels != (MagickSizeType) ((size_t) number_pixels))
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((compression == FaxCompression) || (compression == Group4Compression) ||
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ((image_info->type != TrueColorType) &&
732f1d8548abecaf5ca89d453fd9fc0cde77d20672bdirk         (SetImageGray(image,exception) != MagickFalse)))
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
734151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(buffer,MagickPathExtent,"%.20g %.20g\n1\n%d\n",
735e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy          (double) image->columns,(double) image->rows,(int)
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (image->colorspace == CMYKColorspace));
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,buffer);
738151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(buffer,MagickPathExtent,"%d\n",
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (int) ((compression != FaxCompression) &&
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (compression != Group4Compression)));
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,buffer);
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,"0\n");
743151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        (void) FormatLocaleString(buffer,MagickPathExtent,"%d\n",
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (compression == FaxCompression) ||
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           (compression == Group4Compression) ? 1 : 8);
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlobString(image,buffer);
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        switch (compression)
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case FaxCompression:
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case Group4Compression:
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (LocaleCompare(CCITTParam,"0") == 0)
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
754018f07f7333b25743d0afff892450cebdb905c1acristy                (void) HuffmanEncodeImage(image_info,image,image,exception);
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
757018f07f7333b25743d0afff892450cebdb905c1acristy            (void) Huffman2DEncodeImage(image_info,image,image,exception);
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case JPEGCompression:
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7621e178e70fb3c956f9fc1e30c3ba863e882666465cristy            status=InjectImageBlob(image_info,image,image,"jpeg",exception);
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
7641e178e70fb3c956f9fc1e30c3ba863e882666465cristy              {
7651e178e70fb3c956f9fc1e30c3ba863e882666465cristy                (void) CloseBlob(image);
7661e178e70fb3c956f9fc1e30c3ba863e882666465cristy                return(MagickFalse);
7671e178e70fb3c956f9fc1e30c3ba863e882666465cristy              }
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case RLECompression:
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          default:
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
773b64823d5e9d6def353c863a1464867f1bf5caca5cristy            MemoryInfo
774b64823d5e9d6def353c863a1464867f1bf5caca5cristy              *pixel_info;
775b64823d5e9d6def353c863a1464867f1bf5caca5cristy
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            register unsigned char
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q;
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Allocate pixel array.
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            length=(size_t) number_pixels;
783b64823d5e9d6def353c863a1464867f1bf5caca5cristy            pixel_info=AcquireVirtualMemory(length,sizeof(*pixels));
784b64823d5e9d6def353c863a1464867f1bf5caca5cristy            if (pixel_info == (MemoryInfo *) NULL)
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
786b64823d5e9d6def353c863a1464867f1bf5caca5cristy            pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info);
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
788b64823d5e9d6def353c863a1464867f1bf5caca5cristy              Dump runlength encoded pixels.
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            q=pixels;
791bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (y=0; y < (ssize_t) image->rows; y++)
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
7931e178e70fb3c956f9fc1e30c3ba863e882666465cristy              p=GetVirtualPixels(image,0,y,image->columns,1,exception);
7944c08aed51c5899665ade97263692328eea4af106cristy              if (p == (const Quantum *) NULL)
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
796bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (x=0; x < (ssize_t) image->columns; x++)
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
798d0323229686850da53ca53c231371ee385b055fccristy                *q++=ScaleQuantumToChar(ClampToQuantum(GetPixelLuma(image,p)));
799ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                p+=GetPixelChannels(image);
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
801802d364f093d693396e7052869766dd9fbe4d94bcristy              progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
802802d364f093d693396e7052869766dd9fbe4d94bcristy                image->rows);
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (progress == MagickFalse)
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            length=(size_t) (q-pixels);
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (compression == LZWCompression)
808018f07f7333b25743d0afff892450cebdb905c1acristy              status=LZWEncodeImage(image,length,pixels,exception);
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
810018f07f7333b25743d0afff892450cebdb905c1acristy              status=PackbitsEncodeImage(image,length,pixels,exception);
811b64823d5e9d6def353c863a1464867f1bf5caca5cristy            pixel_info=RelinquishVirtualMemory(pixel_info);
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) CloseBlob(image);
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                return(MagickFalse);
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case NoCompression:
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Dump uncompressed PseudoColor packets.
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Ascii85Initialize(image);
825bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (y=0; y < (ssize_t) image->rows; y++)
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8271e178e70fb3c956f9fc1e30c3ba863e882666465cristy              p=GetVirtualPixels(image,0,y,image->columns,1,exception);
8284c08aed51c5899665ade97263692328eea4af106cristy              if (p == (const Quantum *) NULL)
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
830bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (x=0; x < (ssize_t) image->columns; x++)
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
832d0323229686850da53ca53c231371ee385b055fccristy                Ascii85Encode(image,ScaleQuantumToChar(ClampToQuantum(
833d0323229686850da53ca53c231371ee385b055fccristy                  GetPixelLuma(image,p))));
834ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                p+=GetPixelChannels(image);
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
836e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy              progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType)
837e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy                y,image->rows);
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (progress == MagickFalse)
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Ascii85Flush(image);
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((image->storage_class == DirectClass) || (image->colors > 256) ||
84817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy          (compression == JPEGCompression) || (image->alpha_trait != UndefinedPixelTrait))
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
850151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(buffer,MagickPathExtent,"%.20g %.20g\n0\n%d\n",
851e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy            (double) image->columns,(double) image->rows,(int)
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (image->colorspace == CMYKColorspace));
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
854151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(buffer,MagickPathExtent,"%d\n",
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (int) (compression == NoCompression));
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch (compression)
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case JPEGCompression:
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8611e178e70fb3c956f9fc1e30c3ba863e882666465cristy              status=InjectImageBlob(image_info,image,image,"jpeg",exception);
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (status == MagickFalse)
8631e178e70fb3c956f9fc1e30c3ba863e882666465cristy                {
8641e178e70fb3c956f9fc1e30c3ba863e882666465cristy                  (void) CloseBlob(image);
8651e178e70fb3c956f9fc1e30c3ba863e882666465cristy                  return(MagickFalse);
8661e178e70fb3c956f9fc1e30c3ba863e882666465cristy                }
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case RLECompression:
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
872b64823d5e9d6def353c863a1464867f1bf5caca5cristy              MemoryInfo
873b64823d5e9d6def353c863a1464867f1bf5caca5cristy                *pixel_info;
874b64823d5e9d6def353c863a1464867f1bf5caca5cristy
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              register unsigned char
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q;
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Allocate pixel array.
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length=(size_t) number_pixels;
882b64823d5e9d6def353c863a1464867f1bf5caca5cristy              pixel_info=AcquireVirtualMemory(length,4*sizeof(*pixels));
883b64823d5e9d6def353c863a1464867f1bf5caca5cristy              if (pixel_info == (MemoryInfo *) NULL)
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ThrowWriterException(ResourceLimitError,
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  "MemoryAllocationFailed");
886b64823d5e9d6def353c863a1464867f1bf5caca5cristy              pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info);
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
888b64823d5e9d6def353c863a1464867f1bf5caca5cristy                Dump runlength encoded pixels.
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              q=pixels;
891bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (y=0; y < (ssize_t) image->rows; y++)
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
8931e178e70fb3c956f9fc1e30c3ba863e882666465cristy                p=GetVirtualPixels(image,0,y,image->columns,1,exception);
8944c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
896bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                for (x=0; x < (ssize_t) image->columns; x++)
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
89817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy                  if ((image->alpha_trait != UndefinedPixelTrait) &&
8994c08aed51c5899665ade97263692328eea4af106cristy                      (GetPixelAlpha(image,p) == (Quantum) TransparentAlpha))
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
9016e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy                      *q++=ScaleQuantumToChar(QuantumRange);
9026e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy                      *q++=ScaleQuantumToChar(QuantumRange);
9036e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy                      *q++=ScaleQuantumToChar(QuantumRange);
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (image->colorspace != CMYKColorspace)
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
9084c08aed51c5899665ade97263692328eea4af106cristy                        *q++=ScaleQuantumToChar(GetPixelRed(image,p));
9094c08aed51c5899665ade97263692328eea4af106cristy                        *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
9104c08aed51c5899665ade97263692328eea4af106cristy                        *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
9144c08aed51c5899665ade97263692328eea4af106cristy                        *q++=ScaleQuantumToChar(GetPixelRed(image,p));
9154c08aed51c5899665ade97263692328eea4af106cristy                        *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
9164c08aed51c5899665ade97263692328eea4af106cristy                        *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
9174c08aed51c5899665ade97263692328eea4af106cristy                        *q++=ScaleQuantumToChar(GetPixelBlack(image,p));
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
919ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(image);
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
921802d364f093d693396e7052869766dd9fbe4d94bcristy                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType)
922802d364f093d693396e7052869766dd9fbe4d94bcristy                  y,image->rows);
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (progress == MagickFalse)
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length=(size_t) (q-pixels);
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (compression == LZWCompression)
928018f07f7333b25743d0afff892450cebdb905c1acristy                status=LZWEncodeImage(image,length,pixels,exception);
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
930018f07f7333b25743d0afff892450cebdb905c1acristy                status=PackbitsEncodeImage(image,length,pixels,exception);
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (status == MagickFalse)
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CloseBlob(image);
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  return(MagickFalse);
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
936b64823d5e9d6def353c863a1464867f1bf5caca5cristy              pixel_info=RelinquishVirtualMemory(pixel_info);
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case NoCompression:
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Dump uncompressed DirectColor packets.
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Ascii85Initialize(image);
945bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (y=0; y < (ssize_t) image->rows; y++)
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
9471e178e70fb3c956f9fc1e30c3ba863e882666465cristy                p=GetVirtualPixels(image,0,y,image->columns,1,exception);
9484c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
950bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                for (x=0; x < (ssize_t) image->columns; x++)
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
95217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy                  if ((image->alpha_trait != UndefinedPixelTrait) &&
9534c08aed51c5899665ade97263692328eea4af106cristy                      (GetPixelAlpha(image,p) == (Quantum) TransparentAlpha))
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Ascii85Encode(image,ScaleQuantumToChar((Quantum)
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        QuantumRange));
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Ascii85Encode(image,ScaleQuantumToChar((Quantum)
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        QuantumRange));
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      Ascii85Encode(image,ScaleQuantumToChar((Quantum)
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        QuantumRange));
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  else
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    if (image->colorspace != CMYKColorspace)
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
965802d364f093d693396e7052869766dd9fbe4d94bcristy                        Ascii85Encode(image,ScaleQuantumToChar(
9664c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelRed(image,p)));
967802d364f093d693396e7052869766dd9fbe4d94bcristy                        Ascii85Encode(image,ScaleQuantumToChar(
9684c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelGreen(image,p)));
969802d364f093d693396e7052869766dd9fbe4d94bcristy                        Ascii85Encode(image,ScaleQuantumToChar(
9704c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelBlue(image,p)));
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    else
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      {
974802d364f093d693396e7052869766dd9fbe4d94bcristy                        Ascii85Encode(image,ScaleQuantumToChar(
9754c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelRed(image,p)));
976802d364f093d693396e7052869766dd9fbe4d94bcristy                        Ascii85Encode(image,ScaleQuantumToChar(
9774c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelGreen(image,p)));
978802d364f093d693396e7052869766dd9fbe4d94bcristy                        Ascii85Encode(image,ScaleQuantumToChar(
9794c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelBlue(image,p)));
9809fff7b4fa7d657da7bfed66239982b85c6337de9cristy                        Ascii85Encode(image,ScaleQuantumToChar(
9814c08aed51c5899665ade97263692328eea4af106cristy                          GetPixelBlack(image,p)));
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      }
983ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(image);
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
985802d364f093d693396e7052869766dd9fbe4d94bcristy                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType)
986802d364f093d693396e7052869766dd9fbe4d94bcristy                  y,image->rows);
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (progress == MagickFalse)
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Ascii85Flush(image);
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Dump number of colors and colormap.
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
1000151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(buffer,MagickPathExtent,"%.20g %.20g\n1\n%d\n",
1001e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy            (double) image->columns,(double) image->rows,(int)
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (image->colorspace == CMYKColorspace));
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
1004151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(buffer,MagickPathExtent,"%d\n",
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (int) (compression == NoCompression));
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
1007151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy          (void) FormatLocaleString(buffer,MagickPathExtent,"%.20g\n",(double)
1008f2faecf9facdbbb14fcba373365f9f691a9658e0cristy            image->colors);
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlobString(image,buffer);
1010bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) image->colors; i++)
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1012151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy            (void) FormatLocaleString(buffer,MagickPathExtent,"%02X%02X%02X\n",
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToChar(image->colormap[i].red),
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToChar(image->colormap[i].green),
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              ScaleQuantumToChar(image->colormap[i].blue));
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobString(image,buffer);
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          switch (compression)
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case RLECompression:
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            default:
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
1023b64823d5e9d6def353c863a1464867f1bf5caca5cristy              MemoryInfo
1024b64823d5e9d6def353c863a1464867f1bf5caca5cristy                *pixel_info;
1025b64823d5e9d6def353c863a1464867f1bf5caca5cristy
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              register unsigned char
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q;
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Allocate pixel array.
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length=(size_t) number_pixels;
1033b64823d5e9d6def353c863a1464867f1bf5caca5cristy              pixel_info=AcquireVirtualMemory(length,sizeof(*pixels));
1034b64823d5e9d6def353c863a1464867f1bf5caca5cristy              if (pixel_info == (MemoryInfo *) NULL)
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ThrowWriterException(ResourceLimitError,
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  "MemoryAllocationFailed");
1037b64823d5e9d6def353c863a1464867f1bf5caca5cristy              pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info);
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
1039b64823d5e9d6def353c863a1464867f1bf5caca5cristy                Dump runlength encoded pixels.
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              q=pixels;
1042bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (y=0; y < (ssize_t) image->rows; y++)
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
10441e178e70fb3c956f9fc1e30c3ba863e882666465cristy                p=GetVirtualPixels(image,0,y,image->columns,1,exception);
10454c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
1047bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                for (x=0; x < (ssize_t) image->columns; x++)
10484c08aed51c5899665ade97263692328eea4af106cristy                {
10494c08aed51c5899665ade97263692328eea4af106cristy                  *q++=(unsigned char) GetPixelIndex(image,p);
1050ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(image);
10514c08aed51c5899665ade97263692328eea4af106cristy                }
1052802d364f093d693396e7052869766dd9fbe4d94bcristy                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType)
1053802d364f093d693396e7052869766dd9fbe4d94bcristy                  y,image->rows);
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (progress == MagickFalse)
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              length=(size_t) (q-pixels);
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (compression == LZWCompression)
1059018f07f7333b25743d0afff892450cebdb905c1acristy                status=LZWEncodeImage(image,length,pixels,exception);
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
1061018f07f7333b25743d0afff892450cebdb905c1acristy                status=PackbitsEncodeImage(image,length,pixels,exception);
1062b64823d5e9d6def353c863a1464867f1bf5caca5cristy              pixel_info=RelinquishVirtualMemory(pixel_info);
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (status == MagickFalse)
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) CloseBlob(image);
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  return(MagickFalse);
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            case NoCompression:
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              /*
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                Dump uncompressed PseudoColor packets.
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              */
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Ascii85Initialize(image);
1076bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              for (y=0; y < (ssize_t) image->rows; y++)
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
10781e178e70fb3c956f9fc1e30c3ba863e882666465cristy                p=GetVirtualPixels(image,0,y,image->columns,1,exception);
10794c08aed51c5899665ade97263692328eea4af106cristy                if (p == (const Quantum *) NULL)
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
1081bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                for (x=0; x < (ssize_t) image->columns; x++)
10824c08aed51c5899665ade97263692328eea4af106cristy                {
10834c08aed51c5899665ade97263692328eea4af106cristy                  Ascii85Encode(image,(unsigned char) GetPixelIndex(image,p));
1084ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                  p+=GetPixelChannels(image);
10854c08aed51c5899665ade97263692328eea4af106cristy                }
1086802d364f093d693396e7052869766dd9fbe4d94bcristy                progress=SetImageProgress(image,SaveImageTag,(MagickOffsetType)
1087802d364f093d693396e7052869766dd9fbe4d94bcristy                  y,image->rows);
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (progress == MagickFalse)
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Ascii85Flush(image);
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobByte(image,'\n');
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length=(size_t) (TellBlob(image)-stop);
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stop=TellBlob(image);
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    offset=SeekBlob(image,start,SEEK_SET);
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (offset < 0)
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowWriterException(CorruptImageError,"ImproperImageHeader");
1102151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    (void) FormatLocaleString(buffer,MagickPathExtent,
1103f2faecf9facdbbb14fcba373365f9f691a9658e0cristy      "%%%%BeginData:%13ld %s Bytes\n",(long) length,
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      compression == NoCompression ? "ASCII" : "Binary");
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,buffer);
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    offset=SeekBlob(image,stop,SEEK_SET);
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,"%%EndData\n");
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (LocaleCompare(image_info->magick,"PS2") != 0)
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlobString(image,"end\n");
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlobString(image,"%%PageTrailer\n");
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (GetNextImageInList(image) == (Image *) NULL)
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image=SyncNextImageInList(image);
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status=SetImageProgress(image,SaveImagesTag,scene++,
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      GetImageListLength(image));
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while (image_info->adjoin != MagickFalse);
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobString(image,"%%Trailer\n");
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (page > 1)
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1122151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(buffer,MagickPathExtent,
1123e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        "%%%%BoundingBox: %.20g %.20g %.20g %.20g\n",ceil(bounds.x1-0.5),
11248071c47b0ca8f471cbd6175e0f2e45739983bf4ecristy        ceil(bounds.y1-0.5),floor(bounds.x2+0.5),floor(bounds.y2+0.5));
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlobString(image,buffer);
1126151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) FormatLocaleString(buffer,MagickPathExtent,
1127e7f5109f30fc7242d04a26174a9138483dda5b6acristy        "%%%%HiResBoundingBox: %g %g %g %g\n",bounds.x1,bounds.y1,
11288cd5b3193212b4aebce08c4e7afbb66b09778029cristy        bounds.x2,bounds.y2);
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlobString(image,buffer);
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobString(image,"%%EOF\n");
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1135