Index: dib.c
===================================================================
--- dib.c	(revision 3595)
+++ dib.c	(working copy)
@@ -140,7 +140,10 @@
   const MagickBooleanType compression,unsigned char *pixels)
 {
 #if !defined(__WINDOWS__) || defined(__MINGW32__)
-#define BI_RLE8  1
+#define BI_RGB       0
+#define BI_RLE8      1
+#define BI_RLE4      2
+#define BI_BITFIELDS 3
 #endif
 
   int
@@ -523,8 +526,8 @@
   dib_info.y_pixels=ReadBlobLSBLong(image);
   dib_info.number_colors=ReadBlobLSBLong(image);
   dib_info.colors_important=ReadBlobLSBLong(image);
-  if ((dib_info.compression == 3) && ((dib_info.bits_per_pixel == 16) ||
-      (dib_info.bits_per_pixel == 32)))
+  if ((dib_info.compression == BI_BITFIELDS) &&
+      ((dib_info.bits_per_pixel == 16) || (dib_info.bits_per_pixel == 32)))
     {
       dib_info.red_mask=ReadBlobLSBLong(image);
       dib_info.green_mask=ReadBlobLSBLong(image);
@@ -591,7 +594,7 @@
   /*
     Read image data.
   */
-  if (dib_info.compression == 2)
+  if (dib_info.compression == BI_RLE4)
     dib_info.bits_per_pixel<<=1;
   bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32);
   length=bytes_per_line*image->rows;
@@ -599,7 +602,8 @@
     Max(bytes_per_line,image->columns+256)*image->rows*sizeof(*pixels));
   if (pixels == (unsigned char *) NULL)
     ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
-  if ((dib_info.compression == 0) || (dib_info.compression == 3))
+  if ((dib_info.compression == BI_RGB) ||
+      (dib_info.compression == BI_BITFIELDS))
     {
       count=ReadBlob(image,length,pixels);
       if (count != (ssize_t) (length))
@@ -720,7 +724,8 @@
       /*
         Convert PseudoColor scanline.
       */
-      if ((dib_info.compression == 1) || (dib_info.compression == 2))
+      if ((dib_info.compression == BI_RLE8) ||
+          (dib_info.compression == BI_RLE4))
         bytes_per_line=image->columns;
       for (y=(long) image->rows-1; y >= 0; y--)
       {
@@ -760,7 +765,7 @@
         Convert PseudoColor scanline.
       */
       image->storage_class=DirectClass;
-      if (dib_info.compression == 1)
+      if (dib_info.compression == BI_RLE8)
         bytes_per_line=2*image->columns;
       for (y=(long) image->rows-1; y >= 0; y--)
       {
@@ -1014,17 +1019,18 @@
       /*
         Colormapped DIB raster.
       */
-      dib_info.bits_per_pixel=8;
+      dib_info.bits_per_pixel=image_info->depth;
       if (IsMonochromeImage(image,&image->exception))
         dib_info.bits_per_pixel=1;
-      dib_info.number_colors=1 << dib_info.bits_per_pixel;
+      dib_info.number_colors = (dib_info.bits_per_pixel == 16) ? 0 :
+        (1 << dib_info.bits_per_pixel);
     }
   bytes_per_line=4*((image->columns*dib_info.bits_per_pixel+31)/32);
   dib_info.size=40;
   dib_info.width=(long) image->columns;
   dib_info.height=(long) image->rows;
   dib_info.planes=1;
-  dib_info.compression=0;
+  dib_info.compression = dib_info.bits_per_pixel == 16 ? BI_BITFIELDS : 0;
   dib_info.image_size=bytes_per_line*image->rows;
   dib_info.x_pixels=75*39;
   dib_info.y_pixels=75*39;
@@ -1132,6 +1138,42 @@
       }
       break;
     }
