ipl.c revision acd2ed254c18c254a0ab5aafa06d1645e5d079d8
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
4ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
5ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
6ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                     IIIIIIIIII    PPPPPPPP      LL                          %
7ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                         II        PP      PP    LL                          %
8ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                         II        PP       PP   LL                          %
9ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                         II        PP      PP    LL                          %
10ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                         II        PPPPPPPP      LL                          %
11ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                         II        PP            LL                          %
12ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                         II        PP            LL                          %
13ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                     IIIIIIIIII    PP            LLLLLLLL                    %
14ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
15ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
16ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
17ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                   Read/Write Scanalytics IPLab Image Format                 %
18ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                  Sean Burke                                 %
19ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                  2008.05.07                                 %
20ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                     v 0.9                                   %
21ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
22ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization      %
23ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  dedicated to making software imaging solutions freely available.           %
24ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
25ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  You may not use this file except in compliance with the License.  You may  %
26ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  obtain a copy of the License at                                            %
27ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
28ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%    http://www.imagemagick.org/script/license.php                            %
29ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
30ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  Unless required by applicable law or agreed to in writing, software        %
31ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
32ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
33ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  See the License for the specific language governing permissions and        %
34ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%  limitations under the License.                                             %
35ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%                                                                             %
36ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
37ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%
38ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy%
39ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy*/
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include declarations.
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h"
49510d06a3f7063e91993e13d546d5685048248074cristy#include "MagickCore/colorspace-private.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/option.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristyTyedef declarations
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _IPLInfo
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
72eaedf06777741da32408da72c1e512975c600c48cristy  unsigned int
73eaedf06777741da32408da72c1e512975c600c48cristy    tag,
74eaedf06777741da32408da72c1e512975c600c48cristy    size,
75eaedf06777741da32408da72c1e512975c600c48cristy    time,
76eaedf06777741da32408da72c1e512975c600c48cristy    z,
77eaedf06777741da32408da72c1e512975c600c48cristy    width,
78eaedf06777741da32408da72c1e512975c600c48cristy    height,
79eaedf06777741da32408da72c1e512975c600c48cristy    colors,
80eaedf06777741da32408da72c1e512975c600c48cristy    depth,
81eaedf06777741da32408da72c1e512975c600c48cristy    byteType;
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} IPLInfo;
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
851e178e70fb3c956f9fc1e30c3ba863e882666465cristy  WriteIPLImage(const ImageInfo *,Image *,ExceptionInfo *);
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid increase (void *pixel, int byteType){
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch(byteType){
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 0:(*((unsigned char *) pixel))++; break;
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 1:(*((signed int *) pixel))++; break;
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 2:(*((unsigned int *) pixel))++; break;
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 3:(*((signed long *) pixel))++; break;
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:(*((unsigned int *) pixel))++; break;
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %   I s I P L                                                                 %
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  IsIPL() returns MagickTrue if the image format type, identified by the
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  magick string, is IPL.
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  The format of the IsIPL method is:
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %      MagickBooleanType IsIPL(const unsigned char *magick,const size_t length)
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  A description of each parameter follows:
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %    o magick: compare image format pattern against these bytes.
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %    o length: Specifies the length of the magick string.
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsIPL(const unsigned char *magick,const size_t length)
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length < 4)
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (LocaleNCompare((const char *) magick,"data",4) == 0)
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %    R e a d I P L I m a g e                                                  %
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  ReadIPLImage() reads a Scanalytics IPLab image file and returns it.  It
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  allocates the memory necessary for the new Image structure and returns a
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  pointer to the new image.
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  According to the IPLab spec, the data is blocked out in five dimensions:
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  { t, z, c, y, x }.  When we return the image, the latter three are folded
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  into the standard "Image" structure.  The "scenes" (image_info->scene)
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  correspond to the order: { {t0,z0}, {t0, z1}, ..., {t1,z0}, {t1,z1}... }
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  The number of scenes is t*z.
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  The format of the ReadIPLImage method is:
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %      Image *ReadIPLImage(const ImageInfo *image_info,ExceptionInfo *exception)
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  A description of each parameter follows:
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %    o image_info: The image info.
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %    o exception: return any errors or warnings in this structure.
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristyvoid SetHeaderFromIPL(Image *image, IPLInfo *ipl){
165c5de69967ea7758f3204962a84c780c82d824ca7cristy  image->columns = ipl->width;
166c5de69967ea7758f3204962a84c780c82d824ca7cristy  image->rows = ipl->height;
167c5de69967ea7758f3204962a84c780c82d824ca7cristy  image->depth = ipl->depth;
168c5de69967ea7758f3204962a84c780c82d824ca7cristy  image->x_resolution = 1;
169c5de69967ea7758f3204962a84c780c82d824ca7cristy  image->y_resolution = 1;
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadIPLImage(const ImageInfo *image_info,ExceptionInfo *exception)
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Declare variables
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image;
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType status;
1824c08aed51c5899665ade97263692328eea4af106cristy  register Quantum *q;
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char magick[12], *pixels;
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ssize_t count;
185bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t y;
186bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t t_count=0;
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t length;
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  IPLInfo
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ipl_info;
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumFormatType
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    quantum_format;
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumInfo
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *quantum_info;
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumType
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    quantum_type;
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   Open Image
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ( image_info->debug != MagickFalse)
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent, GetMagickModule(), "%s",
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image_info->filename);
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception->signature == MagickSignature);
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image=AcquireImage(image_info);
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image=DestroyImageList(image);
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Image *) NULL);
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   Read IPL image
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine endianness
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   If we get back "iiii", we have LSB,"mmmm", MSB
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count=ReadBlob(image,4,magick);
225da16f16767eb31921af855f17bda465fffc4e000cristy  (void) count;
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if((LocaleNCompare((char *) magick,"iiii",4) == 0))
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image->endian=LSBEndian;
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else{
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if((LocaleNCompare((char *) magick,"mmmm",4) == 0))
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->endian=MSBEndian;
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else{
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowReaderException(CorruptImageError, "ImproperImageHeader");
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* Skip o'er the next 8 bytes (garbage) */
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count=ReadBlob(image, 8, magick);
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   Excellent, now we read the header unimpeded.
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count=ReadBlob(image,4,magick);
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if((LocaleNCompare((char *) magick,"data",4) != 0))
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(CorruptImageError, "ImproperImageHeader");
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.size=ReadBlobLong(image);
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.width=ReadBlobLong(image);
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.height=ReadBlobLong(image);
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if((ipl_info.width == 0UL) || (ipl_info.height == 0UL))
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.colors=ReadBlobLong(image);
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(ipl_info.colors == 3){ image->colorspace=RGBColorspace;}
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else { image->colorspace = GRAYColorspace; }
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.z=ReadBlobLong(image);
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.time=ReadBlobLong(image);
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.byteType=ReadBlobLong(image);
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* Initialize Quantum Info */
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (ipl_info.byteType) {
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 0:
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=8;
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = UnsignedQuantumFormat;
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 1:
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=16;
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = SignedQuantumFormat;
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 2:
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=16;
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = UnsignedQuantumFormat;
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 3:
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=32;
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = SignedQuantumFormat;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 4: ipl_info.depth=32;
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = FloatingPointQuantumFormat;
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 5:
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=8;
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = UnsignedQuantumFormat;
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 6:
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=16;
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = UnsignedQuantumFormat;
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 10:
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=64;
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = FloatingPointQuantumFormat;
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.depth=16;
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      quantum_format = UnsignedQuantumFormat;
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Set number of scenes of image
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetHeaderFromIPL(image, &ipl_info);
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* Thats all we need if we are pinging. */
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->ping != MagickFalse)
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CloseBlob(image);
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(GetFirstImageInList(image));
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=image->columns;
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_type=GetQuantumType(image,exception);
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    SetHeaderFromIPL(image, &ipl_info);
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image_info->ping != MagickFalse) && (image_info->number_scenes != 0))
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->scene >= (image_info->scene+image_info->number_scenes-1))
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
319e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy   printf("Length: %.20g, Memory size: %.20g\n", (double) length,(double)
320e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy     image->depth);
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     quantum_info=AcquireQuantumInfo(image_info,image);
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     if (quantum_info == (QuantumInfo *) NULL)
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy       ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     status=SetQuantumFormat(image,quantum_info,quantum_format);
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     if (status == MagickFalse)
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy       ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     pixels=GetQuantumPixels(quantum_info);
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     if(image->columns != ipl_info.width){
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
331e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy     printf("Columns not set correctly!  Wanted: %.20g, got: %.20g\n",
332e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy       (double) ipl_info.width, (double) image->columns);
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     }
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Covert IPL binary to pixel packets
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     */
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(ipl_info.colors == 1){
341bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for(y = 0; y < (ssize_t) image->rows; y++){
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ReadBlob(image, length*image->depth/8, pixels);
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
344acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
346c5de69967ea7758f3204962a84c780c82d824ca7cristy        (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GrayQuantum,pixels,exception);
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
350c5de69967ea7758f3204962a84c780c82d824ca7cristy    }
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else{
353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for(y = 0; y < (ssize_t) image->rows; y++){
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ReadBlob(image, length*image->depth/8, pixels);
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
356acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                break;
358c5de69967ea7758f3204962a84c780c82d824ca7cristy        (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
359c5de69967ea7758f3204962a84c780c82d824ca7cristy          RedQuantum,pixels,exception);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
363bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for(y = 0; y < (ssize_t) image->rows; y++){
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ReadBlob(image, length*image->depth/8, pixels);
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
366acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
367ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy          break;
368c5de69967ea7758f3204962a84c780c82d824ca7cristy        (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          GreenQuantum,pixels,exception);
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
373bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for(y = 0; y < (ssize_t) image->rows; y++){
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) ReadBlob(image, length*image->depth/8, pixels);
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
376acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
377ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy          break;
378c5de69967ea7758f3204962a84c780c82d824ca7cristy        (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info,
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          BlueQuantum,pixels,exception);
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   SetQuantumImageType(image,quantum_type);
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    t_count++;
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_info = DestroyQuantumInfo(quantum_info);
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (EOFBlob(image) != MagickFalse)
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 image->filename);
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   if(t_count < ipl_info.z * ipl_info.time){
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy       Proceed to next image.
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy       */
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      AcquireNextImage(image_info, image);
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (GetNextImageInList(image) == (Image *) NULL)
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image=DestroyImageList(image);
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return((Image *) NULL);
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=SyncNextImageInList(image);
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=SetImageProgress(image,LoadImagesTag,TellBlob(image),
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        GetBlobSize(image));
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while (t_count < ipl_info.z*ipl_info.time);
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  CloseBlob(image);
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(image));
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %   R e g i s t e r I P L I m a g e                                           %
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % RegisterIPLImage() add attributes for the Scanalytics IPL image format to the
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy % list of supported formats.
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
432bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterIPLImage(void)
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry=SetMagickInfo("IPL");
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadIPLImage;
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteIPLImage;
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsIPL;
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->adjoin=MagickTrue;
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->description=ConstantString("IPL Image Sequence");
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->module=ConstantString("IPL");
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->endian_support=MagickTrue;
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %   U n r e g i s t e r I P L I m a g e                                       %
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %                                                                             %
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  UnregisterIPLImage() removes format registrations made by the
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  IPL module from the list of supported formats.
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %  The format of the UnregisterIPLImage method is:
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %      UnregisterIPLImage(void)
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy %
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterIPLImage(void)
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("IPL");
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4741e178e70fb3c956f9fc1e30c3ba863e882666465cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4751e178e70fb3c956f9fc1e30c3ba863e882666465cristy%                                                                             %
4761e178e70fb3c956f9fc1e30c3ba863e882666465cristy%                                                                             %
4771e178e70fb3c956f9fc1e30c3ba863e882666465cristy%                                                                             %
4781e178e70fb3c956f9fc1e30c3ba863e882666465cristy%   W r i t e I P L I m a g e                                                 %
4791e178e70fb3c956f9fc1e30c3ba863e882666465cristy%                                                                             %
4801e178e70fb3c956f9fc1e30c3ba863e882666465cristy%                                                                             %
4811e178e70fb3c956f9fc1e30c3ba863e882666465cristy%                                                                             %
4821e178e70fb3c956f9fc1e30c3ba863e882666465cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4831e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4841e178e70fb3c956f9fc1e30c3ba863e882666465cristy%  WriteIPLImage() writes an image to a file in Scanalytics IPLabimage format.
4851e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4861e178e70fb3c956f9fc1e30c3ba863e882666465cristy%  The format of the WriteIPLImage method is:
4871e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4881e178e70fb3c956f9fc1e30c3ba863e882666465cristy%      MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image)
4891e178e70fb3c956f9fc1e30c3ba863e882666465cristy%       Image *image,ExceptionInfo *exception)
4901e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4911e178e70fb3c956f9fc1e30c3ba863e882666465cristy%  A description of each parameter follows.
4921e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4931e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o image_info: The image info.
4941e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4951e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o image:  The image.
4961e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4971e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o exception: return any errors or warnings in this structure.
4981e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
4991e178e70fb3c956f9fc1e30c3ba863e882666465cristy*/
5001e178e70fb3c956f9fc1e30c3ba863e882666465cristystatic MagickBooleanType WriteIPLImage(const ImageInfo *image_info,Image *image,
5011e178e70fb3c956f9fc1e30c3ba863e882666465cristy  ExceptionInfo *exception)
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
503ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy  IPLInfo
504ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy    ipl_info;
505ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickOffsetType
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    scene;
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5124c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumInfo
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *quantum_info;
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
518ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy  ssize_t
519ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy    y;
520ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy
521ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy  unsigned char
522ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy    *pixels;
523ebc891a1d9621a19c509200d7bf3470ca18dde7fcristy
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   /*
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open output image file.
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image->signature == MagickSignature);
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
5333a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception != (ExceptionInfo *) NULL);
5343a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception->signature == MagickSignature);
5351e178e70fb3c956f9fc1e30c3ba863e882666465cristy  status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  scene=0;
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_info=AcquireQuantumInfo(image_info, image);
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((quantum_info->format == UndefinedQuantumFormat) &&
5431e178e70fb3c956f9fc1e30c3ba863e882666465cristy      (IsHighDynamicRangeImage(image,exception) != MagickFalse))
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    SetQuantumFormat(image,quantum_info,FloatingPointQuantumFormat);
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch(quantum_info->depth){
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  case 8:
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ipl_info.byteType = 0;
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    break;
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  case 16:
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if(quantum_info->format == SignedQuantumFormat){
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.byteType = 2;
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else{
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.byteType = 1;
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    break;
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  case 32:
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if(quantum_info->format == FloatingPointQuantumFormat){
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.byteType = 3;
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else{
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ipl_info.byteType = 4;
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    break;
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  case 64:
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ipl_info.byteType = 10;
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    break;
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  default:
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ipl_info.byteType = 2;
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    break;
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
5730b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy  ipl_info.z = (unsigned int) GetImageListLength(image);
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* There is no current method for detecting whether we have T or Z stacks */
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ipl_info.time = 1;
5760b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy  ipl_info.width = (unsigned int) image->columns;
5770b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy  ipl_info.height = (unsigned int) image->rows;
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
579510d06a3f7063e91993e13d546d5685048248074cristy  if (IsRGBColorspace(image->colorspace) == MagickFalse)
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) TransformImageColorspace(image,RGBColorspace);
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
582510d06a3f7063e91993e13d546d5685048248074cristy  if(IsRGBColorspace(image->colorspace) == MagickTrue) { ipl_info.colors = 3; }
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else{ ipl_info.colors = 1; }
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5850b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy  ipl_info.size = (unsigned int) (28 +
5860b29b25525c4612c77b1b3c8abcc40685d0aa33fcristy    ((image->depth)/8)*ipl_info.height*ipl_info.width*ipl_info.colors*ipl_info.z);
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* Ok!  Calculations are done.  Lets write this puppy down! */
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write IPL header.
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* Shockingly (maybe not if you have used IPLab),  IPLab itself CANNOT read MSBEndian
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  files!   The reader above can, but they cannot.  For compatability reasons, I will leave
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  the code in here, but it is all but useless if you want to use IPLab. */
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(image_info->endian == MSBEndian)
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlob(image, 4, (const unsigned char *) "mmmm");
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else{
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image->endian = LSBEndian;
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) WriteBlob(image, 4, (const unsigned char *) "iiii");
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, 4);
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlob(image, 4, (const unsigned char *) "100f");
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlob(image, 4, (const unsigned char *) "data");
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, ipl_info.size);
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, ipl_info.width);
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, ipl_info.height);
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, ipl_info.colors);
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(image_info->adjoin == MagickFalse)
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, 1);
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, ipl_info.z);
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, ipl_info.time);
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, ipl_info.byteType);
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  do
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Convert MIFF to IPL raster pixels.
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels=GetQuantumPixels(quantum_info);
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(ipl_info.colors == 1){
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* Red frame */
625bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for(y = 0; y < (ssize_t) ipl_info.height; y++){
6264c08aed51c5899665ade97263692328eea4af106cristy    p=GetVirtualPixels(image,0,y,image->columns,1,exception);
6274c08aed51c5899665ade97263692328eea4af106cristy    if (p == (const Quantum *) NULL)
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
6294c08aed51c5899665ade97263692328eea4af106cristy      (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info,
6301e178e70fb3c956f9fc1e30c3ba863e882666465cristy        GrayQuantum, pixels,exception);
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlob(image, image->columns*image->depth/8, pixels);
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if(ipl_info.colors == 3){
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* Red frame */
637bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for(y = 0; y < (ssize_t) ipl_info.height; y++){
6384c08aed51c5899665ade97263692328eea4af106cristy    p=GetVirtualPixels(image,0,y,image->columns,1,exception);
6394c08aed51c5899665ade97263692328eea4af106cristy    if (p == (const Quantum *) NULL)
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
6414c08aed51c5899665ade97263692328eea4af106cristy      (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info,
6421e178e70fb3c956f9fc1e30c3ba863e882666465cristy        RedQuantum, pixels,exception);
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlob(image, image->columns*image->depth/8, pixels);
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* Green frame */
647bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for(y = 0; y < (ssize_t) ipl_info.height; y++){
6481e178e70fb3c956f9fc1e30c3ba863e882666465cristy      p=GetVirtualPixels(image,0,y,image->columns,1,exception);
6494c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
6514c08aed51c5899665ade97263692328eea4af106cristy        (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info,
6521e178e70fb3c956f9fc1e30c3ba863e882666465cristy          GreenQuantum, pixels,exception);
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) WriteBlob(image, image->columns*image->depth/8, pixels);
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /* Blue frame */
656bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for(y = 0; y < (ssize_t) ipl_info.height; y++){
6571e178e70fb3c956f9fc1e30c3ba863e882666465cristy      p=GetVirtualPixels(image,0,y,image->columns,1,exception);
6584c08aed51c5899665ade97263692328eea4af106cristy      if (p == (const Quantum *) NULL)
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
6604c08aed51c5899665ade97263692328eea4af106cristy      (void) ExportQuantumPixels(image,(CacheView *) NULL, quantum_info,
6611e178e70fb3c956f9fc1e30c3ba863e882666465cristy        BlueQuantum, pixels,exception);
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) WriteBlob(image, image->columns*image->depth/8, pixels);
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->previous == (Image *) NULL)
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
665cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy          status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
666cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy                image->rows);
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (status == MagickFalse)
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_info=DestroyQuantumInfo(quantum_info);
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (GetNextImageInList(image) == (Image *) NULL)
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  break;
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=SyncNextImageInList(image);
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=SetImageProgress(image,SaveImagesTag,scene++,
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        GetImageListLength(image));
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }while (image_info->adjoin != MagickFalse);
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlob(image, 4, (const unsigned char *) "fini");
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLong(image, 0);
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristyCloseBlob(image);
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristyreturn(MagickTrue);
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
688