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%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/attribute.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap-private.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace.h"
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*/
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType DecodeImage(Image *image,
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const MagickBooleanType compression,unsigned char *pixels)
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14907a3cca00593c795eb8e0427f5bc4c2bcad3f0fbcristy#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__MINGW32__) || defined(__MINGW64__)
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RGB  0
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RLE8  1
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_RLE4  2
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BI_BITFIELDS  3
154f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#undef BI_JPEG
155f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#define BI_JPEG  4
156f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#undef BI_PNG
157f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy#define BI_PNG  5
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count;
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
163bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
166bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p,
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    byte;
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
178e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixels != (unsigned char *) NULL);
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(pixels,0,(size_t) image->columns*image->rows*
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*pixels));
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  byte=0;
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  x=0;
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=pixels;
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=pixels+(size_t) image->columns*image->rows;
188bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; )
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((p < pixels) || (p >= q))
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    count=ReadBlobByte(image);
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (count == EOF)
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (count != 0)
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count=(int) MagickMin((size_t) count,(size_t) (q-p));
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Encoded mode.
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=(unsigned char) ReadBlobByte(image);
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (compression == BI_RLE8)
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < count; i++)
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p++=(unsigned char) byte;
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        else
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (i=0; i < count; i++)
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *p++=(unsigned char)
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f));
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x+=count;
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Escape mode.
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        count=ReadBlobByte(image);
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (count == 0x01)
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return(MagickTrue);
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        switch (count)
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case 0x00:
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              End of line.
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x=0;
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y++;
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=pixels+y*image->columns;
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          case 0x02:
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Delta mode.
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x+=ReadBlobByte(image);
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            y+=ReadBlobByte(image);
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p=pixels+y*image->columns+x;
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          default:
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Absolute mode.
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            count=(int) MagickMin((size_t) count,(size_t) (q-p));
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (compression == BI_RLE8)
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (i=0; i < count; i++)
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *p++=(unsigned char) ReadBlobByte(image);
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              for (i=0; i < count; i++)
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((i & 0x01) == 0)
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  byte=(unsigned char) ReadBlobByte(image);
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                *p++=(unsigned char)
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  ((i & 0x01) != 0 ? (byte & 0x0f) : ((byte >> 4) & 0x0f));
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            x+=count;
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Read pad byte.
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (compression == BI_RLE8)
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              {
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if ((count & 0x01) != 0)
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  (void) ReadBlobByte(image);
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              }
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            else
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (((count & 0x03) == 1) || ((count & 0x03) == 2))
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (void) ReadBlobByte(image);
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            break;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse)
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ReadBlobByte(image);  /* end of line */
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ReadBlobByte(image);
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E n c o d e I m a g e                                                     %
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  EncodeImage compresses pixels using a runlength encoded format.
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the EncodeImage method is:
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    static MagickBooleanType EncodeImage(Image *image,
302bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      const size_t bytes_per_line,const unsigned char *pixels,
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      unsigned char *compressed_pixels)
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image:  The image.
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o bytes_per_line: the number of bytes in a scanline of compressed pixels
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o pixels:  The address of a byte (8 bits) array of pixel data created by
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      the compression process.
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o compressed_pixels:  The address of a byte (8 bits) array of compressed
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      pixel data.
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
318bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t EncodeImage(Image *image,const size_t bytes_per_line,
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char *pixels,unsigned char *compressed_pixels)
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
321bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    y;
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const unsigned char
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
327bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Runlength encode pixels.
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
338e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(pixels != (const unsigned char *) NULL);
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(compressed_pixels != (unsigned char *) NULL);
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=pixels;
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  q=compressed_pixels;
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
346bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
348bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) bytes_per_line; x+=i)
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Determine runlength.
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=1; ((x+i) < (ssize_t) bytes_per_line); i++)
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((*(p+i) != *p) || (i == 255))
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q++=(unsigned char) i;
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *q++=(*p);
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p+=i;
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      End of line.
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q++=0x00;
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q++=0x00;
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SetImageProgress(image,LoadImageTag,y,image->rows) == MagickFalse)
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    End of bitmap.
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q++=0;
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *q++=0x01;
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((size_t) (q-compressed_pixels));
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   I s D I B                                                                 %
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  IsDIB() returns MagickTrue if the image format type, identified by the
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  magick string, is DIB.
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the IsDIB method is:
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType IsDIB(const unsigned char *magick,const size_t length)
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magick: compare image format pattern against these bytes.
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: Specifies the length of the magick string.
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsDIB(const unsigned char *magick,const size_t length)
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length < 2)
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (memcmp(magick,"\050\000",2) == 0)
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d D I B I m a g e                                                   %
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadDIBImage() reads a Microsoft Windows bitmap image file and
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns it.  It allocates the memory necessary for the new Image structure
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  and returns a pointer to the new image.
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadDIBImage method is:
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      image=ReadDIBImage(image_info)
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadDIBImage(const ImageInfo *image_info,ExceptionInfo *exception)
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DIBInfo
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dib_info;
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4470553bd5babdbdf65b95f91ed401c98fead17ab54cristy  MemoryInfo
4480553bd5babdbdf65b95f91ed401c98fead17ab54cristy    *pixel_info;
4490553bd5babdbdf65b95f91ed401c98fead17ab54cristy
4504c08aed51c5899665ade97263692328eea4af106cristy  Quantum
4514c08aed51c5899665ade97263692328eea4af106cristy    index;
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
453bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4564c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
459bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
466ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy    bytes_per_line,
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ssize_t
4704c08aed51c5899665ade97263692328eea4af106cristy    bit,
4714c08aed51c5899665ade97263692328eea4af106cristy    count,
4724c08aed51c5899665ade97263692328eea4af106cristy    y;
4734c08aed51c5899665ade97263692328eea4af106cristy
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open image file.
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
482e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
487e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
4889950d57e1124b73f684fb5946e206994cefda628cristy  image=AcquireImage(image_info,exception);
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image=DestroyImageList(image);
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine if this a DIB file.
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(&dib_info,0,sizeof(dib_info));
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.size=ReadBlobLSBLong(image);
500acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  if (dib_info.size != 40)
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Microsoft Windows 3.X DIB image file.
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
5053e6c553104a29840ba23379ab2dceaca44ac9e79Cristy  dib_info.width=ReadBlobLSBSignedLong(image);
5063e6c553104a29840ba23379ab2dceaca44ac9e79Cristy  dib_info.height=ReadBlobLSBSignedLong(image);
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.planes=ReadBlobLSBShort(image);
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.bits_per_pixel=ReadBlobLSBShort(image);
509f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.bits_per_pixel > 32)
510f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.compression=ReadBlobLSBLong(image);
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.image_size=ReadBlobLSBLong(image);
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.x_pixels=ReadBlobLSBLong(image);
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.y_pixels=ReadBlobLSBLong(image);
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.number_colors=ReadBlobLSBLong(image);
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.colors_important=ReadBlobLSBLong(image);
517ca793d76191054d3659644139269c742c44bcab7cristy  if ((dib_info.bits_per_pixel != 1) && (dib_info.bits_per_pixel != 4) &&
518ca793d76191054d3659644139269c742c44bcab7cristy      (dib_info.bits_per_pixel != 8) && (dib_info.bits_per_pixel != 16) &&
519ca793d76191054d3659644139269c742c44bcab7cristy      (dib_info.bits_per_pixel != 24) && (dib_info.bits_per_pixel != 32))
520ca793d76191054d3659644139269c742c44bcab7cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((dib_info.compression == BI_BITFIELDS) &&
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ((dib_info.bits_per_pixel == 16) || (dib_info.bits_per_pixel == 32)))
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.red_mask=ReadBlobLSBLong(image);
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.green_mask=ReadBlobLSBLong(image);
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.blue_mask=ReadBlobLSBLong(image);
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
528ca793d76191054d3659644139269c742c44bcab7cristy  if (EOFBlob(image) != MagickFalse)
529ca793d76191054d3659644139269c742c44bcab7cristy    ThrowReaderException(CorruptImageError,"UnexpectedEndOfFile");
530f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.width <= 0)
531f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize");
532f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.height == 0)
533f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize");
534f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.planes != 1)
535f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"StaticPlanesValueNotEqualToOne");
536f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.bits_per_pixel != 1) && (dib_info.bits_per_pixel != 4) &&
537f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      (dib_info.bits_per_pixel != 8) && (dib_info.bits_per_pixel != 16) &&
538f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      (dib_info.bits_per_pixel != 24) && (dib_info.bits_per_pixel != 32))
539f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
540f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if (dib_info.bits_per_pixel < 16 &&
5411678aec3bf3630d92b415d39a58f049c16ac055cdirk      dib_info.number_colors > (size_t) (1UL << dib_info.bits_per_pixel))
542f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedNumberOfColors");
543f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.compression == 1) && (dib_info.bits_per_pixel != 8))
544f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
545f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.compression == 2) && (dib_info.bits_per_pixel != 4))
546f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
547f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  if ((dib_info.compression == 3) && (dib_info.bits_per_pixel < 16))
548f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    ThrowReaderException(CorruptImageError,"UnrecognizedBitsPerPixel");
549f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  switch (dib_info.compression)
550f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  {
551f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_RGB:
552f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_RLE8:
553f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_RLE4:
554f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_BITFIELDS:
555f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      break;
556f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_JPEG:
557f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      ThrowReaderException(CoderError,"JPEGCompressNotSupported");
558f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    case BI_PNG:
559f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      ThrowReaderException(CoderError,"PNGCompressNotSupported");
560f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    default:
561f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy      ThrowReaderException(CorruptImageError,"UnrecognizedImageCompression");
562f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  }
563bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  image->columns=(size_t) MagickAbsoluteValue(dib_info.width);
564bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  image->rows=(size_t) MagickAbsoluteValue(dib_info.height);
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->depth=8;
566f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy  image->alpha_trait=dib_info.bits_per_pixel == 32 ? BlendPixelTrait :
567f8dcd77f1fbba9b5f5b8e17cc4b0132919623808cristy    UndefinedPixelTrait;
568ca793d76191054d3659644139269c742c44bcab7cristy  if ((dib_info.number_colors > 256) || (dib_info.colors_important > 256))
569ca793d76191054d3659644139269c742c44bcab7cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((dib_info.number_colors != 0) || (dib_info.bits_per_pixel < 16))
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
572eaedf06777741da32408da72c1e512975c600c48cristy      size_t
573eaedf06777741da32408da72c1e512975c600c48cristy        one;
574eaedf06777741da32408da72c1e512975c600c48cristy
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->storage_class=PseudoClass;
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->colors=dib_info.number_colors;
577eaedf06777741da32408da72c1e512975c600c48cristy      one=1;
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->colors == 0)
579eaedf06777741da32408da72c1e512975c600c48cristy        image->colors=one << dib_info.bits_per_pixel;
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->size)
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RectangleInfo
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        geometry;
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      MagickStatusType
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        flags;
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flags=ParseAbsoluteGeometry(image_info->size,&geometry);
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (flags & WidthValue)
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((geometry.width != 0) && (geometry.width < image->columns))
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->columns=geometry.width;
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (flags & HeightValue)
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((geometry.height != 0) && (geometry.height < image->rows))
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->rows=geometry.height;
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
597acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  status=SetImageExtent(image,image->columns,image->rows,exception);
598acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  if (status == MagickFalse)
599acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy    return(DestroyImageList(image));
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->storage_class == PseudoClass)
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      size_t
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length,
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        packet_size;
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned char
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *dib_colormap;
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Read DIB raster colormap.
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
612018f07f7333b25743d0afff892450cebdb905c1acristy      if (AcquireImageColormap(image,image->colors,exception) == MagickFalse)
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      length=(size_t) image->colors;
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_colormap=(unsigned char *) AcquireQuantumMemory(length,
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        4*sizeof(*dib_colormap));
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (dib_colormap == (unsigned char *) NULL)
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      packet_size=4;
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      count=ReadBlob(image,packet_size*image->colors,dib_colormap);
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (count != (ssize_t) (packet_size*image->colors))
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile");
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      p=dib_colormap;
624bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (i=0; i < (ssize_t) image->colors; i++)
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->colormap[i].blue=ScaleCharToQuantum(*p++);
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->colormap[i].green=ScaleCharToQuantum(*p++);
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->colormap[i].red=ScaleCharToQuantum(*p++);
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (packet_size == 4)
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap);
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Read image data.
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (dib_info.compression == BI_RLE4)
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dib_info.bits_per_pixel<<=1;
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32);
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  length=bytes_per_line*image->rows;
6410553bd5babdbdf65b95f91ed401c98fead17ab54cristy  pixel_info=AcquireVirtualMemory((size_t) image->rows,MagickMax(
6420553bd5babdbdf65b95f91ed401c98fead17ab54cristy    bytes_per_line,image->columns+256UL)*sizeof(*pixels));
6430553bd5babdbdf65b95f91ed401c98fead17ab54cristy  if (pixel_info == (MemoryInfo *) NULL)
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
6450553bd5babdbdf65b95f91ed401c98fead17ab54cristy  pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info);
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((dib_info.compression == BI_RGB) ||
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (dib_info.compression == BI_BITFIELDS))
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      count=ReadBlob(image,length,pixels);
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (count != (ssize_t) (length))
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CorruptImageError,"InsufficientImageDataInFile");
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert run-length encoded raster pixels.
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=DecodeImage(image,dib_info.compression ? MagickTrue : MagickFalse,
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels);
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (status == MagickFalse)
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CorruptImageError,"UnableToRunlengthDecodeImage");
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize image structure.
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->units=PixelsPerCentimeterResolution;
6672a11befa48257796843468409d77bb8cfb129cdccristy  image->resolution.x=(double) dib_info.x_pixels/100.0;
6682a11befa48257796843468409d77bb8cfb129cdccristy  image->resolution.y=(double) dib_info.y_pixels/100.0;
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert DIB raster image to pixel packets.
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (dib_info.bits_per_pixel)
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 1:
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert bitmap scanline.
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
679bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
683acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
685bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < ((ssize_t) image->columns-7); x+=8)
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (bit=0; bit < 8; bit++)
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6894c08aed51c5899665ade97263692328eea4af106cristy            index=(Quantum) ((*p) & (0x80 >> bit) ? 0x01 : 0x00);
6904c08aed51c5899665ade97263692328eea4af106cristy            SetPixelIndex(image,index,q);
691ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy            q+=GetPixelChannels(image);
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->columns % 8) != 0)
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
697bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (bit=0; bit < (ssize_t) (image->columns % 8); bit++)
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
6994c08aed51c5899665ade97263692328eea4af106cristy              index=(Quantum) ((*p) & (0x80 >> bit) ? 0x01 : 0x00);
7004c08aed51c5899665ade97263692328eea4af106cristy              SetPixelIndex(image,index,q);
701ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(image);
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
715ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 4:
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoColor scanline.
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
723bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
727acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
729bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < ((ssize_t) image->columns-1); x+=2)
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
731c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy          index=ConstrainColormapIndex(image,(*p >> 4) & 0xf,exception);
7324c08aed51c5899665ade97263692328eea4af106cristy          SetPixelIndex(image,index,q);
733ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
734c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy          index=ConstrainColormapIndex(image,*p & 0xf,exception);
7354c08aed51c5899665ade97263692328eea4af106cristy          SetPixelIndex(image,index,q);
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
737ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((image->columns % 2) != 0)
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
741c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy            index=ConstrainColormapIndex(image,(*p >> 4) & 0xf,exception);
7424c08aed51c5899665ade97263692328eea4af106cristy            SetPixelIndex(image,index,q);
743ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy            q+=GetPixelChannels(image);
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            p++;
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
756ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 8:
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoColor scanline.
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((dib_info.compression == BI_RLE8) ||
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (dib_info.compression == BI_RLE4))
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bytes_per_line=image->columns;
767bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
771acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
773bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
775c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy          index=ConstrainColormapIndex(image,*p,exception);
7764c08aed51c5899665ade97263692328eea4af106cristy          SetPixelIndex(image,index,q);
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          p++;
778ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
790ea1a8aa04a9fe1500104284407c1cc06d20da699cristy      (void) SyncImage(image,exception);
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 16:
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned short
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        word;
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoColor scanline.
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->storage_class=DirectClass;
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (dib_info.compression == BI_RLE8)
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bytes_per_line=2*image->columns;
804bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
808acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
810bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          word=(*p++);
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          word|=(*p++ << 8);
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (dib_info.red_mask == 0)
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8164c08aed51c5899665ade97263692328eea4af106cristy              SetPixelRed(image,ScaleCharToQuantum(ScaleColor5to8(
8174c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 10) & 0x1f))),q);
8184c08aed51c5899665ade97263692328eea4af106cristy              SetPixelGreen(image,ScaleCharToQuantum(ScaleColor5to8(
8194c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 5) & 0x1f))),q);
8204c08aed51c5899665ade97263692328eea4af106cristy              SetPixelBlue(image,ScaleCharToQuantum(ScaleColor5to8(
8214c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) (word & 0x1f))),q);
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          else
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
8254c08aed51c5899665ade97263692328eea4af106cristy              SetPixelRed(image,ScaleCharToQuantum(ScaleColor5to8(
8264c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 11) & 0x1f))),q);
8274c08aed51c5899665ade97263692328eea4af106cristy              SetPixelGreen(image,ScaleCharToQuantum(ScaleColor6to8(
8284c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) ((word >> 5) & 0x3f))),q);
8294c08aed51c5899665ade97263692328eea4af106cristy              SetPixelBlue(image,ScaleCharToQuantum(ScaleColor5to8(
8304c08aed51c5899665ade97263692328eea4af106cristy                (unsigned char) (word & 0x1f))),q);
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
832ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 24:
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 32:
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert DirectColor scanline.
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
852bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=(ssize_t) image->rows-1; y >= 0; y--)
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        p=pixels+(image->rows-y-1)*bytes_per_line;
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
856acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
858bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
8604c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(image,ScaleCharToQuantum(*p++),q);
8614c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(image,ScaleCharToQuantum(*p++),q);
8624c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(image,ScaleCharToQuantum(*p++),q);
86317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy          if (image->alpha_trait != UndefinedPixelTrait)
8644c08aed51c5899665ade97263692328eea4af106cristy            SetPixelAlpha(image,ScaleCharToQuantum(*p++),q);
865ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image->previous == (Image *) NULL)
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            status=SetImageProgress(image,LoadImageTag,image->rows-y-1,
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->rows);
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if (status == MagickFalse)
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              break;
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    default:
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowReaderException(CorruptImageError,"ImproperImageHeader");
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8820553bd5babdbdf65b95f91ed401c98fead17ab54cristy  pixel_info=RelinquishVirtualMemory(pixel_info);
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (EOFBlob(image) != MagickFalse)
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFileException(exception,CorruptImageError,"UnexpectedEndOfFile",
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (dib_info.height < 0)
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Image
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *flipped_image;
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Correct image orientation.
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      flipped_image=FlipImage(image,exception);
895bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy      if (flipped_image != (Image *) NULL)
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
897bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy          DuplicateBlob(flipped_image,image);
898bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy          image=DestroyImage(image);
899bbfd4cd2bb2c9d59a20738b8cefce4c12307722dcristy          image=flipped_image;
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(image));
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r D I B I m a g e                                           %
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterDIBImage() adds attributes for the DIB image format to
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterDIBImage method is:
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
926bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterDIBImage(void)
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
929bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterDIBImage(void)
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93406b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("DIB","DIB",
93506b627a07ff44e1ff93ef1288c9f428066ded10ddirk    "Microsoft Windows 3.X Packed Device-Independent Bitmap");
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadDIBImage;
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteDIBImage;
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsDIB;
93908e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
94008e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderStealthFlag;
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r D I B I m a g e                                       %
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterDIBImage() removes format registrations made by the
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DIB module from the list of supported formats.
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterDIBImage method is:
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterDIBImage(void)
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterDIBImage(void)
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("DIB");
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   W r i t e D I B I m a g e                                                 %
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WriteDIBImage() writes an image in Microsoft Windows bitmap encoded
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image format.
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the WriteDIBImage method is:
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9851e178e70fb3c956f9fc1e30c3ba863e882666465cristy%      MagickBooleanType WriteDIBImage(const ImageInfo *image_info,
9861e178e70fb3c956f9fc1e30c3ba863e882666465cristy%        Image *image,ExceptionInfo *exception)
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image:  The image.
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9941e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o exception: return any errors or warnings in this structure.
9951e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9971e178e70fb3c956f9fc1e30c3ba863e882666465cristystatic MagickBooleanType WriteDIBImage(const ImageInfo *image_info,Image *image,
9981e178e70fb3c956f9fc1e30c3ba863e882666465cristy  ExceptionInfo *exception)
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  DIBInfo
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    dib_info;
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10064c08aed51c5899665ade97263692328eea4af106cristy  register const Quantum
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1009bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1016ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy  size_t
1017ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy    bytes_per_line;
1018ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy
1019ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy  ssize_t
1020ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy    y;
1021ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *dib_data,
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Open output image file.
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
1030e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
1032e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
10353a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy  assert(exception != (ExceptionInfo *) NULL);
1036e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
10371e178e70fb3c956f9fc1e30c3ba863e882666465cristy  status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception);
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(status);
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize DIB raster file header.
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
1043af8d391906d11f0a1f2bbf4e2adbc4995c852d33cristy  (void) TransformImageColorspace(image,sRGBColorspace,exception);
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->storage_class == DirectClass)
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Full color DIB raster.
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.number_colors=0;
10508a46d827a124555f0c48fb2368ec1bba8e079ab6cristy      dib_info.bits_per_pixel=(unsigned short) (image->alpha_trait ? 32 : 24);
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Colormapped DIB raster.
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.bits_per_pixel=8;
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image_info->depth > 8)
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_info.bits_per_pixel=16;
1060f1d8548abecaf5ca89d453fd9fc0cde77d20672bdirk      if (SetImageMonochrome(image,exception) != MagickFalse)
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_info.bits_per_pixel=1;
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      dib_info.number_colors=(dib_info.bits_per_pixel == 16) ? 0 :
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (1UL << dib_info.bits_per_pixel);
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32);
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.size=40;
1067bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  dib_info.width=(ssize_t) image->columns;
1068bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  dib_info.height=(ssize_t) image->rows;
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.planes=1;
1070bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  dib_info.compression=(size_t) (dib_info.bits_per_pixel == 16 ?
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    BI_BITFIELDS : BI_RGB);
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.image_size=bytes_per_line*image->rows;
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.x_pixels=75*39;
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.y_pixels=75*39;
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (image->units)
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case UndefinedResolution:
10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PixelsPerInchResolution:
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10802a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.x_pixels=(size_t) (100.0*image->resolution.x/2.54);
10812a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.y_pixels=(size_t) (100.0*image->resolution.y/2.54);
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case PixelsPerCentimeterResolution:
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10862a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.x_pixels=(size_t) (100.0*image->resolution.x);
10872a11befa48257796843468409d77bb8cfb129cdccristy      dib_info.y_pixels=(size_t) (100.0*image->resolution.y);
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dib_info.colors_important=dib_info.number_colors;
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert MIFF to DIB raster pixels.
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=(unsigned char *) AcquireQuantumMemory(dib_info.image_size,
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*pixels));
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (pixels == (unsigned char *) NULL)
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(pixels,0,dib_info.image_size);
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  switch (dib_info.bits_per_pixel)
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 1:
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      register unsigned char
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit,
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte;
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoClass image to a DIB monochrome image.
11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1111bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11131e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
11144c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bit=0;
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        byte=0;
1119bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          byte<<=1;
11224c08aed51c5899665ade97263692328eea4af106cristy          byte|=GetPixelIndex(image,p) != 0 ? 0x01 : 0x00;
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          bit++;
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (bit == 8)
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              *q++=byte;
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              bit=0;
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              byte=0;
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
1130ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy           p+=GetPixelChannels(image);
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         }
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         if (bit != 0)
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           {
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             *q++=(unsigned char) (byte << (8-bit));
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             x++;
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           }
1137bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=(ssize_t) (image->columns+7)/8; x < (ssize_t) bytes_per_line; x++)
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=0x00;
1139cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1140ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 8:
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert PseudoClass packet to DIB pixel.
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1151bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11531e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
11544c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
1157bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
11584c08aed51c5899665ade97263692328eea4af106cristy        {
11594c08aed51c5899665ade97263692328eea4af106cristy          *q++=(unsigned char) GetPixelIndex(image,p);
1160ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
11614c08aed51c5899665ade97263692328eea4af106cristy        }
1162bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for ( ; x < (ssize_t) bytes_per_line; x++)
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=0x00;
1164cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1165ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 16:
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      unsigned short
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        word;
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
1176ca793d76191054d3659644139269c742c44bcab7cristy        Convert PseudoClass packet to DIB pixel.
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1178bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11801e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
11814c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
1184bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          word=(unsigned short) ((ScaleColor8to5((unsigned char)
11874c08aed51c5899665ade97263692328eea4af106cristy            ScaleQuantumToChar(GetPixelRed(image,p))) << 11) | (ScaleColor8to6(
11884c08aed51c5899665ade97263692328eea4af106cristy            (unsigned char) ScaleQuantumToChar(GetPixelGreen(image,p))) << 5) |
11894c08aed51c5899665ade97263692328eea4af106cristy            (ScaleColor8to5((unsigned char) ScaleQuantumToChar((unsigned char)
11904c08aed51c5899665ade97263692328eea4af106cristy            GetPixelBlue(image,p)) << 0)));
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=(unsigned char)(word & 0xff);
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=(unsigned char)(word >> 8);
1193ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1195f6fe0a138e6b5879b6c11a27d715412479acf128cristy        for (x=(ssize_t) (2*image->columns); x < (ssize_t) bytes_per_line; x++)
11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          *q++=0x00;
1197cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1198ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 24:
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    case 32:
12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Convert DirectClass packet to DIB RGB pixel.
12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1210bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12121e178e70fb3c956f9fc1e30c3ba863e882666465cristy        p=GetVirtualPixels(image,0,y,image->columns,1,exception);
12134c08aed51c5899665ade97263692328eea4af106cristy        if (p == (const Quantum *) NULL)
12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=pixels+(image->rows-y-1)*bytes_per_line;
1216bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
12184c08aed51c5899665ade97263692328eea4af106cristy          *q++=ScaleQuantumToChar(GetPixelBlue(image,p));
12194c08aed51c5899665ade97263692328eea4af106cristy          *q++=ScaleQuantumToChar(GetPixelGreen(image,p));
12204c08aed51c5899665ade97263692328eea4af106cristy          *q++=ScaleQuantumToChar(GetPixelRed(image,p));
122117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy          if (image->alpha_trait != UndefinedPixelTrait)
12224c08aed51c5899665ade97263692328eea4af106cristy            *q++=ScaleQuantumToChar(GetPixelAlpha(image,p));
1223ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          p+=GetPixelChannels(image);
12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (dib_info.bits_per_pixel == 24)
1226f6fe0a138e6b5879b6c11a27d715412479acf128cristy          for (x=(ssize_t) (3*image->columns); x < (ssize_t) bytes_per_line; x++)
12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=0x00;
1228cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy        status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y,
1229ddbc41b8cf3749a1d8fbad1dd5dede5cb62aabefcristy          image->rows);
12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (status == MagickFalse)
12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (dib_info.bits_per_pixel == 8)
12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image_info->compression != NoCompression)
12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        size_t
12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          length;
12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /*
12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          Convert run-length encoded raster pixels.
12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        */
12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        length=2UL*(bytes_per_line+2UL)+2UL;
12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_data=(unsigned char *) AcquireQuantumMemory(length,
12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (image->rows+2UL)*sizeof(*dib_data));
12484d0ca34912f861b25e5ed95e3f624048cb180358cristy        if (dib_data == (unsigned char *) NULL)
12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            pixels=(unsigned char *) RelinquishMagickMemory(pixels);
12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1253bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        dib_info.image_size=(size_t) EncodeImage(image,bytes_per_line,
12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pixels,dib_data);
12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels=(unsigned char *) RelinquishMagickMemory(pixels);
12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pixels=dib_data;
12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        dib_info.compression = BI_RLE8;
12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Write DIB header.
12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
1262f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.size);
1263eaedf06777741da32408da72c1e512975c600c48cristy  (void) WriteBlobLSBLong(image,dib_info.width);
12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLSBLong(image,(unsigned short) dib_info.height);
12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLSBShort(image,(unsigned short) dib_info.planes);
12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlobLSBShort(image,dib_info.bits_per_pixel);
1267f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.compression);
1268f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.image_size);
1269f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.x_pixels);
1270f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.y_pixels);
1271f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.number_colors);
1272f6fe0a138e6b5879b6c11a27d715412479acf128cristy  (void) WriteBlobLSBLong(image,(unsigned int) dib_info.colors_important);
12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->storage_class == PseudoClass)
12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (dib_info.bits_per_pixel <= 8)
12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          unsigned char
12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *dib_colormap;
12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Dump colormap to file.
12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          dib_colormap=(unsigned char *) AcquireQuantumMemory((size_t)
12844d0ca34912f861b25e5ed95e3f624048cb180358cristy            (1UL << dib_info.bits_per_pixel),4*sizeof(*dib_colormap));
12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          if (dib_colormap == (unsigned char *) NULL)
12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          q=dib_colormap;
1288bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (i=0; i < (ssize_t) MagickMin(image->colors,dib_info.number_colors); i++)
12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=ScaleQuantumToChar(image->colormap[i].blue);
12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=ScaleQuantumToChar(image->colormap[i].green);
12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=ScaleQuantumToChar(image->colormap[i].red);
12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
1295bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for ( ; i < (ssize_t) (1L << dib_info.bits_per_pixel); i++)
12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            *q++=(Quantum) 0x0;
13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) WriteBlob(image,(size_t) (4*(1 << dib_info.bits_per_pixel)),
13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            dib_colormap);
13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap);
13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      else
13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if ((dib_info.bits_per_pixel == 16) &&
13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (dib_info.compression == BI_BITFIELDS))
13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobLSBLong(image,0xf800);
13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobLSBLong(image,0x07e0);
13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            (void) WriteBlobLSBLong(image,0x001f);
13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) WriteBlob(image,dib_info.image_size,pixels);
13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  pixels=(unsigned char *) RelinquishMagickMemory(pixels);
13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1320