| Index: third_party/libjpeg_turbo/rdbmp.c
|
| ===================================================================
|
| --- third_party/libjpeg_turbo/rdbmp.c (revision 95020)
|
| +++ third_party/libjpeg_turbo/rdbmp.c (working copy)
|
| @@ -2,6 +2,8 @@
|
| * rdbmp.c
|
| *
|
| * Copyright (C) 1994-1996, Thomas G. Lane.
|
| + * Modified 2009-2010 by Guido Vollbeding.
|
| + * Modified 2011 by Siarhei Siamashka.
|
| * This file is part of the Independent JPEG Group's software.
|
| * For conditions of distribution and use, see the accompanying README file.
|
| *
|
| @@ -177,10 +179,41 @@
|
| }
|
|
|
|
|
| +METHODDEF(JDIMENSION)
|
| +get_32bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
|
| +/* This version is for reading 32-bit pixels */
|
| +{
|
| + bmp_source_ptr source = (bmp_source_ptr) sinfo;
|
| + JSAMPARRAY image_ptr;
|
| + register JSAMPROW inptr, outptr;
|
| + register JDIMENSION col;
|
| +
|
| + /* Fetch next row from virtual array */
|
| + source->source_row--;
|
| + image_ptr = (*cinfo->mem->access_virt_sarray)
|
| + ((j_common_ptr) cinfo, source->whole_image,
|
| + source->source_row, (JDIMENSION) 1, FALSE);
|
| + /* Transfer data. Note source values are in BGR order
|
| + * (even though Microsoft's own documents say the opposite).
|
| + */
|
| + inptr = image_ptr[0];
|
| + outptr = source->pub.buffer[0];
|
| + for (col = cinfo->image_width; col > 0; col--) {
|
| + outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */
|
| + outptr[1] = *inptr++;
|
| + outptr[0] = *inptr++;
|
| + inptr++; /* skip the 4th byte (Alpha channel) */
|
| + outptr += 3;
|
| + }
|
| +
|
| + return 1;
|
| +}
|
| +
|
| +
|
| /*
|
| * This method loads the image into whole_image during the first call on
|
| * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call
|
| - * get_8bit_row or get_24bit_row on subsequent calls.
|
| + * get_8bit_row, get_24bit_row, or get_32bit_row on subsequent calls.
|
| */
|
|
|
| METHODDEF(JDIMENSION)
|
| @@ -188,10 +221,9 @@
|
| {
|
| bmp_source_ptr source = (bmp_source_ptr) sinfo;
|
| register FILE *infile = source->pub.input_file;
|
| - register int c;
|
| register JSAMPROW out_ptr;
|
| JSAMPARRAY image_ptr;
|
| - JDIMENSION row, col;
|
| + JDIMENSION row;
|
| cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;
|
|
|
| /* Read the data into a virtual array in input-file row order. */
|
| @@ -205,11 +237,11 @@
|
| ((j_common_ptr) cinfo, source->whole_image,
|
| row, (JDIMENSION) 1, TRUE);
|
| out_ptr = image_ptr[0];
|
| - for (col = source->row_width; col > 0; col--) {
|
| - /* inline copy of read_byte() for speed */
|
| - if ((c = getc(infile)) == EOF)
|
| - ERREXIT(cinfo, JERR_INPUT_EOF);
|
| - *out_ptr++ = (JSAMPLE) c;
|
| + if (fread(out_ptr, 1, source->row_width, infile) != source->row_width) {
|
| + if (feof(infile))
|
| + ERREXIT(cinfo, JERR_INPUT_EOF);
|
| + else
|
| + ERREXIT(cinfo, JERR_FILE_READ);
|
| }
|
| }
|
| if (progress != NULL)
|
| @@ -223,6 +255,9 @@
|
| case 24:
|
| source->pub.get_pixel_rows = get_24bit_row;
|
| break;
|
| + case 32:
|
| + source->pub.get_pixel_rows = get_32bit_row;
|
| + break;
|
| default:
|
| ERREXIT(cinfo, JERR_BMP_BADDEPTH);
|
| }
|
| @@ -251,8 +286,8 @@
|
| (((INT32) UCH(array[offset+3])) << 24))
|
| INT32 bfOffBits;
|
| INT32 headerSize;
|
| - INT32 biWidth = 0; /* initialize to avoid compiler warning */
|
| - INT32 biHeight = 0;
|
| + INT32 biWidth;
|
| + INT32 biHeight;
|
| unsigned int biPlanes;
|
| INT32 biCompression;
|
| INT32 biXPelsPerMeter,biYPelsPerMeter;
|
| @@ -300,8 +335,6 @@
|
| ERREXIT(cinfo, JERR_BMP_BADDEPTH);
|
| break;
|
| }
|
| - if (biPlanes != 1)
|
| - ERREXIT(cinfo, JERR_BMP_BADPLANES);
|
| break;
|
| case 40:
|
| case 64:
|
| @@ -325,12 +358,13 @@
|
| case 24: /* RGB image */
|
| TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight);
|
| break;
|
| + case 32: /* RGB image + Alpha channel */
|
| + TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight);
|
| + break;
|
| default:
|
| ERREXIT(cinfo, JERR_BMP_BADDEPTH);
|
| break;
|
| }
|
| - if (biPlanes != 1)
|
| - ERREXIT(cinfo, JERR_BMP_BADPLANES);
|
| if (biCompression != 0)
|
| ERREXIT(cinfo, JERR_BMP_COMPRESSED);
|
|
|
| @@ -343,9 +377,14 @@
|
| break;
|
| default:
|
| ERREXIT(cinfo, JERR_BMP_BADHEADER);
|
| - break;
|
| + return;
|
| }
|
|
|
| + if (biWidth <= 0 || biHeight <= 0)
|
| + ERREXIT(cinfo, JERR_BMP_EMPTY);
|
| + if (biPlanes != 1)
|
| + ERREXIT(cinfo, JERR_BMP_BADPLANES);
|
| +
|
| /* Compute distance to bitmap data --- will adjust for colormap below */
|
| bPad = bfOffBits - (headerSize + 14);
|
|
|
| @@ -375,6 +414,8 @@
|
| /* Compute row width in file, including padding to 4-byte boundary */
|
| if (source->bits_per_pixel == 24)
|
| row_width = (JDIMENSION) (biWidth * 3);
|
| + else if (source->bits_per_pixel == 32)
|
| + row_width = (JDIMENSION) (biWidth * 4);
|
| else
|
| row_width = (JDIMENSION) biWidth;
|
| while ((row_width & 3) != 0) row_width++;
|
|
|