+    case 16:
+    {
+      unsigned short
+        word;
+      /*
+        Convert PseudoClass packet to DIB pixel. 
+      */
+      for (y=0; y < (long) image->rows; y++)
+      {
+        p=AcquireImagePixels(image,0,y,image->columns,1,&image->exception);
+        if (p == (const PixelPacket *) NULL)
+          break;
+        q=pixels+(image->rows-y-1)*bytes_per_line;
+        for (x=0; x < (long) image->columns; x++)
+        {
+          word=(ScaleColor8to5(ScaleQuantumToChar(p->red)) << 11) |
+               (ScaleColor8to6(ScaleQuantumToChar(p->green)) << 5) |
+                ScaleColor8to5(ScaleQuantumToChar(p->blue));
+          *q++=(unsigned char)(word & 0xff);
+          *q++=(unsigned char)(word >> 8);
+          p++;
+        }
+        for (x=2*image->columns; x < (long) bytes_per_line; x++)
+          *q++=0x00;
+        if (image->previous == (Image *) NULL)
+          if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
+              (QuantumTick(y,image->rows) != MagickFalse))
+            {
+              status=image->progress_monitor(SaveImageTag,y,image->rows,
+                image->client_data);
+              if (status == MagickFalse)
+                break;
+            }
+      }
+      break;
+    }
     case 24:
     case 32:
     {
@@ -1188,7 +1230,7 @@
         dib_info.image_size=EncodeImage(image,bytes_per_line,pixels,dib_data);
         pixels=(unsigned char *) RelinquishMagickMemory(pixels);
         pixels=dib_data;
-        dib_info.compression=1;
+        dib_info.compression = BI_RLE8;
       }
   /*
     Write DIB header.
@@ -1206,33 +1248,43 @@
   (void) WriteBlobLSBLong(image,dib_info.colors_important);
   if (image->storage_class == PseudoClass)
     {
-      unsigned char
-        *dib_colormap;
+      if (dib_info.bits_per_pixel == 8)
+        {
+          unsigned char
+          *dib_colormap;
 
-      /*
-        Dump colormap to file.
-      */
-      dib_colormap=(unsigned char *)
-        AcquireMagickMemory((size_t) (4*(1 << dib_info.bits_per_pixel)));
-      if (dib_colormap == (unsigned char *) NULL)
-        ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
-      q=dib_colormap;
-      for (i=0; i < (long) Min(image->colors,dib_info.number_colors); i++)
-      {
-        *q++=ScaleQuantumToChar(image->colormap[i].blue);
-        *q++=ScaleQuantumToChar(image->colormap[i].green);
-        *q++=ScaleQuantumToChar(image->colormap[i].red);
-        *q++=(Quantum) 0x0;
-      }
-      for ( ; i < (1L << dib_info.bits_per_pixel); i++)
-      {
-        *q++=(Quantum) 0x0;
-        *q++=(Quantum) 0x0;
-        *q++=(Quantum) 0x0;
-        *q++=(Quantum) 0x0;
-      }
-      (void) WriteBlob(image,4*(1 << dib_info.bits_per_pixel),dib_colormap);
-      dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap);
+          /*
+            Dump colormap to file.
+          */
+          dib_colormap=(unsigned char *)
+            AcquireMagickMemory((size_t) (4*(1 << dib_info.bits_per_pixel)));
+          if (dib_colormap == (unsigned char *) NULL)
+            ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed");
+          q=dib_colormap;
+          for (i=0; i < (long) Min(image->colors,dib_info.number_colors); i++)
+          {
+            *q++=ScaleQuantumToChar(image->colormap[i].blue);
+            *q++=ScaleQuantumToChar(image->colormap[i].green);
+            *q++=ScaleQuantumToChar(image->colormap[i].red);
+            *q++=(Quantum) 0x0;
+          }
+          for ( ; i < (1L << dib_info.bits_per_pixel); i++)
+          {
+            *q++=(Quantum) 0x0;
+            *q++=(Quantum) 0x0;
+            *q++=(Quantum) 0x0;
+            *q++=(Quantum) 0x0;
+          }
+          (void) WriteBlob(image,4*(1 << dib_info.bits_per_pixel),dib_colormap);
+          dib_colormap=(unsigned char *) RelinquishMagickMemory(dib_colormap);
+        }
+      else if (dib_info.bits_per_pixel == 16 &&
+               dib_info.compression == BI_BITFIELDS)
+        {
+          (void) WriteBlobLSBLong(image,0xf800);
+          (void) WriteBlobLSBLong(image,0x07e0);
+          (void) WriteBlobLSBLong(image,0x001f);
+        }
     }
   (void) WriteBlob(image,dib_info.image_size,pixels);
   pixels=(unsigned char *) RelinquishMagickMemory(pixels);