170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * rdbmp.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1994-1996, Thomas G. Lane. 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software. 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file. 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains routines to read input images in Microsoft "BMP" 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors). 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Currently, only 8-bit and 24-bit images are supported, not 1-bit or 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 4-bit (feeding such low-depth images into JPEG would be silly anyway). 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Also, we don't support RLE-compressed files. 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * These routines may need modification for non-Unix environments or 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * specialized applications. As they stand, they assume input from 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * an ordinary stdio stream. They further assume that reading begins 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * at the start of the file; start_input may need work if the 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * user interface has already read some data (e.g., to determine that 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the file is indeed BMP format). 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This code contributed by James Arthur Boucher. 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef BMP_SUPPORTED 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Macros to deal with unsigned chars as efficiently as compiler allows */ 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef HAVE_UNSIGNED_CHAR 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef unsigned char U_CHAR; 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define UCH(x) ((int) (x)) 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else /* !HAVE_UNSIGNED_CHAR */ 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef CHAR_IS_UNSIGNED 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef char U_CHAR; 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define UCH(x) ((int) (x)) 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef char U_CHAR; 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define UCH(x) ((int) (x) & 0xFF) 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* HAVE_UNSIGNED_CHAR */ 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private version of data source object */ 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct _bmp_source_struct * bmp_source_ptr; 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct _bmp_source_struct { 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct cjpeg_source_struct pub; /* public fields */ 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine j_compress_ptr cinfo; /* back link saves passing separate parm */ 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY colormap; /* BMP colormap (converted to my format) */ 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jvirt_sarray_ptr whole_image; /* Needed to reverse row order */ 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION source_row; /* Current source row number */ 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION row_width; /* Physical width of scanlines in file */ 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int bits_per_pixel; /* remembers 8- or 24-bit format */ 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} bmp_source_struct; 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(int) 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_byte (bmp_source_ptr sinfo) 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read next byte from BMP file */ 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register FILE *infile = sinfo->pub.input_file; 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int c; 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((c = getc(infile)) == EOF) 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(sinfo->cinfo, JERR_INPUT_EOF); 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return c; 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(void) 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_colormap (bmp_source_ptr sinfo, int cmaplen, int mapentrysize) 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read the colormap from a BMP file */ 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int i; 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (mapentrysize) { 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 3: 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* BGR format (occurs in OS/2 files) */ 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < cmaplen; i++) { 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 4: 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* BGR0 format (occurs in MS Windows files) */ 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 0; i < cmaplen; i++) { 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo); 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo); 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo); 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (void) read_byte(sinfo); 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(sinfo->cinfo, JERR_BMP_BADCMAP); 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Read one row of pixels. 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The image has been read into the whole_image array, but is otherwise 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * unprocessed. We must read it out in top-to-bottom row order, and if 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * it is an 8-bit image, we must expand colormapped pixels to 24bit format. 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading 8-bit colormap indexes */ 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bmp_source_ptr source = (bmp_source_ptr) sinfo; 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPARRAY colormap = source->colormap; 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY image_ptr; 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int t; 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW inptr, outptr; 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JDIMENSION col; 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch next row from virtual array */ 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->source_row--; 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine image_ptr = (*cinfo->mem->access_virt_sarray) 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, source->whole_image, 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->source_row, (JDIMENSION) 1, FALSE); 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Expand the colormap indexes to real data */ 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr = image_ptr[0]; 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr = source->pub.buffer[0]; 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine t = GETJSAMPLE(*inptr++); 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *outptr++ = colormap[0][t]; /* can omit GETJSAMPLE() safely */ 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *outptr++ = colormap[1][t]; 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *outptr++ = colormap[2][t]; 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading 24-bit pixels */ 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bmp_source_ptr source = (bmp_source_ptr) sinfo; 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY image_ptr; 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW inptr, outptr; 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JDIMENSION col; 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fetch next row from virtual array */ 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->source_row--; 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine image_ptr = (*cinfo->mem->access_virt_sarray) 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, source->whole_image, 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->source_row, (JDIMENSION) 1, FALSE); 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Transfer data. Note source values are in BGR order 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (even though Microsoft's own documents say the opposite). 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine inptr = image_ptr[0]; 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr = source->pub.buffer[0]; 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */ 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[1] = *inptr++; 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr[0] = *inptr++; 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine outptr += 3; 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This method loads the image into whole_image during the first call on 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * get_8bit_row or get_24bit_row on subsequent calls. 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinepreload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bmp_source_ptr source = (bmp_source_ptr) sinfo; 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register FILE *infile = source->pub.input_file; 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int c; 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW out_ptr; 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPARRAY image_ptr; 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION row, col; 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Read the data into a virtual array in input-file row order. */ 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (row = 0; row < cinfo->image_height; row++) { 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (progress != NULL) { 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progress->pub.pass_counter = (long) row; 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progress->pub.pass_limit = (long) cinfo->image_height; 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*progress->pub.progress_monitor) ((j_common_ptr) cinfo); 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine image_ptr = (*cinfo->mem->access_virt_sarray) 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, source->whole_image, 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine row, (JDIMENSION) 1, TRUE); 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine out_ptr = image_ptr[0]; 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = source->row_width; col > 0; col--) { 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* inline copy of read_byte() for speed */ 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((c = getc(infile)) == EOF) 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *out_ptr++ = (JSAMPLE) c; 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (progress != NULL) 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progress->completed_extra_passes++; 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set up to read from the virtual array in top-to-bottom order */ 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (source->bits_per_pixel) { 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 8: 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_8bit_row; 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 24: 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_24bit_row; 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADDEPTH); 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->source_row = cinfo->image_height; 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* And read the first row */ 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return (*source->pub.get_pixel_rows) (cinfo, sinfo); 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Read the file header; return image size and component count. 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bmp_source_ptr source = (bmp_source_ptr) sinfo; 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine U_CHAR bmpfileheader[14]; 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine U_CHAR bmpinfoheader[64]; 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define GET_2B(array,offset) ((unsigned int) UCH(array[offset]) + \ 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (((unsigned int) UCH(array[offset+1])) << 8)) 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define GET_4B(array,offset) ((INT32) UCH(array[offset]) + \ 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (((INT32) UCH(array[offset+1])) << 8) + \ 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (((INT32) UCH(array[offset+2])) << 16) + \ 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (((INT32) UCH(array[offset+3])) << 24)) 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 bfOffBits; 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 headerSize; 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 biWidth = 0; /* initialize to avoid compiler warning */ 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 biHeight = 0; 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int biPlanes; 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 biCompression; 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 biXPelsPerMeter,biYPelsPerMeter; 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 biClrUsed = 0; 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int mapentrysize = 0; /* 0 indicates no colormap */ 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 bPad; 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION row_width; 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Read and verify the bitmap file header */ 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, bmpfileheader, 14)) 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */ 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_NOT); 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bfOffBits = (INT32) GET_4B(bmpfileheader,10); 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* We ignore the remaining fileheader fields */ 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows), 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * or 64 bytes (OS/2 2.x). Check the first 4 bytes to find out which. 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, bmpinfoheader, 4)) 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine headerSize = (INT32) GET_4B(bmpinfoheader,0); 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (headerSize < 12 || headerSize > 64) 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADHEADER); 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, bmpinfoheader+4, headerSize-4)) 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch ((int) headerSize) { 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 12: 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */ 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biWidth = (INT32) GET_2B(bmpinfoheader,4); 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biHeight = (INT32) GET_2B(bmpinfoheader,6); 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biPlanes = GET_2B(bmpinfoheader,8); 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->bits_per_pixel = (int) GET_2B(bmpinfoheader,10); 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (source->bits_per_pixel) { 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 8: /* colormapped image */ 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine mapentrysize = 3; /* OS/2 uses RGBTRIPLE colormap */ 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, (int) biWidth, (int) biHeight); 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 24: /* RGB image */ 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_BMP_OS2, (int) biWidth, (int) biHeight); 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADDEPTH); 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (biPlanes != 1) 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADPLANES); 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 40: 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 64: 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */ 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* or OS/2 2.x header, which has additional fields that we ignore */ 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biWidth = GET_4B(bmpinfoheader,4); 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biHeight = GET_4B(bmpinfoheader,8); 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biPlanes = GET_2B(bmpinfoheader,12); 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->bits_per_pixel = (int) GET_2B(bmpinfoheader,14); 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biCompression = GET_4B(bmpinfoheader,16); 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biXPelsPerMeter = GET_4B(bmpinfoheader,24); 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biYPelsPerMeter = GET_4B(bmpinfoheader,28); 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biClrUsed = GET_4B(bmpinfoheader,32); 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* biSizeImage, biClrImportant fields are ignored */ 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (source->bits_per_pixel) { 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 8: /* colormapped image */ 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine mapentrysize = 4; /* Windows uses RGBQUAD colormap */ 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, (int) biWidth, (int) biHeight); 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case 24: /* RGB image */ 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight); 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADDEPTH); 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (biPlanes != 1) 33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADPLANES); 33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (biCompression != 0) 33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_COMPRESSED); 33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) { 33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Set JFIF density parameters from the BMP data */ 33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */ 34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->Y_density = (UINT16) (biYPelsPerMeter/100); 34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->density_unit = 2; /* dots/cm */ 34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADHEADER); 34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Compute distance to bitmap data --- will adjust for colormap below */ 35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bPad = bfOffBits - (headerSize + 14); 35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Read the colormap, if any */ 35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (mapentrysize > 0) { 35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (biClrUsed <= 0) 35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine biClrUsed = 256; /* assume it's 256 */ 35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else if (biClrUsed > 256) 35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADCMAP); 35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate space to store the colormap */ 35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->colormap = (*cinfo->mem->alloc_sarray) 36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, JPOOL_IMAGE, 36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) biClrUsed, (JDIMENSION) 3); 36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* and read it from the file */ 36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine read_colormap(source, (int) biClrUsed, mapentrysize); 36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* account for size of colormap */ 36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bPad -= biClrUsed * mapentrysize; 36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Skip any remaining pad bytes */ 36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (bPad < 0) /* incorrect bfOffBits value? */ 37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_BMP_BADHEADER); 37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (--bPad >= 0) { 37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (void) read_byte(source); 37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Compute row width in file, including padding to 4-byte boundary */ 37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (source->bits_per_pixel == 24) 37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine row_width = (JDIMENSION) (biWidth * 3); 37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine else 37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine row_width = (JDIMENSION) biWidth; 38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ((row_width & 3) != 0) row_width++; 38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->row_width = row_width; 38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate space for inversion array, prepare for preload pass */ 38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->whole_image = (*cinfo->mem->request_virt_sarray) 38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, 38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine row_width, (JDIMENSION) biHeight, (JDIMENSION) 1); 38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = preload_image; 38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (cinfo->progress != NULL) { 38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress; 39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine progress->total_extra_passes++; /* count file input as separate pass */ 39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate one-row buffer for returned data */ 39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.buffer = (*cinfo->mem->alloc_sarray) 39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, JPOOL_IMAGE, 39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) (biWidth * 3), (JDIMENSION) 1); 39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.buffer_height = 1; 39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->in_color_space = JCS_RGB; 40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_components = 3; 40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->data_precision = 8; 40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->image_width = (JDIMENSION) biWidth; 40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->image_height = (JDIMENSION) biHeight; 40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Finish up at the end of the file. 40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefinish_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* no work */ 41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The module selection routine for BMP format input. 42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(cjpeg_source_ptr) 42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_read_bmp (j_compress_ptr cinfo) 42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bmp_source_ptr source; 42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Create module interface object */ 42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source = (bmp_source_ptr) 42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SIZEOF(bmp_source_struct)); 43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->cinfo = cinfo; /* make back link for subroutines */ 43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fill in method ptrs, except get_pixel_rows which start_input sets */ 43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.start_input = start_input_bmp; 43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.finish_input = finish_input_bmp; 43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return (cjpeg_source_ptr) source; 43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* BMP_SUPPORTED */ 440