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);