cut.c revision 3ed852eea50f9d4cd633efb8c2b054b8e33c253
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              CCC  U   U  TTTTT                              %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             C     U   U    T                                %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             C     U   U    T                                %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             C     U   U    T                                %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              CCC   UUU     T                                %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                         Read DR Halo Image Format                           %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Jaroslav Fojtik                                %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 June 2000                                   %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Permission is hereby granted, free of charge, to any person obtaining a    %
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  copy of this software and associated documentation files ("ImageMagick"),  %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to deal in ImageMagick without restriction, including without limitation   %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the rights to use, copy, modify, merge, publish, distribute, sublicense,   %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and/or sell copies of ImageMagick, and to permit persons to whom the       %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ImageMagick is furnished to do so, subject to the following conditions:    %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The above copyright notice and this permission notice shall be included in %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  all copies or substantial portions of ImageMagick.                         %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The software is provided "as is", without warranty of any kind, express or %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  implied, including but not limited to the warranties of merchantability,   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  fitness for a particular purpose and noninfringement.  In no event shall   %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ImageMagick Studio be liable for any claim, damages or other liability,    %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether in an action of contract, tort or otherwise, arising from, out of  %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  or in connection with ImageMagick or the use or other dealings in          %
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ImageMagick.                                                               %
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Except as contained in this notice, the name of the ImageMagick Studio     %
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  shall not be used in advertising or otherwise to promote the sale, use or  %
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  other dealings in ImageMagick without prior written authorization from the %
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ImageMagick Studio.                                                        %
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/studio.h"
513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob.h"
523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob-private.h"
533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/cache.h"
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/color.h"
553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/color-private.h"
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception.h"
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception-private.h"
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/image.h"
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/image-private.h"
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/list.h"
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/magick.h"
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/memory_.h"
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/quantum-private.h"
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/static.h"
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/string_.h"
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/module.h"
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/utility.h"
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned Width;
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned Height;
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned Reserved;
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} CUTHeader;
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char FileId[2];
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned Version;
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned Size;
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char FileType;
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char SubType;
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned BoardID;
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned GraphicsMode;
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned MaxIndex;
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned MaxRed;
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned MaxGreen;
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned MaxBlue;
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char PaletteId[20];
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} CUTPalHeader;
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void InsertRow(long depth,unsigned char *p,long y,Image *image)
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned long bit; long x;
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register PixelPacket *q;
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  IndexPacket index;
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register IndexPacket *indexes;
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  index=(IndexPacket) 0;
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=(&image->exception);
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (depth)
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 1:  /* Convert bitmap scanline. */
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (q == (PixelPacket *) NULL)
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        indexes=GetAuthenticIndexQueue(image);
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=0; x < ((long) image->columns-7); x+=8)
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (bit=0; bit < 8; bit++)
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                index=(IndexPacket) ((((*p) & (0x80 >> bit)) != 0) ? 0x01 : 0x00);
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                indexes[x+bit]=index;
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=image->colormap[(long) index];
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->columns % 8) != 0)
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (bit=0; bit < (image->columns % 8); bit++)
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                index=(IndexPacket) ((((*p) & (0x80 >> bit)) != 0) ? 0x01 : 0x00);
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                indexes[x+bit]=index;
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=image->colormap[(long) index];
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*            if (image->previous == (Image *) NULL)
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if (QuantumTick(y,image->rows) != MagickFalse)
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      ProgressMonitor(LoadImageText,image->rows-y-1,image->rows);*/
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 2:  /* Convert PseudoColor scanline. */
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (q == (PixelPacket *) NULL)
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        indexes=GetAuthenticIndexQueue(image);
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=0; x < ((long) image->columns-1); x+=2)
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p >> 6) & 0x3);
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x]=index;
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p >> 4) & 0x3);
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x]=index;
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p >> 2) & 0x3);
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x]=index;
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p) & 0x3);
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x+1]=index;
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->columns % 4) != 0)
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p >> 6) & 0x3);
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x]=index;
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((image->columns % 4) >= 1)
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                index=ConstrainColormapIndex(image,(*p >> 4) & 0x3);
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                indexes[x]=index;
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *q++=image->colormap[(long) index];
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((image->columns % 4) >= 2)
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  {
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    index=ConstrainColormapIndex(image,(*p >> 2) & 0x3);
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    indexes[x]=index;
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    *q++=image->colormap[(long) index];
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  }
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*         if (image->previous == (Image *) NULL)
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                   if (QuantumTick(y,image->rows) != MagickFalse)
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                   ProgressMonitor(LoadImageText,image->rows-y-1,image->rows);*/
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 4:  /* Convert PseudoColor scanline. */
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (q == (PixelPacket *) NULL)
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        indexes=GetAuthenticIndexQueue(image);
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=0; x < ((long) image->columns-1); x+=2)
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p >> 4) & 0xf);
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x]=index;
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p) & 0xf);
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x+1]=index;
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->columns % 2) != 0)
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,(*p >> 4) & 0xf);
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x]=index;
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*         if (image->previous == (Image *) NULL)
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                   if (QuantumTick(y,image->rows) != MagickFalse)
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                   ProgressMonitor(LoadImageText,image->rows-y-1,image->rows);*/
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 8: /* Convert PseudoColor scanline. */
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (q == (PixelPacket *) NULL) break;
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        indexes=GetAuthenticIndexQueue(image);
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (x=0; x < (long) image->columns; x++)
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            index=ConstrainColormapIndex(image,*p);
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            indexes[x]=index;
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=image->colormap[(long) index];
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*           if (image->previous == (Image *) NULL)
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                     if (QuantumTick(y,image->rows) != MagickFalse)
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                     ProgressMonitor(LoadImageText,image->rows-y-1,image->rows);*/
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   Compute the number of colors in Grayed R[i]=G[i]=B[i] image
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int GetCutColors(Image *image)
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *exception;
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  long
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x,
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  PixelPacket
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Quantum
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    intensity,
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scale_intensity;
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  exception=(&image->exception);
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  intensity=0;
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scale_intensity=ScaleCharToQuantum(16);
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (y=0; y < (long) image->rows; y++)
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=GetAuthenticPixels(image,0,y,image->columns,1,exception);
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (x=0; x < (long) image->columns; x++)
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (intensity < q->red)
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        intensity=q->red;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (intensity >= scale_intensity)
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return(255);
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q++;
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (intensity < ScaleCharToQuantum(2))
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(2);
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (intensity < ScaleCharToQuantum(16))
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(16);
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((int) intensity);
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d C U T I m a g e                                                   %
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadCUTImage() reads an CUT X image file and returns it.  It
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  allocates the memory necessary for the new Image structure and returns a
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pointer to the new image.
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadCUTImage method is:
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadCUTImage(const ImageInfo *image_info,ExceptionInfo *exception)
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadCUTImage(const ImageInfo *image_info,ExceptionInfo *exception)
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image,*palette;
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ImageInfo *clone_info;
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType status;
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickOffsetType
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    offset;
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned long EncodedByte;
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char RunCount,RunValue,RunCountMasked;
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  CUTHeader  Header;
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  CUTPalHeader PalHeader;
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  long depth;
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  long i,j;
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  long ldblk;
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char *BImgBuff=NULL,*ptrB;
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  PixelPacket *q;
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ssize_t
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open image file.
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception->signature == MagickSignature);
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image=AcquireImage(image_info);
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=DestroyImageList(image);
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Read CUT image.
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  palette=NULL;
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  clone_info=NULL;
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Header.Width=ReadBlobLSBShort(image);
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Header.Height=ReadBlobLSBShort(image);
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Header.Reserved=ReadBlobLSBShort(image);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (Header.Width==0 || Header.Height==0 || Header.Reserved!=0)
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CUT_KO:  ThrowReaderException(CorruptImageError,"ImproperImageHeader");
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*---This code checks first line of image---*/
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  EncodedByte=ReadBlobLSBShort(image);
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RunCount=(unsigned char) ReadBlobByte(image);
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  RunCountMasked=RunCount & 0x7F;
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ldblk=0;
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while((int) RunCountMasked!=0)  /*end of line?*/
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      i=1;
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if((int) RunCount<0x80) i=(long) RunCountMasked;
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      offset=SeekBlob(image,TellBlob(image)+i,SEEK_SET);
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (offset < 0)
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CorruptImageError,"ImproperImageHeader");
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(EOFBlob(image) != MagickFalse) goto CUT_KO;  /*wrong data*/
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      EncodedByte-=i+1;
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ldblk+=(long) RunCountMasked;
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RunCount=(unsigned char) ReadBlobByte(image);
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(EOFBlob(image) != MagickFalse)  goto CUT_KO;  /*wrong data: unexpected eof in line*/
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RunCountMasked=RunCount & 0x7F;
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(EncodedByte!=1) goto CUT_KO;  /*wrong data: size incorrect*/
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;        /*guess a number of bit planes*/
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(ldblk==(int) Header.Width)   i=8;
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(2*ldblk==(int) Header.Width) i=4;
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(8*ldblk==(int) Header.Width) i=1;
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(i==0) goto CUT_KO;    /*wrong data: incorrect bit planes*/
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  depth=i;
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->columns=Header.Width;
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->rows=Header.Height;
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->depth=8;
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colors=(unsigned long) (GetQuantumRange(1UL*i)+1);
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->ping) goto Finish;
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* ----- Do something with palette ----- */
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((clone_info=CloneImageInfo(image_info)) == NULL) goto NoPalette;
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=(long) strlen(clone_info->filename);
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  j=i;
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while(--i>0)
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(clone_info->filename[i]=='.')
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(clone_info->filename[i]=='/' || clone_info->filename[i]=='\\' ||
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         clone_info->filename[i]==':' )
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          i=j;
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickString(clone_info->filename+i,".PAL",(size_t)
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (MaxTextExtent-i));
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if((clone_info->file=OpenMagickStream(clone_info->filename,"rb"))==NULL)
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickString(clone_info->filename+i,".pal",(size_t)
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (MaxTextExtent-i));
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if((clone_info->file=OpenMagickStream(clone_info->filename,"rb"))==NULL)
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          clone_info->filename[i]='\0';
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if((clone_info->file=OpenMagickStream(clone_info->filename,"rb"))==NULL)
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              clone_info=DestroyImageInfo(clone_info);
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              clone_info=NULL;
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              goto NoPalette;
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if( (palette=AcquireImage(clone_info))==NULL ) goto NoPalette;
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=OpenBlob(clone_info,palette,ReadBinaryBlobMode,exception);
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ErasePalette:
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      palette=DestroyImage(palette);
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      palette=NULL;
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      goto NoPalette;
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(palette!=NULL)
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      count=ReadBlob(palette,2,(unsigned char *) PalHeader.FileId);
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(strncmp(PalHeader.FileId,"AH",2) != 0) goto ErasePalette;
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.Version=ReadBlobLSBShort(palette);
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.Size=ReadBlobLSBShort(palette);
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.FileType=(char) ReadBlobByte(palette);
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.SubType=(char) ReadBlobByte(palette);
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.BoardID=ReadBlobLSBShort(palette);
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.GraphicsMode=ReadBlobLSBShort(palette);
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.MaxIndex=ReadBlobLSBShort(palette);
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.MaxRed=ReadBlobLSBShort(palette);
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.MaxGreen=ReadBlobLSBShort(palette);
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      PalHeader.MaxBlue=ReadBlobLSBShort(palette);
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      count=ReadBlob(palette,20,(unsigned char *) PalHeader.PaletteId);
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(PalHeader.MaxIndex<1) goto ErasePalette;
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->colors=PalHeader.MaxIndex+1;
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (AcquireImageColormap(image,image->colors) == MagickFalse) goto NoMemory;
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(PalHeader.MaxRed==0) PalHeader.MaxRed=(unsigned int) QuantumRange;  /*avoid division by 0*/
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(PalHeader.MaxGreen==0) PalHeader.MaxGreen=(unsigned int) QuantumRange;
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if(PalHeader.MaxBlue==0) PalHeader.MaxBlue=(unsigned int) QuantumRange;
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for(i=0;i<=(int) PalHeader.MaxIndex;i++)
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {      /*this may be wrong- I don't know why is palette such strange*/
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          j=(long) TellBlob(palette);
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if((j % 512)>512-6)
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              j=((j / 512)+1)*512;
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              offset=SeekBlob(palette,j,SEEK_SET);
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (offset < 0)
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ThrowReaderException(CorruptImageError,"ImproperImageHeader");
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->colormap[i].red=(Quantum) ReadBlobLSBShort(palette);
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if(QuantumRange!=(Quantum) PalHeader.MaxRed)
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->colormap[i].red=RoundToQuantum(((double)
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->colormap[i].red*QuantumRange+(PalHeader.MaxRed>>1))/
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                PalHeader.MaxRed);
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->colormap[i].green=(Quantum) ReadBlobLSBShort(palette);
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if(QuantumRange!=(Quantum) PalHeader.MaxGreen)
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->colormap[i].green=RoundToQuantum
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (((double) image->colormap[i].green*QuantumRange+(PalHeader.MaxGreen>>1))/PalHeader.MaxGreen);
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->colormap[i].blue=(Quantum) ReadBlobLSBShort(palette);
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if(QuantumRange!=(Quantum) PalHeader.MaxBlue)
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->colormap[i].blue=RoundToQuantum
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (((double)image->colormap[i].blue*QuantumRange+(PalHeader.MaxBlue>>1))/PalHeader.MaxBlue);
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy NoPalette:
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(palette==NULL)
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->colors=256;
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (AcquireImageColormap(image,image->colors) == MagickFalse)
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        NoMemory:
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      for (i=0; i < (long)image->colors; i++)
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->colormap[i].red=ScaleCharToQuantum((unsigned char) i);
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->colormap[i].green=ScaleCharToQuantum((unsigned char) i);
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->colormap[i].blue=ScaleCharToQuantum((unsigned char) i);
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* ----- Load RLE compressed raster ----- */
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  BImgBuff=(unsigned char *) AcquireQuantumMemory((size_t) ldblk,
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*BImgBuff));  /*Ldblk was set in the check phase*/
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(BImgBuff==NULL) goto NoMemory;
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  offset=SeekBlob(image,6 /*sizeof(Header)*/,SEEK_SET);
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (offset < 0)
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < (int) Header.Height; i++)
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      EncodedByte=ReadBlobLSBShort(image);
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ptrB=BImgBuff;
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      j=ldblk;
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RunCount=(unsigned char) ReadBlobByte(image);
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RunCountMasked=RunCount & 0x7F;
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      while((int) RunCountMasked!=0)
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if((long) RunCountMasked>j)
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {    /*Wrong Data*/
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              RunCountMasked=(unsigned char) j;
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if(j==0)
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  break;
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if((int) RunCount>0x80)
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              RunValue=(unsigned char) ReadBlobByte(image);
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              (void) ResetMagickMemory(ptrB,(int) RunValue,(size_t) RunCountMasked);
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else {
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            count=ReadBlob(image,(size_t) RunCountMasked,ptrB);
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ptrB+=(int) RunCountMasked;
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          j-=(int) RunCountMasked;
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (EOFBlob(image) != MagickFalse) goto Finish;  /* wrong data: unexpected eof in line */
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RunCount=(unsigned char) ReadBlobByte(image);
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RunCountMasked=RunCount & 0x7F;
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      InsertRow(depth,BImgBuff,i,image);
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*detect monochrome image*/
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(palette==NULL)
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {    /*attempt to detect binary (black&white) images*/
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((image->storage_class == PseudoClass) &&
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (IsGrayImage(image,&image->exception) != MagickFalse))
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if(GetCutColors(image)==2)
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (i=0; i < (long)image->colors; i++)
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  register Quantum
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    sample;
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  sample=ScaleCharToQuantum((unsigned char) i);
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if(image->colormap[i].red!=sample) goto Finish;
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if(image->colormap[i].green!=sample) goto Finish;
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if(image->colormap[i].blue!=sample) goto Finish;
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->colormap[1].red=image->colormap[1].green=image->colormap[1].blue=(Quantum) QuantumRange;
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (i=0; i < (long)image->rows; i++)
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  q=QueueAuthenticPixels(image,0,i,image->columns,1,exception);
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  for (j=0; j < (long)image->columns; j++)
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    {
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      if(q->red==ScaleCharToQuantum(1))
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        {
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                          q->red=q->green=q->blue=(Quantum) QuantumRange;
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        }
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                      q++;
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                    }
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  if (SyncAuthenticPixels(image,exception) == MagickFalse) goto Finish;
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Finish:
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (BImgBuff != NULL)
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    BImgBuff=(unsigned char *) RelinquishMagickMemory(BImgBuff);
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (palette != NULL)
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    palette=DestroyImage(palette);
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (clone_info != NULL)
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    clone_info=DestroyImageInfo(clone_info);
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (EOFBlob(image) != MagickFalse)
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(image));
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r C U T I m a g e                                           %
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterCUTImage() adds attributes for the CUT image format to
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterCUTImage method is:
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      unsigned long RegisterCUTImage(void)
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport unsigned long RegisterCUTImage(void)
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry=SetMagickInfo("CUT");
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadCUTImage;
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->seekable_stream=MagickTrue;
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->description=ConstantString("DR Halo");
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->module=ConstantString("CUT");
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r C U T I m a g e                                       %
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterCUTImage() removes format registrations made by the
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  CUT module from the list of supported formats.
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterCUTImage method is:
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterCUTImage(void)
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterCUTImage(void)
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("CUT");
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
688