dib.c revision f8dcd77f1fbba9b5f5b8e17cc4b0132919623808
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            DDDD   IIIII  BBBB                               %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            D   D    I    B   B                              %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            D   D    I    BBBB                               %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            D   D    I    B   B                              %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            DDDD   IIIII  BBBB                               %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                   Read/Write Windows DIB Image Format                       %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                   Cristy                                    %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 July 1992                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
20b56bb24a985ca4366713bcd8ffdfacbb48a98a2fcristy%  Copyright 1999-2015 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/attribute.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap-private.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h"
52510d06a3f7063e91993e13d546d5685048248074cristy#include "MagickCore/colorspace-private.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/draw.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/geometry.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/log.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/transform.h"
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _DIBInfo
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
77f6fe0a138e6b5879b6c11a27d715412479acf128cristy  size_t
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    size;
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
80f6fe0a138e6b5879b6c11a27d715412479acf128cristy  ssize_t
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width,
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    height;
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned short
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    planes,
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bits_per_pixel;
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
88f6fe0a138e6b5879b6c11a27d715412479acf128cristy  size_t
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    compression,
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image_size,
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x_pixels,
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y_pixels,
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_colors,
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    red_mask,
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    green_mask,
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    blue_mask,
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    alpha_mask,
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colors_important;
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
100f6fe0a138e6b5879b6c11a27d715412479acf128cristy  ssize_t
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    colorspace;
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  PointInfo
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    red_primary,
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    green_primary,
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    blue_primary,
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    gamma_scale;
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} DIBInfo;
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
1141e178e70fb3c956f9fc1e30c3ba863e882666465cristy  WriteDIBImage(const ImageInfo *,Image *,ExceptionInfo *);
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e c o d e I m a g e                                                     %
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DecodeImage unpacks the packed image pixels into runlength-encoded
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  pixel packets.
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DecodeImage method is:
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType DecodeImage(Image *image,
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const MagickBooleanType compression,unsigned char *pixels)
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the address of a structure of type Image.
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o compression:  A value of 1 means the compressed pixels are runlength
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      encoded for a 256-color bitmap.  A value of 2 means a 16-color bitmap.
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixels:  The address of a byte (8 bits) array of pixel data created by
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the decoding process.
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline size_t MagickMin(const size_t x,const size_t y)
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < y)
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType DecodeImage(Image *image,
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickBooleanType compression,unsigned char *pixels)
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
15707a3cca00593c795eb8e0427f5bc4c2bcad3f0fbcristy#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__MINGW32__) || defined(__MINGW64__)
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RGB  0
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RLE8  1
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RLE4  2
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_BITFIELDS  3
162f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#undef BI_JPEG
163f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#define BI_JPEG  4
164f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#undef BI_PNG
165f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#define BI_PNG  5
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
171bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
174bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    byte;
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image->signature == MagickSignature);
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixels != (unsigned char *) NULL);
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(pixels,0,(size_t) image->columns*image->rows*
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*pixels));
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  byte=0;
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=pixels;
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=pixels+(size_t) image->columns*image->rows;
196bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; )
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p < pixels) || (p >= q))
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count=ReadBlobByte(image);
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (count == EOF)
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (count != 0)
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count=(int) MagickMin((size_t) count,(size_t) (q-p));
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Encoded mode.
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=(unsigned char) ReadBlobByte(image);
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (compression == BI_RLE8)
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < count; i++)
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p++=(unsigned char) byte;
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < count; i++)
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p++=(unsigned char)
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f));
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x+=count;
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Escape mode.
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count=ReadBlobByte(image);
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (count == 0x01)
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return(MagickTrue);
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        switch (count)
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case 0x00:
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              End of line.
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=0;
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y++;
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=pixels+y*image->columns;
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case 0x02:
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Delta mode.
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x+=ReadBlobByte(image);
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y+=ReadBlobByte(image);
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=pixels+y*image->columns+x;
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          default:
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Absolute mode.
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            count=(int) MagickMin((size_t) count,(size_t) (q-p));
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (compression == BI_RLE8)
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (i=0; i < count; i++)
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *p++=(unsigned char) ReadBlobByte(image);
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (i=0; i < count; i++)
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((i & 0x01) == 0)
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  byte=(unsigned char) ReadBlobByte(image);
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *p++=(unsigned char)
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f));
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x+=count;
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Read pad byte.
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (compression == BI_RLE8)
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((count & 0x01) != 0)
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) ReadBlobByte(image);
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (((count & 0x03) == 1) || ((count & 0x03) == 2))
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ReadBlobByte(image);
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse)
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ReadBlobByte(image);  /* end of line */
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ReadBlobByte(image);
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E n c o d e I m a g e                                                     %
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  EncodeImage compresses pixels using a runlength encoded format.
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the EncodeImage method is:
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    static MagickBooleanType EncodeImage(Image *image,
310bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      const size_t bytes_per_line,const unsigned char *pixels,
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      unsigned char *compressed_pixels)
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image:  The image.
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o bytes_per_line: the number of bytes in a scanline of compressed pixels
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixels:  The address of a byte (8 bits) array of pixel data created by
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the compression process.
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o compressed_pixels:  The address of a byte (8 bits) array of compressed
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      pixel data.
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
326bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t EncodeImage(Image *image,const size_t bytes_per_line,
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char *pixels,unsigned char *compressed_pixels)
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
329bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const unsigned char
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
335bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Runlength encode pixels.
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image->signature == MagickSignature);
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixels != (const unsigned char *) NULL);
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(compressed_pixels != (unsigned char *) NULL);
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=pixels;
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=compressed_pixels;
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
354bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
356bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) bytes_per_line; x+=i)
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Determine runlength.
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
361bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=1; ((x+i) < (ssize_t) bytes_per_line); i++)
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((*(p+i) != *p) || (i == 255))
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q++=(unsigned char) i;
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q++=(*p);
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p+=i;
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      End of line.
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q++=0x00;
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q++=0x00;
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse)
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    End of bitmap.
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q++=0;
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q++=0x01;
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((size_t) (q-compressed_pixels));
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   I s D I B                                                                 %
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  IsDIB() returns MagickTrue if the image format type, identified by the
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  magick string, is DIB.
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the IsDIB method is:
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType IsDIB(const unsigned char *magick,const size_t length)
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magick: compare image format pattern against these bytes.
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: Specifies the length of the magick string.
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsDIB(const unsigned char *magick,const size_t length)
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length < 2)
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (memcmp(magick,"\050\000",2) == 0)
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d D I B I m a g e                                                   %
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadDIBImage() reads a Microsoft Windows bitmap image file and
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns it.  It allocates the memory necessary for the new Image structure
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and returns a pointer to the new image.
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadDIBImage method is:
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      image=ReadDIBImage(image_info)
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
445bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline ssize_t MagickAbsoluteValue(const ssize_t x)
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x < 0)
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(-x);
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(x);
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline size_t MagickMax(const size_t x,const size_t y)
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x > y)
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadDIBImage(const ImageInfo *image_info,ExceptionInfo *exception)
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DIBInfo
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dib_info;
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4700553bd5babdbdf65b95f91ed401c98fead17ab54cristy  MemoryInfo
4710553bd5babdbdf65b95f91ed401c98fead17ab54cristy    *pixel_info;
4720553bd5babdbdf65b95f91ed401c98fead17ab54cristy
4734c08aed51c5899665ade97263692328eea4af106cristy  Quantum
4744c08aed51c5899665ade97263692328eea4af106cristy    index;
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
476bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4794c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
482bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
489ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy    bytes_per_line,
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ssize_t
4934c08aed51c5899665ade97263692328eea4af106cristy    bit,
4944c08aed51c5899665ade97263692328eea4af106cristy    count,
4954c08aed51c5899665ade97263692328eea4af106cristy    y;
4964c08aed51c5899665ade97263692328eea4af106cristy
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open image file.
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception->signature == MagickSignature);
5119950d57e1124b73f684fb5946e206994cefda628cristy  image=AcquireImage(image_info,exception);
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=DestroyImageList(image);
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine if this a DIB file.
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&dib_info,0,sizeof(dib_info));
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.size=ReadBlobLSBLong(image);
523acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  if (dib_info.size != 40)
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Microsoft Windows 3.X DIB image file.
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.width=(short) ReadBlobLSBLong(image);
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.height=(short) ReadBlobLSBLong(image);
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.planes=ReadBlobLSBShort(image);
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.bits_per_pixel=ReadBlobLSBShort(image);
532f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.bits_per_pixel > 32)
533f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.compression=ReadBlobLSBLong(image);
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.image_size=ReadBlobLSBLong(image);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.x_pixels=ReadBlobLSBLong(image);
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.y_pixels=ReadBlobLSBLong(image);
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.number_colors=ReadBlobLSBLong(image);
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.colors_important=ReadBlobLSBLong(image);
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((dib_info.compression == BI_BITFIELDS) &&
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ((dib_info.bits_per_pixel == 16) || (dib_info.bits_per_pixel == 32)))
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.red_mask=ReadBlobLSBLong(image);
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.green_mask=ReadBlobLSBLong(image);
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.blue_mask=ReadBlobLSBLong(image);
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
547f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.width <= 0)
548f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize");
549f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.height == 0)
550f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize");
551f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.planes != 1)
552f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"StaticPlanesValueNotEqualToOne");
553f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.bits_per_pixel != 1) && (dib_info.bits_per_pixel != 4) &&
554f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      (dib_info.bits_per_pixel != 8) && (dib_info.bits_per_pixel != 16) &&
555f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      (dib_info.bits_per_pixel != 24) && (dib_info.bits_per_pixel != 32))
556f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
557f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.bits_per_pixel < 16 &&
558f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      dib_info.number_colors > (1U << dib_info.bits_per_pixel))
559f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedNumberOfColors");
560f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.compression == 1) && (dib_info.bits_per_pixel != 8))
561f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
562f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.compression == 2) && (dib_info.bits_per_pixel != 4))
563f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
564f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.compression == 3) && (dib_info.bits_per_pixel < 16))
565f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
566f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  switch (dib_info.compression)
567f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  {
568f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_RGB:
569f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_RLE8:
570f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_RLE4:
571f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_BITFIELDS:
572f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      break;
573f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_JPEG:
574f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      ThrowReaderException(CoderError,"JPEGCompressNotSupported");
575f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_PNG:
576f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      ThrowReaderException(CoderError,"PNGCompressNotSupported");
577f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    default:
578f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      ThrowReaderException(CorruptImageError,"UnrecognizedImageCompression");
579f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  }
580bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  image->columns=(size_t) MagickAbsoluteValue(dib_info.width);
581bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  image->rows=(size_t) MagickAbsoluteValue(dib_info.height);
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->depth=8;
583f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  image->alpha_trait=dib_info.bits_per_pixel == 32 ? BlendPixelTrait :
584f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    UndefinedPixelTrait;
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((dib_info.number_colors != 0) || (dib_info.bits_per_pixel < 16))
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
587eaedf06777741da32408da72c1e512975c600c48cristy      size_t
588eaedf06777741da32408da72c1e512975c600c48cristy        one;
589eaedf06777741da32408da72c1e512975c600c48cristy
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->storage_class=PseudoClass;
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->colors=dib_info.number_colors;
592eaedf06777741da32408da72c1e512975c600c48cristy      one=1;
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->colors == 0)
594eaedf06777741da32408da72c1e512975c600c48cristy        image->colors=one << dib_info.bits_per_pixel;
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->size)
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RectangleInfo
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        geometry;
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickStatusType
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags;
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flags=ParseAbsoluteGeometry(image_info->size,&geometry);
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (flags & WidthValue)
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((geometry.width != 0) && (geometry.width < image->columns))
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->columns=geometry.width;
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (flags & HeightValue)
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((geometry.height != 0) && (geometry.height < image->rows))
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->rows=geometry.height;
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
612acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  status=SetImageExtent(image,image->columns,image->rows,exception);
613acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  if (status == MagickFalse)
614acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy    return(DestroyImageList(image));
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->storage_class == PseudoClass)
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_t
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length,
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        packet_size;
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned char
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *dib_colormap;
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read DIB raster colormap.
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
627018f07f7333b25743d0afff892450cebdb905c1acristy      if (AcquireImageColormap(image,image->colors,exception) == MagickFalse)
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=(size_t) image->colors;
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_colormap=(unsigned char *) AcquireQuantumMemory(length,
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        4*sizeof(*dib_colormap));
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (dib_colormap == (unsigned char *) NULL)
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      packet_size=4;
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      count=ReadBlob(image,packet_size*image->colors,dib_colormap);
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (count != (ssize_t) (packet_size*image->colors))
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile");
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=dib_colormap;
639bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->colormap[i].blue=ScaleCharToQuantum(*p++);
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->colormap[i].green=ScaleCharToQuantum(*p++);
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->colormap[i].red=ScaleCharToQuantum(*p++);
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (packet_size == 4)
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap);
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Read image data.
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (dib_info.compression == BI_RLE4)
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dib_info.bits_per_pixel<<=1;
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32);
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=bytes_per_line*image->rows;
6560553bd5babdbdf65b95f91ed401c98fead17ab54cristy  pixel_info=AcquireVirtualMemory((size_t) image->rows,MagickMax(
6570553bd5babdbdf65b95f91ed401c98fead17ab54cristy    bytes_per_line,image->columns+256UL)*sizeof(*pixels));
6580553bd5babdbdf65b95f91ed401c98fead17ab54cristy  if (pixel_info == (MemoryInfo *) NULL)
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
6600553bd5babdbdf65b95f91ed401c98fead17ab54cristy  pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info);
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((dib_info.compression == BI_RGB) ||
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (dib_info.compression == BI_BITFIELDS))
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      count=ReadBlob(image,length,pixels);
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (count != (ssize_t) (length))
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile");
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert run-length encoded raster pixels.
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=DecodeImage(image,dib_info.compression ? MagickTrue : MagickFalse,
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels);
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CorruptImageError,"UnableToRunlengthDecodeImage");
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize image structure.
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->units=PixelsPerCentimeterResolution;
6822a11befa48257796843468409d77bb8cfb129cdccristy  image->resolution.x=(double) dib_info.x_pixels/100.0;
6832a11befa48257796843468409d77bb8cfb129cdccristy  image->resolution.y=(double) dib_info.y_pixels/100.0;
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert DIB raster image to pixel packets.
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (dib_info.bits_per_pixel)
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 1:
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert bitmap scanline.
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
694bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
698acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
700bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < ((ssize_t) image->columns-7); x+=8)
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (bit=0; bit < 8; bit++)
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7044c08aed51c5899665ade97263692328eea4af106cristy            index=(Quantum) ((*p) & (0x80 >> bit) ? 0x01 : 0x00);
7054c08aed51c5899665ade97263692328eea4af106cristy            SetPixelIndex(image,index,q);
706ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy            q+=GetPixelChannels(image);
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->columns % 8) != 0)
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
712bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (bit=0; bit < (ssize_t) (image->columns % 8); bit++)
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
7144c08aed51c5899665ade97263692328eea4af106cristy              index=(Quantum) ((*p) & (0x80 >> bit) ? 0x01 : 0x00);
7154c08aed51c5899665ade97263692328eea4af106cristy              SetPixelIndex(image,index,q);
716ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(image);
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
730ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 4:
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoColor scanline.
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
738bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
742acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
744bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < ((ssize_t) image->columns-1); x+=2)
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
746c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy          index=ConstrainColormapIndex(image,(*p >> 4) & 0xf,exception);
7474c08aed51c5899665ade97263692328eea4af106cristy          SetPixelIndex(image,index,q);
748ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
749c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy          index=ConstrainColormapIndex(image,*p & 0xf,exception);
7504c08aed51c5899665ade97263692328eea4af106cristy          SetPixelIndex(image,index,q);
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
752ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->columns % 2) != 0)
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
756c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy            index=ConstrainColormapIndex(image,(*p >> 4) & 0xf,exception);
7574c08aed51c5899665ade97263692328eea4af106cristy            SetPixelIndex(image,index,q);
758ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy            q+=GetPixelChannels(image);
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
771ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 8:
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoColor scanline.
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((dib_info.compression == BI_RLE8) ||
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (dib_info.compression == BI_RLE4))
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bytes_per_line=image->columns;
782bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
786acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
788bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
790c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy          index=ConstrainColormapIndex(image,*p,exception);
7914c08aed51c5899665ade97263692328eea4af106cristy          SetPixelIndex(image,index,q);
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
793ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
805ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 16:
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned short
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        word;
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoColor scanline.
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->storage_class=DirectClass;
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (dib_info.compression == BI_RLE8)
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bytes_per_line=2*image->columns;
819bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
823acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
825bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          word=(*p++);
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          word|=(*p++ << 8);
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (dib_info.red_mask == 0)
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8314c08aed51c5899665ade97263692328eea4af106cristy              SetPixelRed(image,ScaleCharToQuantum(ScaleColor5to8(
8324c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 10) & 0x1f))),q);
8334c08aed51c5899665ade97263692328eea4af106cristy              SetPixelGreen(image,ScaleCharToQuantum(ScaleColor5to8(
8344c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 5) & 0x1f))),q);
8354c08aed51c5899665ade97263692328eea4af106cristy              SetPixelBlue(image,ScaleCharToQuantum(ScaleColor5to8(
8364c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) (word & 0x1f))),q);
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8404c08aed51c5899665ade97263692328eea4af106cristy              SetPixelRed(image,ScaleCharToQuantum(ScaleColor5to8(
8414c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 11) & 0x1f))),q);
8424c08aed51c5899665ade97263692328eea4af106cristy              SetPixelGreen(image,ScaleCharToQuantum(ScaleColor6to8(
8434c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 5) & 0x3f))),q);
8444c08aed51c5899665ade97263692328eea4af106cristy              SetPixelBlue(image,ScaleCharToQuantum(ScaleColor5to8(
8454c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) (word & 0x1f))),q);
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
847ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 24:
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 32:
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert DirectColor scanline.
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
867bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
871acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
873bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
8754c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
8764c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
8774c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
87835553db9b7d0d812b53b09e3906628239d908e1ccristy          if (image->alpha_trait == BlendPixelTrait)
8794c08aed51c5899665ade97263692328eea4af106cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
880ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowReaderException(CorruptImageError,"ImproperImageHeader");
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8970553bd5babdbdf65b95f91ed401c98fead17ab54cristy  pixel_info=RelinquishVirtualMemory(pixel_info);
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (EOFBlob(image) != MagickFalse)
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (dib_info.height < 0)
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *flipped_image;
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Correct image orientation.
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flipped_image=FlipImage(image,exception);
910bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy      if (flipped_image != (Image *) NULL)
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
912bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy          DuplicateBlob(flipped_image,image);
913bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy          image=DestroyImage(image);
914bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy          image=flipped_image;
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(image));
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r D I B I m a g e                                           %
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterDIBImage() adds attributes for the DIB image format to
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterDIBImage method is:
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
941bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterDIBImage(void)
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
944bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterDIBImage(void)
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry=SetMagickInfo("DIB");
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadDIBImage;
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteDIBImage;
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsDIB;
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->adjoin=MagickFalse;
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->stealth=MagickTrue;
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->description=ConstantString(
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    "Microsoft Windows 3.X Packed Device-Independent Bitmap");
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->module=ConstantString("DIB");
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r D I B I m a g e                                       %
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterDIBImage() removes format registrations made by the
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DIB module from the list of supported formats.
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterDIBImage method is:
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterDIBImage(void)
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterDIBImage(void)
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("DIB");
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   W r i t e D I B I m a g e                                                 %
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WriteDIBImage() writes an image in Microsoft Windows bitmap encoded
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image format.
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the WriteDIBImage method is:
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10021e178e70fb3c956f9fc1e30c3ba863e882666465cristy%      MagickBooleanType WriteDIBImage(const ImageInfo *image_info,
10031e178e70fb3c956f9fc1e30c3ba863e882666465cristy%        Image *image,ExceptionInfo *exception)
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image:  The image.
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10111e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o exception: return any errors or warnings in this structure.
10121e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
10141e178e70fb3c956f9fc1e30c3ba863e882666465cristystatic MagickBooleanType WriteDIBImage(const ImageInfo *image_info,Image *image,
10151e178e70fb3c956f9fc1e30c3ba863e882666465cristy  ExceptionInfo *exception)
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DIBInfo
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dib_info;
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10234c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1026bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1033ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy  size_t
1034ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy    bytes_per_line;
1035ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy
1036ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy  ssize_t
1037ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy    y;
1038ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *dib_data,
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open output image file.
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image->signature == MagickSignature);
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
10523a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception != (ExceptionInfo *) NULL);
10533a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception->signature == MagickSignature);
10541e178e70fb3c956f9fc1e30c3ba863e882666465cristy  status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize DIB raster file header.
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
1060af8d391906d11f0a1f2bbf4e2adbc4995c852d33cristy  (void) TransformImageColorspace(image,sRGBColorspace,exception);
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->storage_class == DirectClass)
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Full color DIB raster.
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.number_colors=0;
10678a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      dib_info.bits_per_pixel=(unsigned short) (image->alpha_trait ? 32 : 24);
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Colormapped DIB raster.
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.bits_per_pixel=8;
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image_info->depth > 8)
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_info.bits_per_pixel=16;
10771e178e70fb3c956f9fc1e30c3ba863e882666465cristy      if (IsImageMonochrome(image,exception) != MagickFalse)
10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_info.bits_per_pixel=1;
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.number_colors=(dib_info.bits_per_pixel == 16) ? 0 :
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (1UL << dib_info.bits_per_pixel);
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32);
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.size=40;
1084bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  dib_info.width=(ssize_t) image->columns;
1085bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  dib_info.height=(ssize_t) image->rows;
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.planes=1;
1087bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  dib_info.compression=(size_t) (dib_info.bits_per_pixel == 16 ?
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    BI_BITFIELDS : BI_RGB);
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.image_size=bytes_per_line*image->rows;
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.x_pixels=75*39;
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.y_pixels=75*39;
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (image->units)
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case UndefinedResolution:
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PixelsPerInchResolution:
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10972a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.x_pixels=(size_t) (100.0*image->resolution.x/2.54);
10982a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.y_pixels=(size_t) (100.0*image->resolution.y/2.54);
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PixelsPerCentimeterResolution:
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11032a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.x_pixels=(size_t) (100.0*image->resolution.x);
11042a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.y_pixels=(size_t) (100.0*image->resolution.y);
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.colors_important=dib_info.number_colors;
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert MIFF to DIB raster pixels.
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=(unsigned char *) AcquireQuantumMemory(dib_info.image_size,
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*pixels));
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixels == (unsigned char *) NULL)
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(pixels,0,dib_info.image_size);
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (dib_info.bits_per_pixel)
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 1:
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned char
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit,
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte;
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoClass image to a DIB monochrome image.
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1128bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11301e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
11314c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
1136bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte<<=1;
11394c08aed51c5899665ade97263692328eea4af106cristy          byte|=GetPixelIndex(image,p) != 0 ? 0x01 : 0x00;
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
1147ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy           p+=GetPixelChannels(image);
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         }
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         if (bit != 0)
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           {
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             *q++=(unsigned char) (byte << (8-bit));
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             x++;
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           }
1154bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=(ssize_t) (image->columns+7)/8; x < (ssize_t) bytes_per_line; x++)
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=0x00;
1156cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1157ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 8:
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoClass packet to DIB pixel.
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1168bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11701e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
11714c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
1174bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
11754c08aed51c5899665ade97263692328eea4af106cristy        {
11764c08aed51c5899665ade97263692328eea4af106cristy          *q++=(unsigned char) GetPixelIndex(image,p);
1177ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
11784c08aed51c5899665ade97263692328eea4af106cristy        }
1179bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for ( ; x < (ssize_t) bytes_per_line; x++)
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=0x00;
1181cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1182ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 16:
11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned short
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        word;
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoClass packet to DIB pixel.
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1195bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11971e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
11984c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
1201bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          word=(unsigned short) ((ScaleColor8to5((unsigned char)
12044c08aed51c5899665ade97263692328eea4af106cristy            ScaleQuantumToChar(GetPixelRed(image,p))) << 11) | (ScaleColor8to6(
12054c08aed51c5899665ade97263692328eea4af106cristy            (unsigned char) ScaleQuantumToChar(GetPixelGreen(image,p))) << 5) |
12064c08aed51c5899665ade97263692328eea4af106cristy            (ScaleColor8to5((unsigned char) ScaleQuantumToChar((unsigned char)
12074c08aed51c5899665ade97263692328eea4af106cristy            GetPixelBlue(image,p)) << 0)));
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=(unsigned char)(word & 0xff);
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=(unsigned char)(word >> 8);
1210ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1212f6fe0a138e6b5879b6c11a27d715412479acf128cristy        for (x=(ssize_t) (2*image->columns); x < (ssize_t) bytes_per_line; x++)
12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=0x00;
1214cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1215ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 24:
12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 32:
12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert DirectClass packet to DIB RGB pixel.
12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1227bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12291e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
12304c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
1233bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
12354c08aed51c5899665ade97263692328eea4af106cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
12364c08aed51c5899665ade97263692328eea4af106cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
12374c08aed51c5899665ade97263692328eea4af106cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
123835553db9b7d0d812b53b09e3906628239d908e1ccristy          if (image->alpha_trait == BlendPixelTrait)
12394c08aed51c5899665ade97263692328eea4af106cristy            *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
1240ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dib_info.bits_per_pixel == 24)
1243f6fe0a138e6b5879b6c11a27d715412479acf128cristy          for (x=(ssize_t) (3*image->columns); x < (ssize_t) bytes_per_line; x++)
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=0x00;
1245cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1246ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (dib_info.bits_per_pixel == 8)
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image_info->compression != NoCompression)
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size_t
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Convert run-length encoded raster pixels.
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=2UL*(bytes_per_line+2UL)+2UL;
12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_data=(unsigned char *) AcquireQuantumMemory(length,
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (image->rows+2UL)*sizeof(*dib_data));
12654d0ca34912f861b25e5ed95e3f624048cb180358cristy        if (dib_data == (unsigned char *) NULL)
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixels=(unsigned char *) RelinquishMagickMemory(pixels);
12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1270bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        dib_info.image_size=(size_t) EncodeImage(image,bytes_per_line,
12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixels,dib_data);
12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels=(unsigned char *) RelinquishMagickMemory(pixels);
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels=dib_data;
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_info.compression = BI_RLE8;
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write DIB header.
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
1279f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.size);
1280eaedf06777741da32408da72c1e512975c600c48cristy  (void) WriteBlobLSBLong(image,dib_info.width);
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLSBLong(image,(unsigned short) dib_info.height);
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLSBShort(image,(unsigned short) dib_info.planes);
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLSBShort(image,dib_info.bits_per_pixel);
1284f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.compression);
1285f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.image_size);
1286f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.x_pixels);
1287f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.y_pixels);
1288f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.number_colors);
1289f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.colors_important);
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->storage_class == PseudoClass)
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (dib_info.bits_per_pixel <= 8)
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          unsigned char
12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *dib_colormap;
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Dump colormap to file.
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          dib_colormap=(unsigned char *) AcquireQuantumMemory((size_t)
13014d0ca34912f861b25e5ed95e3f624048cb180358cristy            (1UL << dib_info.bits_per_pixel),4*sizeof(*dib_colormap));
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (dib_colormap == (unsigned char *) NULL)
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q=dib_colormap;
1305bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) MagickMin(image->colors,dib_info.number_colors); i++)
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=ScaleQuantumToChar(image->colormap[i].blue);
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=ScaleQuantumToChar(image->colormap[i].green);
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=ScaleQuantumToChar(image->colormap[i].red);
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1312bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for ( ; i < (ssize_t) (1L << dib_info.bits_per_pixel); i++)
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlob(image,(size_t) (4*(1 << dib_info.bits_per_pixel)),
13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dib_colormap);
13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap);
13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((dib_info.bits_per_pixel == 16) &&
13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (dib_info.compression == BI_BITFIELDS))
13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobLSBLong(image,0xf800);
13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobLSBLong(image,0x07e0);
13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobLSBLong(image,0x001f);
13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlob(image,dib_info.image_size,pixels);
13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=(unsigned char *) RelinquishMagickMemory(pixels);
13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1337