19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * rdbmp.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1994-1996, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains routines to read input images in Microsoft "BMP" 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors). 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Currently, only 8-bit and 24-bit images are supported, not 1-bit or 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 4-bit (feeding such low-depth images into JPEG would be silly anyway). 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Also, we don't support RLE-compressed files. 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These routines may need modification for non-Unix environments or 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * specialized applications. As they stand, they assume input from 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an ordinary stdio stream. They further assume that reading begins 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * at the start of the file; start_input may need work if the 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * user interface has already read some data (e.g., to determine that 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the file is indeed BMP format). 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This code contributed by James Arthur Boucher. 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef BMP_SUPPORTED 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Macros to deal with unsigned chars as efficiently as compiler allows */ 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef HAVE_UNSIGNED_CHAR 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef unsigned char U_CHAR; 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define UCH(x) ((int) (x)) 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else /* !HAVE_UNSIGNED_CHAR */ 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef CHAR_IS_UNSIGNED 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef char U_CHAR; 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define UCH(x) ((int) (x)) 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef char U_CHAR; 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define UCH(x) ((int) (x) & 0xFF) 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* HAVE_UNSIGNED_CHAR */ 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private version of data source object */ 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct _bmp_source_struct * bmp_source_ptr; 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct _bmp_source_struct { 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct cjpeg_source_struct pub; /* public fields */ 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project j_compress_ptr cinfo; /* back link saves passing separate parm */ 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY colormap; /* BMP colormap (converted to my format) */ 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jvirt_sarray_ptr whole_image; /* Needed to reverse row order */ 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION source_row; /* Current source row number */ 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION row_width; /* Physical width of scanlines in file */ 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int bits_per_pixel; /* remembers 8- or 24-bit format */ 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} bmp_source_struct; 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(int) 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_byte (bmp_source_ptr sinfo) 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read next byte from BMP file */ 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register FILE *infile = sinfo->pub.input_file; 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int c; 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((c = getc(infile)) == EOF) 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return c; 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_colormap (bmp_source_ptr sinfo, int cmaplen, int mapentrysize) 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read the colormap from a BMP file */ 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int i; 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (mapentrysize) { 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 3: 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* BGR format (occurs in OS/2 files) */ 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < cmaplen; i++) { 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 4: 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* BGR0 format (occurs in MS Windows files) */ 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < cmaplen; i++) { 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) read_byte(sinfo); 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(sinfo->cinfo, JERR_BMP_BADCMAP); 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Read one row of pixels. 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The image has been read into the whole_image array, but is otherwise 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * unprocessed. We must read it out in top-to-bottom row order, and if 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * it is an 8-bit image, we must expand colormapped pixels to 24bit format. 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION) 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectget_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This version is for reading 8-bit colormap indexes */ 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bmp_source_ptr source = (bmp_source_ptr) sinfo; 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPARRAY colormap = source->colormap; 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY image_ptr; 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int t; 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW inptr, outptr; 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JDIMENSION col; 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch next row from virtual array */ 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->source_row--; 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project image_ptr = (*cinfo->mem->access_virt_sarray) 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, source->whole_image, 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->source_row, (JDIMENSION) 1, FALSE); 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Expand the colormap indexes to real data */ 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr = image_ptr[0]; 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = source->pub.buffer[0]; 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->image_width; col > 0; col--) { 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project t = GETJSAMPLE(*inptr++); 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *outptr++ = colormap[0][t]; /* can omit GETJSAMPLE() safely */ 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *outptr++ = colormap[1][t]; 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *outptr++ = colormap[2][t]; 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return 1; 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION) 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectget_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This version is for reading 24-bit pixels */ 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bmp_source_ptr source = (bmp_source_ptr) sinfo; 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY image_ptr; 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW inptr, outptr; 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JDIMENSION col; 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fetch next row from virtual array */ 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->source_row--; 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project image_ptr = (*cinfo->mem->access_virt_sarray) 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, source->whole_image, 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->source_row, (JDIMENSION) 1, FALSE); 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Transfer data. Note source values are in BGR order 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (even though Microsoft's own documents say the opposite). 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr = image_ptr[0]; 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = source->pub.buffer[0]; 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->image_width; col > 0; col--) { 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[1] = *inptr++; 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[0] = *inptr++; 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr += 3; 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return 1; 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This method loads the image into whole_image during the first call on 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * get_8bit_row or get_24bit_row on subsequent calls. 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION) 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectpreload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bmp_source_ptr source = (bmp_source_ptr) sinfo; 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register FILE *infile = source->pub.input_file; 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int c; 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW out_ptr; 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JSAMPARRAY image_ptr; 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION row, col; 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Read the data into a virtual array in input-file row order. */ 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (row = 0; row < cinfo->image_height; row++) { 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (progress != NULL) { 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->pub.pass_counter = (long) row; 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->pub.pass_limit = (long) cinfo->image_height; 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project image_ptr = (*cinfo->mem->access_virt_sarray) 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, source->whole_image, 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project row, (JDIMENSION) 1, TRUE); 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project out_ptr = image_ptr[0]; 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = source->row_width; col > 0; col--) { 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* inline copy of read_byte() for speed */ 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((c = getc(infile)) == EOF) 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_INPUT_EOF); 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *out_ptr++ = (JSAMPLE) c; 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (progress != NULL) 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->completed_extra_passes++; 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set up to read from the virtual array in top-to-bottom order */ 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (source->bits_per_pixel) { 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 8: 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->pub.get_pixel_rows = get_8bit_row; 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 24: 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->pub.get_pixel_rows = get_24bit_row; 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADDEPTH); 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->source_row = cinfo->image_height; 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* And read the first row */ 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return (*source->pub.get_pixel_rows) (cinfo, sinfo); 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Read the file header; return image size and component count. 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bmp_source_ptr source = (bmp_source_ptr) sinfo; 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project U_CHAR bmpfileheader[14]; 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project U_CHAR bmpinfoheader[64]; 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define GET_2B(array,offset) ((unsigned int) UCH(array[offset]) + \ 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (((unsigned int) UCH(array[offset+1])) << 8)) 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define GET_4B(array,offset) ((INT32) UCH(array[offset]) + \ 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (((INT32) UCH(array[offset+1])) << 8) + \ 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (((INT32) UCH(array[offset+2])) << 16) + \ 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (((INT32) UCH(array[offset+3])) << 24)) 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 bfOffBits; 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 headerSize; 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 biWidth = 0; /* initialize to avoid compiler warning */ 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 biHeight = 0; 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned int biPlanes; 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 biCompression; 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 biXPelsPerMeter,biYPelsPerMeter; 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 biClrUsed = 0; 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int mapentrysize = 0; /* 0 indicates no colormap */ 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project INT32 bPad; 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION row_width; 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Read and verify the bitmap file header */ 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! ReadOK(source->pub.input_file, bmpfileheader, 14)) 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_INPUT_EOF); 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */ 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_NOT); 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bfOffBits = (INT32) GET_4B(bmpfileheader,10); 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We ignore the remaining fileheader fields */ 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows), 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * or 64 bytes (OS/2 2.x). Check the first 4 bytes to find out which. 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! ReadOK(source->pub.input_file, bmpinfoheader, 4)) 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_INPUT_EOF); 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project headerSize = (INT32) GET_4B(bmpinfoheader,0); 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (headerSize < 12 || headerSize > 64) 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADHEADER); 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! ReadOK(source->pub.input_file, bmpinfoheader+4, headerSize-4)) 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_INPUT_EOF); 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch ((int) headerSize) { 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 12: 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */ 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biWidth = (INT32) GET_2B(bmpinfoheader,4); 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biHeight = (INT32) GET_2B(bmpinfoheader,6); 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biPlanes = GET_2B(bmpinfoheader,8); 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->bits_per_pixel = (int) GET_2B(bmpinfoheader,10); 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (source->bits_per_pixel) { 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 8: /* colormapped image */ 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project mapentrysize = 3; /* OS/2 uses RGBTRIPLE colormap */ 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, (int) biWidth, (int) biHeight); 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 24: /* RGB image */ 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS2(cinfo, 1, JTRC_BMP_OS2, (int) biWidth, (int) biHeight); 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADDEPTH); 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (biPlanes != 1) 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADPLANES); 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 40: 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 64: 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */ 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* or OS/2 2.x header, which has additional fields that we ignore */ 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biWidth = GET_4B(bmpinfoheader,4); 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biHeight = GET_4B(bmpinfoheader,8); 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biPlanes = GET_2B(bmpinfoheader,12); 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->bits_per_pixel = (int) GET_2B(bmpinfoheader,14); 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biCompression = GET_4B(bmpinfoheader,16); 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biXPelsPerMeter = GET_4B(bmpinfoheader,24); 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biYPelsPerMeter = GET_4B(bmpinfoheader,28); 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biClrUsed = GET_4B(bmpinfoheader,32); 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* biSizeImage, biClrImportant fields are ignored */ 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project switch (source->bits_per_pixel) { 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 8: /* colormapped image */ 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project mapentrysize = 4; /* Windows uses RGBQUAD colormap */ 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, (int) biWidth, (int) biHeight); 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project case 24: /* RGB image */ 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight); 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADDEPTH); 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (biPlanes != 1) 3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADPLANES); 3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (biCompression != 0) 3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_COMPRESSED); 3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) { 3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set JFIF density parameters from the BMP data */ 3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */ 3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->Y_density = (UINT16) (biYPelsPerMeter/100); 3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->density_unit = 2; /* dots/cm */ 3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project default: 3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADHEADER); 3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Compute distance to bitmap data --- will adjust for colormap below */ 3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bPad = bfOffBits - (headerSize + 14); 3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Read the colormap, if any */ 3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (mapentrysize > 0) { 3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (biClrUsed <= 0) 3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project biClrUsed = 256; /* assume it's 256 */ 3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project else if (biClrUsed > 256) 3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADCMAP); 3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Allocate space to store the colormap */ 3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->colormap = (*cinfo->mem->alloc_sarray) 3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, 3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) biClrUsed, (JDIMENSION) 3); 3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* and read it from the file */ 3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project read_colormap(source, (int) biClrUsed, mapentrysize); 3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* account for size of colormap */ 3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bPad -= biClrUsed * mapentrysize; 3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Skip any remaining pad bytes */ 3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (bPad < 0) /* incorrect bfOffBits value? */ 3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_BMP_BADHEADER); 3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (--bPad >= 0) { 3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) read_byte(source); 3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Compute row width in file, including padding to 4-byte boundary */ 3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (source->bits_per_pixel == 24) 3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project row_width = (JDIMENSION) (biWidth * 3); 3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project else 3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project row_width = (JDIMENSION) biWidth; 3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while ((row_width & 3) != 0) row_width++; 3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->row_width = row_width; 3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Allocate space for inversion array, prepare for preload pass */ 3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->whole_image = (*cinfo->mem->request_virt_sarray) 3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, 3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project row_width, (JDIMENSION) biHeight, (JDIMENSION) 1); 3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->pub.get_pixel_rows = preload_image; 3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->progress != NULL) { 3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; 3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->total_extra_passes++; /* count file input as separate pass */ 3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Allocate one-row buffer for returned data */ 3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->pub.buffer = (*cinfo->mem->alloc_sarray) 3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, 3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (JDIMENSION) (biWidth * 3), (JDIMENSION) 1); 3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->pub.buffer_height = 1; 3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->in_color_space = JCS_RGB; 4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->input_components = 3; 4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->data_precision = 8; 4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->image_width = (JDIMENSION) biWidth; 4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->image_height = (JDIMENSION) biHeight; 4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at the end of the file. 4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* no work */ 4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The module selection routine for BMP format input. 4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(cjpeg_source_ptr) 4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_read_bmp (j_compress_ptr cinfo) 4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project bmp_source_ptr source; 4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create module interface object */ 4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source = (bmp_source_ptr) 4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(bmp_source_struct)); 4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->cinfo = cinfo; /* make back link for subroutines */ 4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Fill in method ptrs, except get_pixel_rows which start_input sets */ 4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->pub.start_input = start_input_bmp; 4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project source->pub.finish_input = finish_input_bmp; 4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return (cjpeg_source_ptr) source; 4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* BMP_SUPPORTED */ 440