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