OLD | NEW |
1 /* | 1 /* |
2 * rdbmp.c | 2 * rdbmp.c |
3 * | 3 * |
4 * This file was part of the Independent JPEG Group's software: | 4 * This file was part of the Independent JPEG Group's software: |
5 * Copyright (C) 1994-1996, Thomas G. Lane. | 5 * Copyright (C) 1994-1996, Thomas G. Lane. |
6 * Modified 2009-2010 by Guido Vollbeding. | 6 * Modified 2009-2010 by Guido Vollbeding. |
7 * libjpeg-turbo Modifications: | 7 * libjpeg-turbo Modifications: |
8 * Modified 2011 by Siarhei Siamashka. | 8 * Modified 2011 by Siarhei Siamashka. |
9 * For conditions of distribution and use, see the accompanying README file. | 9 * Copyright (C) 2015, D. R. Commander. |
| 10 * For conditions of distribution and use, see the accompanying README.ijg |
| 11 * file. |
10 * | 12 * |
11 * This file contains routines to read input images in Microsoft "BMP" | 13 * This file contains routines to read input images in Microsoft "BMP" |
12 * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors). | 14 * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors). |
13 * Currently, only 8-bit and 24-bit images are supported, not 1-bit or | 15 * Currently, only 8-bit and 24-bit images are supported, not 1-bit or |
14 * 4-bit (feeding such low-depth images into JPEG would be silly anyway). | 16 * 4-bit (feeding such low-depth images into JPEG would be silly anyway). |
15 * Also, we don't support RLE-compressed files. | 17 * Also, we don't support RLE-compressed files. |
16 * | 18 * |
17 * These routines may need modification for non-Unix environments or | 19 * These routines may need modification for non-Unix environments or |
18 * specialized applications. As they stand, they assume input from | 20 * specialized applications. As they stand, they assume input from |
19 * an ordinary stdio stream. They further assume that reading begins | 21 * an ordinary stdio stream. They further assume that reading begins |
20 * at the start of the file; start_input may need work if the | 22 * at the start of the file; start_input may need work if the |
21 * user interface has already read some data (e.g., to determine that | 23 * user interface has already read some data (e.g., to determine that |
22 * the file is indeed BMP format). | 24 * the file is indeed BMP format). |
23 * | 25 * |
24 * This code contributed by James Arthur Boucher. | 26 * This code contributed by James Arthur Boucher. |
25 */ | 27 */ |
26 | 28 |
27 #include "cdjpeg.h"» » /* Common decls for cjpeg/djpeg applications */ | 29 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ |
28 | 30 |
29 #ifdef BMP_SUPPORTED | 31 #ifdef BMP_SUPPORTED |
30 | 32 |
31 | 33 |
32 /* Macros to deal with unsigned chars as efficiently as compiler allows */ | 34 /* Macros to deal with unsigned chars as efficiently as compiler allows */ |
33 | 35 |
34 #ifdef HAVE_UNSIGNED_CHAR | 36 #ifdef HAVE_UNSIGNED_CHAR |
35 typedef unsigned char U_CHAR; | 37 typedef unsigned char U_CHAR; |
36 #define UCH(x)» ((int) (x)) | 38 #define UCH(x) ((int) (x)) |
37 #else /* !HAVE_UNSIGNED_CHAR */ | 39 #else /* !HAVE_UNSIGNED_CHAR */ |
38 #ifdef CHAR_IS_UNSIGNED | 40 #ifdef __CHAR_UNSIGNED__ |
39 typedef char U_CHAR; | 41 typedef char U_CHAR; |
40 #define UCH(x)» ((int) (x)) | 42 #define UCH(x) ((int) (x)) |
41 #else | 43 #else |
42 typedef char U_CHAR; | 44 typedef char U_CHAR; |
43 #define UCH(x)» ((int) (x) & 0xFF) | 45 #define UCH(x) ((int) (x) & 0xFF) |
44 #endif | 46 #endif |
45 #endif /* HAVE_UNSIGNED_CHAR */ | 47 #endif /* HAVE_UNSIGNED_CHAR */ |
46 | 48 |
47 | 49 |
48 #define»ReadOK(file,buffer,len)»(JFREAD(file,buffer,len) == ((size_t) (len))) | 50 #define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) |
49 | 51 |
50 | 52 |
51 /* Private version of data source object */ | 53 /* Private version of data source object */ |
52 | 54 |
53 typedef struct _bmp_source_struct * bmp_source_ptr; | 55 typedef struct _bmp_source_struct *bmp_source_ptr; |
54 | 56 |
55 typedef struct _bmp_source_struct { | 57 typedef struct _bmp_source_struct { |
56 struct cjpeg_source_struct pub; /* public fields */ | 58 struct cjpeg_source_struct pub; /* public fields */ |
57 | 59 |
58 j_compress_ptr cinfo;»» /* back link saves passing separate parm */ | 60 j_compress_ptr cinfo; /* back link saves passing separate parm */ |
59 | 61 |
60 JSAMPARRAY colormap;» » /* BMP colormap (converted to my format) */ | 62 JSAMPARRAY colormap; /* BMP colormap (converted to my format) */ |
61 | 63 |
62 jvirt_sarray_ptr whole_image;»/* Needed to reverse row order */ | 64 jvirt_sarray_ptr whole_image; /* Needed to reverse row order */ |
63 JDIMENSION source_row;» /* Current source row number */ | 65 JDIMENSION source_row; /* Current source row number */ |
64 JDIMENSION row_width;»» /* Physical width of scanlines in file */ | 66 JDIMENSION row_width; /* Physical width of scanlines in file */ |
65 | 67 |
66 int bits_per_pixel;» » /* remembers 8- or 24-bit format */ | 68 int bits_per_pixel; /* remembers 8- or 24-bit format */ |
67 } bmp_source_struct; | 69 } bmp_source_struct; |
68 | 70 |
69 | 71 |
70 LOCAL(int) | 72 LOCAL(int) |
71 read_byte (bmp_source_ptr sinfo) | 73 read_byte (bmp_source_ptr sinfo) |
72 /* Read next byte from BMP file */ | 74 /* Read next byte from BMP file */ |
73 { | 75 { |
74 register FILE *infile = sinfo->pub.input_file; | 76 register FILE *infile = sinfo->pub.input_file; |
75 register int c; | 77 register int c; |
76 | 78 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 source->source_row--; | 135 source->source_row--; |
134 image_ptr = (*cinfo->mem->access_virt_sarray) | 136 image_ptr = (*cinfo->mem->access_virt_sarray) |
135 ((j_common_ptr) cinfo, source->whole_image, | 137 ((j_common_ptr) cinfo, source->whole_image, |
136 source->source_row, (JDIMENSION) 1, FALSE); | 138 source->source_row, (JDIMENSION) 1, FALSE); |
137 | 139 |
138 /* Expand the colormap indexes to real data */ | 140 /* Expand the colormap indexes to real data */ |
139 inptr = image_ptr[0]; | 141 inptr = image_ptr[0]; |
140 outptr = source->pub.buffer[0]; | 142 outptr = source->pub.buffer[0]; |
141 for (col = cinfo->image_width; col > 0; col--) { | 143 for (col = cinfo->image_width; col > 0; col--) { |
142 t = GETJSAMPLE(*inptr++); | 144 t = GETJSAMPLE(*inptr++); |
143 *outptr++ = colormap[0][t];»/* can omit GETJSAMPLE() safely */ | 145 *outptr++ = colormap[0][t]; /* can omit GETJSAMPLE() safely */ |
144 *outptr++ = colormap[1][t]; | 146 *outptr++ = colormap[1][t]; |
145 *outptr++ = colormap[2][t]; | 147 *outptr++ = colormap[2][t]; |
146 } | 148 } |
147 | 149 |
148 return 1; | 150 return 1; |
149 } | 151 } |
150 | 152 |
151 | 153 |
152 METHODDEF(JDIMENSION) | 154 METHODDEF(JDIMENSION) |
153 get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) | 155 get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
154 /* This version is for reading 24-bit pixels */ | 156 /* This version is for reading 24-bit pixels */ |
155 { | 157 { |
156 bmp_source_ptr source = (bmp_source_ptr) sinfo; | 158 bmp_source_ptr source = (bmp_source_ptr) sinfo; |
157 JSAMPARRAY image_ptr; | 159 JSAMPARRAY image_ptr; |
158 register JSAMPROW inptr, outptr; | 160 register JSAMPROW inptr, outptr; |
159 register JDIMENSION col; | 161 register JDIMENSION col; |
160 | 162 |
161 /* Fetch next row from virtual array */ | 163 /* Fetch next row from virtual array */ |
162 source->source_row--; | 164 source->source_row--; |
163 image_ptr = (*cinfo->mem->access_virt_sarray) | 165 image_ptr = (*cinfo->mem->access_virt_sarray) |
164 ((j_common_ptr) cinfo, source->whole_image, | 166 ((j_common_ptr) cinfo, source->whole_image, |
165 source->source_row, (JDIMENSION) 1, FALSE); | 167 source->source_row, (JDIMENSION) 1, FALSE); |
166 | 168 |
167 /* Transfer data. Note source values are in BGR order | 169 /* Transfer data. Note source values are in BGR order |
168 * (even though Microsoft's own documents say the opposite). | 170 * (even though Microsoft's own documents say the opposite). |
169 */ | 171 */ |
170 inptr = image_ptr[0]; | 172 inptr = image_ptr[0]; |
171 outptr = source->pub.buffer[0]; | 173 outptr = source->pub.buffer[0]; |
172 for (col = cinfo->image_width; col > 0; col--) { | 174 for (col = cinfo->image_width; col > 0; col--) { |
173 outptr[2] = *inptr++;» /* can omit GETJSAMPLE() safely */ | 175 outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ |
174 outptr[1] = *inptr++; | 176 outptr[1] = *inptr++; |
175 outptr[0] = *inptr++; | 177 outptr[0] = *inptr++; |
176 outptr += 3; | 178 outptr += 3; |
177 } | 179 } |
178 | 180 |
179 return 1; | 181 return 1; |
180 } | 182 } |
181 | 183 |
182 | 184 |
183 METHODDEF(JDIMENSION) | 185 METHODDEF(JDIMENSION) |
184 get_32bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) | 186 get_32bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
185 /* This version is for reading 32-bit pixels */ | 187 /* This version is for reading 32-bit pixels */ |
186 { | 188 { |
187 bmp_source_ptr source = (bmp_source_ptr) sinfo; | 189 bmp_source_ptr source = (bmp_source_ptr) sinfo; |
188 JSAMPARRAY image_ptr; | 190 JSAMPARRAY image_ptr; |
189 register JSAMPROW inptr, outptr; | 191 register JSAMPROW inptr, outptr; |
190 register JDIMENSION col; | 192 register JDIMENSION col; |
191 | 193 |
192 /* Fetch next row from virtual array */ | 194 /* Fetch next row from virtual array */ |
193 source->source_row--; | 195 source->source_row--; |
194 image_ptr = (*cinfo->mem->access_virt_sarray) | 196 image_ptr = (*cinfo->mem->access_virt_sarray) |
195 ((j_common_ptr) cinfo, source->whole_image, | 197 ((j_common_ptr) cinfo, source->whole_image, |
196 source->source_row, (JDIMENSION) 1, FALSE); | 198 source->source_row, (JDIMENSION) 1, FALSE); |
197 /* Transfer data. Note source values are in BGR order | 199 /* Transfer data. Note source values are in BGR order |
198 * (even though Microsoft's own documents say the opposite). | 200 * (even though Microsoft's own documents say the opposite). |
199 */ | 201 */ |
200 inptr = image_ptr[0]; | 202 inptr = image_ptr[0]; |
201 outptr = source->pub.buffer[0]; | 203 outptr = source->pub.buffer[0]; |
202 for (col = cinfo->image_width; col > 0; col--) { | 204 for (col = cinfo->image_width; col > 0; col--) { |
203 outptr[2] = *inptr++;» /* can omit GETJSAMPLE() safely */ | 205 outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ |
204 outptr[1] = *inptr++; | 206 outptr[1] = *inptr++; |
205 outptr[0] = *inptr++; | 207 outptr[0] = *inptr++; |
206 inptr++;» » » /* skip the 4th byte (Alpha channel) */ | 208 inptr++; /* skip the 4th byte (Alpha channel) */ |
207 outptr += 3; | 209 outptr += 3; |
208 } | 210 } |
209 | 211 |
210 return 1; | 212 return 1; |
211 } | 213 } |
212 | 214 |
213 | 215 |
214 /* | 216 /* |
215 * This method loads the image into whole_image during the first call on | 217 * This method loads the image into whole_image during the first call on |
216 * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call | 218 * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 /* | 274 /* |
273 * Read the file header; return image size and component count. | 275 * Read the file header; return image size and component count. |
274 */ | 276 */ |
275 | 277 |
276 METHODDEF(void) | 278 METHODDEF(void) |
277 start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) | 279 start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) |
278 { | 280 { |
279 bmp_source_ptr source = (bmp_source_ptr) sinfo; | 281 bmp_source_ptr source = (bmp_source_ptr) sinfo; |
280 U_CHAR bmpfileheader[14]; | 282 U_CHAR bmpfileheader[14]; |
281 U_CHAR bmpinfoheader[64]; | 283 U_CHAR bmpinfoheader[64]; |
282 #define GET_2B(array,offset) ((unsigned int) UCH(array[offset]) + \ | 284 #define GET_2B(array,offset) ((unsigned short) UCH(array[offset]) + \ |
283 » » » (((unsigned int) UCH(array[offset+1])) << 8)) | 285 (((unsigned short) UCH(array[offset+1])) << 8)) |
284 #define GET_4B(array,offset) ((INT32) UCH(array[offset]) + \ | 286 #define GET_4B(array,offset) ((unsigned int) UCH(array[offset]) + \ |
285 » » » (((INT32) UCH(array[offset+1])) << 8) + \ | 287 (((unsigned int) UCH(array[offset+1])) << 8) + \ |
286 » » » (((INT32) UCH(array[offset+2])) << 16) + \ | 288 (((unsigned int) UCH(array[offset+2])) << 16) + \ |
287 » » » (((INT32) UCH(array[offset+3])) << 24)) | 289 (((unsigned int) UCH(array[offset+3])) << 24)) |
288 INT32 bfOffBits; | 290 unsigned int bfOffBits; |
289 INT32 headerSize; | 291 unsigned int headerSize; |
290 INT32 biWidth; | 292 int biWidth; |
291 INT32 biHeight; | 293 int biHeight; |
292 unsigned int biPlanes; | 294 unsigned short biPlanes; |
293 INT32 biCompression; | 295 unsigned int biCompression; |
294 INT32 biXPelsPerMeter,biYPelsPerMeter; | 296 int biXPelsPerMeter,biYPelsPerMeter; |
295 INT32 biClrUsed = 0; | 297 unsigned int biClrUsed = 0; |
296 int mapentrysize = 0;»» /* 0 indicates no colormap */ | 298 int mapentrysize = 0; /* 0 indicates no colormap */ |
297 INT32 bPad; | 299 int bPad; |
298 JDIMENSION row_width; | 300 JDIMENSION row_width; |
299 | 301 |
300 /* Read and verify the bitmap file header */ | 302 /* Read and verify the bitmap file header */ |
301 if (! ReadOK(source->pub.input_file, bmpfileheader, 14)) | 303 if (! ReadOK(source->pub.input_file, bmpfileheader, 14)) |
302 ERREXIT(cinfo, JERR_INPUT_EOF); | 304 ERREXIT(cinfo, JERR_INPUT_EOF); |
303 if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */ | 305 if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */ |
304 ERREXIT(cinfo, JERR_BMP_NOT); | 306 ERREXIT(cinfo, JERR_BMP_NOT); |
305 bfOffBits = (INT32) GET_4B(bmpfileheader,10); | 307 bfOffBits = GET_4B(bmpfileheader,10); |
306 /* We ignore the remaining fileheader fields */ | 308 /* We ignore the remaining fileheader fields */ |
307 | 309 |
308 /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows), | 310 /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows), |
309 * or 64 bytes (OS/2 2.x). Check the first 4 bytes to find out which. | 311 * or 64 bytes (OS/2 2.x). Check the first 4 bytes to find out which. |
310 */ | 312 */ |
311 if (! ReadOK(source->pub.input_file, bmpinfoheader, 4)) | 313 if (! ReadOK(source->pub.input_file, bmpinfoheader, 4)) |
312 ERREXIT(cinfo, JERR_INPUT_EOF); | 314 ERREXIT(cinfo, JERR_INPUT_EOF); |
313 headerSize = (INT32) GET_4B(bmpinfoheader,0); | 315 headerSize = GET_4B(bmpinfoheader,0); |
314 if (headerSize < 12 || headerSize > 64) | 316 if (headerSize < 12 || headerSize > 64) |
315 ERREXIT(cinfo, JERR_BMP_BADHEADER); | 317 ERREXIT(cinfo, JERR_BMP_BADHEADER); |
316 if (! ReadOK(source->pub.input_file, bmpinfoheader+4, headerSize-4)) | 318 if (! ReadOK(source->pub.input_file, bmpinfoheader+4, headerSize-4)) |
317 ERREXIT(cinfo, JERR_INPUT_EOF); | 319 ERREXIT(cinfo, JERR_INPUT_EOF); |
318 | 320 |
319 switch ((int) headerSize) { | 321 switch (headerSize) { |
320 case 12: | 322 case 12: |
321 /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */ | 323 /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */ |
322 biWidth = (INT32) GET_2B(bmpinfoheader,4); | 324 biWidth = (int) GET_2B(bmpinfoheader,4); |
323 biHeight = (INT32) GET_2B(bmpinfoheader,6); | 325 biHeight = (int) GET_2B(bmpinfoheader,6); |
324 biPlanes = GET_2B(bmpinfoheader,8); | 326 biPlanes = GET_2B(bmpinfoheader,8); |
325 source->bits_per_pixel = (int) GET_2B(bmpinfoheader,10); | 327 source->bits_per_pixel = (int) GET_2B(bmpinfoheader,10); |
326 | 328 |
327 switch (source->bits_per_pixel) { | 329 switch (source->bits_per_pixel) { |
328 case 8:» » » /* colormapped image */ | 330 case 8: /* colormapped image */ |
329 mapentrysize = 3;»» /* OS/2 uses RGBTRIPLE colormap */ | 331 mapentrysize = 3; /* OS/2 uses RGBTRIPLE colormap */ |
330 TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, (int) biWidth, (int) biHeight); | 332 TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, biWidth, biHeight); |
331 break; | 333 break; |
332 case 24:» » » /* RGB image */ | 334 case 24: /* RGB image */ |
333 TRACEMS2(cinfo, 1, JTRC_BMP_OS2, (int) biWidth, (int) biHeight); | 335 TRACEMS2(cinfo, 1, JTRC_BMP_OS2, biWidth, biHeight); |
334 break; | 336 break; |
335 default: | 337 default: |
336 ERREXIT(cinfo, JERR_BMP_BADDEPTH); | 338 ERREXIT(cinfo, JERR_BMP_BADDEPTH); |
337 break; | 339 break; |
338 } | 340 } |
339 break; | 341 break; |
340 case 40: | 342 case 40: |
341 case 64: | 343 case 64: |
342 /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */ | 344 /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */ |
343 /* or OS/2 2.x header, which has additional fields that we ignore */ | 345 /* or OS/2 2.x header, which has additional fields that we ignore */ |
344 biWidth = GET_4B(bmpinfoheader,4); | 346 biWidth = (int) GET_4B(bmpinfoheader,4); |
345 biHeight = GET_4B(bmpinfoheader,8); | 347 biHeight = (int) GET_4B(bmpinfoheader,8); |
346 biPlanes = GET_2B(bmpinfoheader,12); | 348 biPlanes = GET_2B(bmpinfoheader,12); |
347 source->bits_per_pixel = (int) GET_2B(bmpinfoheader,14); | 349 source->bits_per_pixel = (int) GET_2B(bmpinfoheader,14); |
348 biCompression = GET_4B(bmpinfoheader,16); | 350 biCompression = GET_4B(bmpinfoheader,16); |
349 biXPelsPerMeter = GET_4B(bmpinfoheader,24); | 351 biXPelsPerMeter = (int) GET_4B(bmpinfoheader,24); |
350 biYPelsPerMeter = GET_4B(bmpinfoheader,28); | 352 biYPelsPerMeter = (int) GET_4B(bmpinfoheader,28); |
351 biClrUsed = GET_4B(bmpinfoheader,32); | 353 biClrUsed = GET_4B(bmpinfoheader,32); |
352 /* biSizeImage, biClrImportant fields are ignored */ | 354 /* biSizeImage, biClrImportant fields are ignored */ |
353 | 355 |
354 switch (source->bits_per_pixel) { | 356 switch (source->bits_per_pixel) { |
355 case 8:» » » /* colormapped image */ | 357 case 8: /* colormapped image */ |
356 mapentrysize = 4;»» /* Windows uses RGBQUAD colormap */ | 358 mapentrysize = 4; /* Windows uses RGBQUAD colormap */ |
357 TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, (int) biWidth, (int) biHeight); | 359 TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, biWidth, biHeight); |
358 break; | 360 break; |
359 case 24:» » » /* RGB image */ | 361 case 24: /* RGB image */ |
360 TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight); | 362 TRACEMS2(cinfo, 1, JTRC_BMP, biWidth, biHeight); |
361 break; | 363 break; |
362 case 32:» » » /* RGB image + Alpha channel */ | 364 case 32: /* RGB image + Alpha channel */ |
363 TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight); | 365 TRACEMS2(cinfo, 1, JTRC_BMP, biWidth, biHeight); |
364 break; | 366 break; |
365 default: | 367 default: |
366 ERREXIT(cinfo, JERR_BMP_BADDEPTH); | 368 ERREXIT(cinfo, JERR_BMP_BADDEPTH); |
367 break; | 369 break; |
368 } | 370 } |
369 if (biCompression != 0) | 371 if (biCompression != 0) |
370 ERREXIT(cinfo, JERR_BMP_COMPRESSED); | 372 ERREXIT(cinfo, JERR_BMP_COMPRESSED); |
371 | 373 |
372 if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) { | 374 if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) { |
373 /* Set JFIF density parameters from the BMP data */ | 375 /* Set JFIF density parameters from the BMP data */ |
374 cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */ | 376 cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */ |
375 cinfo->Y_density = (UINT16) (biYPelsPerMeter/100); | 377 cinfo->Y_density = (UINT16) (biYPelsPerMeter/100); |
376 cinfo->density_unit = 2;» /* dots/cm */ | 378 cinfo->density_unit = 2; /* dots/cm */ |
377 } | 379 } |
378 break; | 380 break; |
379 default: | 381 default: |
380 ERREXIT(cinfo, JERR_BMP_BADHEADER); | 382 ERREXIT(cinfo, JERR_BMP_BADHEADER); |
381 return; | 383 return; |
382 } | 384 } |
383 | 385 |
384 if (biWidth <= 0 || biHeight <= 0) | 386 if (biWidth <= 0 || biHeight <= 0) |
385 ERREXIT(cinfo, JERR_BMP_EMPTY); | 387 ERREXIT(cinfo, JERR_BMP_EMPTY); |
386 if (biPlanes != 1) | 388 if (biPlanes != 1) |
387 ERREXIT(cinfo, JERR_BMP_BADPLANES); | 389 ERREXIT(cinfo, JERR_BMP_BADPLANES); |
388 | 390 |
389 /* Compute distance to bitmap data --- will adjust for colormap below */ | 391 /* Compute distance to bitmap data --- will adjust for colormap below */ |
390 bPad = bfOffBits - (headerSize + 14); | 392 bPad = bfOffBits - (headerSize + 14); |
391 | 393 |
392 /* Read the colormap, if any */ | 394 /* Read the colormap, if any */ |
393 if (mapentrysize > 0) { | 395 if (mapentrysize > 0) { |
394 if (biClrUsed <= 0) | 396 if (biClrUsed <= 0) |
395 biClrUsed = 256;» » /* assume it's 256 */ | 397 biClrUsed = 256; /* assume it's 256 */ |
396 else if (biClrUsed > 256) | 398 else if (biClrUsed > 256) |
397 ERREXIT(cinfo, JERR_BMP_BADCMAP); | 399 ERREXIT(cinfo, JERR_BMP_BADCMAP); |
398 /* Allocate space to store the colormap */ | 400 /* Allocate space to store the colormap */ |
399 source->colormap = (*cinfo->mem->alloc_sarray) | 401 source->colormap = (*cinfo->mem->alloc_sarray) |
400 ((j_common_ptr) cinfo, JPOOL_IMAGE, | 402 ((j_common_ptr) cinfo, JPOOL_IMAGE, |
401 (JDIMENSION) biClrUsed, (JDIMENSION) 3); | 403 (JDIMENSION) biClrUsed, (JDIMENSION) 3); |
402 /* and read it from the file */ | 404 /* and read it from the file */ |
403 read_colormap(source, (int) biClrUsed, mapentrysize); | 405 read_colormap(source, (int) biClrUsed, mapentrysize); |
404 /* account for size of colormap */ | 406 /* account for size of colormap */ |
405 bPad -= biClrUsed * mapentrysize; | 407 bPad -= biClrUsed * mapentrysize; |
406 } | 408 } |
407 | 409 |
408 /* Skip any remaining pad bytes */ | 410 /* Skip any remaining pad bytes */ |
409 if (bPad < 0)»» » /* incorrect bfOffBits value? */ | 411 if (bPad < 0) /* incorrect bfOffBits value? */ |
410 ERREXIT(cinfo, JERR_BMP_BADHEADER); | 412 ERREXIT(cinfo, JERR_BMP_BADHEADER); |
411 while (--bPad >= 0) { | 413 while (--bPad >= 0) { |
412 (void) read_byte(source); | 414 (void) read_byte(source); |
413 } | 415 } |
414 | 416 |
415 /* Compute row width in file, including padding to 4-byte boundary */ | 417 /* Compute row width in file, including padding to 4-byte boundary */ |
416 if (source->bits_per_pixel == 24) | 418 if (source->bits_per_pixel == 24) |
417 row_width = (JDIMENSION) (biWidth * 3); | 419 row_width = (JDIMENSION) (biWidth * 3); |
418 else if (source->bits_per_pixel == 32) | 420 else if (source->bits_per_pixel == 32) |
419 row_width = (JDIMENSION) (biWidth * 4); | 421 row_width = (JDIMENSION) (biWidth * 4); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 */ | 464 */ |
463 | 465 |
464 GLOBAL(cjpeg_source_ptr) | 466 GLOBAL(cjpeg_source_ptr) |
465 jinit_read_bmp (j_compress_ptr cinfo) | 467 jinit_read_bmp (j_compress_ptr cinfo) |
466 { | 468 { |
467 bmp_source_ptr source; | 469 bmp_source_ptr source; |
468 | 470 |
469 /* Create module interface object */ | 471 /* Create module interface object */ |
470 source = (bmp_source_ptr) | 472 source = (bmp_source_ptr) |
471 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, | 473 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, |
472 » » » » SIZEOF(bmp_source_struct)); | 474 sizeof(bmp_source_struct)); |
473 source->cinfo = cinfo;» /* make back link for subroutines */ | 475 source->cinfo = cinfo; /* make back link for subroutines */ |
474 /* Fill in method ptrs, except get_pixel_rows which start_input sets */ | 476 /* Fill in method ptrs, except get_pixel_rows which start_input sets */ |
475 source->pub.start_input = start_input_bmp; | 477 source->pub.start_input = start_input_bmp; |
476 source->pub.finish_input = finish_input_bmp; | 478 source->pub.finish_input = finish_input_bmp; |
477 | 479 |
478 return (cjpeg_source_ptr) source; | 480 return (cjpeg_source_ptr) source; |
479 } | 481 } |
480 | 482 |
481 #endif /* BMP_SUPPORTED */ | 483 #endif /* BMP_SUPPORTED */ |
OLD | NEW |