170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * rdppm.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1991-1997, 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 PPM/PGM format. 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The extended 2-byte-per-sample raw PPM/PGM formats are supported. 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The PBMPLUS library is NOT required to compile this software 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * (but it is highly useful as a set of PPM image manipulation programs). 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * These routines may need modification for non-Unix environments or 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * specialized applications. As they stand, they assume input from 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * an ordinary stdio stream. They further assume that reading begins 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * at the start of the file; start_input may need work if the 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * user interface has already read some data (e.g., to determine that 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * the file is indeed PPM format). 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef PPM_SUPPORTED 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Portions of this code are based on the PBMPLUS library, which is: 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** Copyright (C) 1988 by Jef Poskanzer. 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** Permission to use, copy, modify, and distribute this software and its 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** documentation for any purpose and without fee is hereby granted, provided 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** that the above copyright notice appear in all copies and that both that 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** copyright notice and this permission notice appear in supporting 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** documentation. This software is provided "as is" without express or 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine** implied warranty. 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine*/ 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Macros to deal with unsigned chars as efficiently as compiler allows */ 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef HAVE_UNSIGNED_CHAR 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef unsigned char U_CHAR; 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define UCH(x) ((int) (x)) 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else /* !HAVE_UNSIGNED_CHAR */ 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef CHAR_IS_UNSIGNED 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef char U_CHAR; 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define UCH(x) ((int) (x)) 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef char U_CHAR; 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define UCH(x) ((int) (x) & 0xFF) 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* HAVE_UNSIGNED_CHAR */ 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len))) 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * On most systems, reading individual bytes with getc() is drastically less 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * efficient than buffering a row at a time with fread(). On PCs, we must 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * allocate the buffer in near data space, because we are assuming small-data 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * memory model, wherein fread() can't reach far memory. If you need to 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * process very wide images on a PC, you might have to compile in large-memory 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * model, or else replace fread() with a getc() loop --- which will be much 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * slower. 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private version of data source object */ 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct { 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine struct cjpeg_source_struct pub; /* public fields */ 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine U_CHAR *iobuffer; /* non-FAR pointer to I/O buffer */ 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPROW pixrow; /* FAR pointer to same */ 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine size_t buffer_width; /* width of I/O buffer */ 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JSAMPLE *rescale; /* => maxval-remapping array, or NULL */ 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} ppm_source_struct; 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef ppm_source_struct * ppm_source_ptr; 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(int) 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinepbm_getc (FILE * infile) 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read next char, skipping over any comments */ 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* A comment/newline sequence is returned as a newline */ 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int ch; 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = getc(infile); 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch == '#') { 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine do { 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = getc(infile); 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } while (ch != '\n' && ch != EOF); 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return ch; 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(unsigned int) 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_pbm_integer (j_compress_ptr cinfo, FILE * infile) 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read an unsigned decimal integer from the PPM file */ 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Swallows one trailing character after the integer */ 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Note that on a 16-bit-int machine, only values up to 64k can be read. */ 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This should not be a problem in practice. */ 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int ch; 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register unsigned int val; 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Skip any leading whitespace */ 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine do { 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = pbm_getc(infile); 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch == EOF) 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r'); 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch < '0' || ch > '9') 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_PPM_NONNUMERIC); 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine val = ch - '0'; 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') { 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine val *= 10; 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine val += ch - '0'; 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return val; 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Read one row of pixels. 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * We provide several different versions depending on input file format. 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In all cases, input is scaled to the size of JSAMPLE. 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * A really fast path is provided for reading byte/sample raw files with 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * maxval = MAXJSAMPLE, which is the normal case for 8-bit data. 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_text_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading text-format PGM files with any maxval */ 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FILE * infile = source->pub.input_file; 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW ptr; 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE *rescale = source->rescale; 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ptr = source->pub.buffer[0]; 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_text_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading text-format PPM files with any maxval */ 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FILE * infile = source->pub.input_file; 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW ptr; 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE *rescale = source->rescale; 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ptr = source->pub.buffer[0]; 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[read_pbm_integer(cinfo, infile)]; 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_scaled_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading raw-byte-format PGM files with any maxval */ 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW ptr; 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register U_CHAR * bufferptr; 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE *rescale = source->rescale; 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ptr = source->pub.buffer[0]; 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bufferptr = source->iobuffer; 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[UCH(*bufferptr++)]; 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_scaled_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading raw-byte-format PPM files with any maxval */ 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW ptr; 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register U_CHAR * bufferptr; 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE *rescale = source->rescale; 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ptr = source->pub.buffer[0]; 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bufferptr = source->iobuffer; 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[UCH(*bufferptr++)]; 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[UCH(*bufferptr++)]; 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[UCH(*bufferptr++)]; 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_raw_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading raw-byte-format files with maxval = MAXJSAMPLE. 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In this case we just read right into the JSAMPLE buffer! 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note that same code works for PPM and PGM files. 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_word_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading raw-word-format PGM files with any maxval */ 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW ptr; 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register U_CHAR * bufferptr; 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE *rescale = source->rescale; 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ptr = source->pub.buffer[0]; 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bufferptr = source->iobuffer; 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int temp; 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp = UCH(*bufferptr++); 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp |= UCH(*bufferptr++) << 8; 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[temp]; 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(JDIMENSION) 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineget_word_rgb_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* This version is for reading raw-word-format PPM files with any maxval */ 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPROW ptr; 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register U_CHAR * bufferptr; 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register JSAMPLE *rescale = source->rescale; 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine JDIMENSION col; 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! ReadOK(source->pub.input_file, source->iobuffer, source->buffer_width)) 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_INPUT_EOF); 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ptr = source->pub.buffer[0]; 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine bufferptr = source->iobuffer; 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (col = cinfo->image_width; col > 0; col--) { 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int temp; 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp = UCH(*bufferptr++); 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp |= UCH(*bufferptr++) << 8; 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[temp]; 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp = UCH(*bufferptr++); 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp |= UCH(*bufferptr++) << 8; 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[temp]; 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp = UCH(*bufferptr++); 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine temp |= UCH(*bufferptr++) << 8; 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *ptr++ = rescale[temp]; 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return 1; 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Read the file header; return image size and component count. 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source = (ppm_source_ptr) sinfo; 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int c; 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int w, h, maxval; 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine boolean need_iobuffer, use_raw_buffer, need_rescale; 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (getc(source->pub.input_file) != 'P') 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_PPM_NOT); 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine c = getc(source->pub.input_file); /* subformat discriminator character */ 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* detect unsupported variants (ie, PBM) before trying to read header */ 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (c) { 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '2': /* it's a text-format PGM file */ 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '3': /* it's a text-format PPM file */ 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '5': /* it's a raw-format PGM file */ 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '6': /* it's a raw-format PPM file */ 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine default: 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_PPM_NOT); 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* fetch the remaining header info */ 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine w = read_pbm_integer(cinfo, source->pub.input_file); 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine h = read_pbm_integer(cinfo, source->pub.input_file); 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine maxval = read_pbm_integer(cinfo, source->pub.input_file); 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (w <= 0 || h <= 0 || maxval <= 0) /* error check */ 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ERREXIT(cinfo, JERR_PPM_NOT); 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->data_precision = BITS_IN_JSAMPLE; /* we always rescale data to this */ 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->image_width = (JDIMENSION) w; 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->image_height = (JDIMENSION) h; 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* initialize flags to most common settings */ 33370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine need_iobuffer = TRUE; /* do we need an I/O buffer? */ 33470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine use_raw_buffer = FALSE; /* do we map input buffer onto I/O buffer? */ 33570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine need_rescale = TRUE; /* do we need a rescale array? */ 33670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 33770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine switch (c) { 33870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '2': /* it's a text-format PGM file */ 33970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_components = 1; 34070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->in_color_space = JCS_GRAYSCALE; 34170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_PGM_TEXT, w, h); 34270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_text_gray_row; 34370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine need_iobuffer = FALSE; 34470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 34570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 34670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '3': /* it's a text-format PPM file */ 34770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_components = 3; 34870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->in_color_space = JCS_RGB; 34970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_PPM_TEXT, w, h); 35070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_text_rgb_row; 35170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine need_iobuffer = FALSE; 35270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 35370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 35470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '5': /* it's a raw-format PGM file */ 35570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_components = 1; 35670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->in_color_space = JCS_GRAYSCALE; 35770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_PGM, w, h); 35870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (maxval > 255) { 35970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_word_gray_row; 36070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) { 36170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_raw_row; 36270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine use_raw_buffer = TRUE; 36370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine need_rescale = FALSE; 36470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 36570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_scaled_gray_row; 36670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 36770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 36870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 36970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine case '6': /* it's a raw-format PPM file */ 37070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->input_components = 3; 37170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->in_color_space = JCS_RGB; 37270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine TRACEMS2(cinfo, 1, JTRC_PPM, w, h); 37370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (maxval > 255) { 37470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_word_rgb_row; 37570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else if (maxval == MAXJSAMPLE && SIZEOF(JSAMPLE) == SIZEOF(U_CHAR)) { 37670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_raw_row; 37770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine use_raw_buffer = TRUE; 37870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine need_rescale = FALSE; 37970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 38070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.get_pixel_rows = get_scaled_rgb_row; 38170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 38270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 38370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 38470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 38570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Allocate space for I/O buffer: 1 or 3 bytes or words/pixel. */ 38670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (need_iobuffer) { 38770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->buffer_width = (size_t) w * cinfo->input_components * 38870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((maxval<=255) ? SIZEOF(U_CHAR) : (2*SIZEOF(U_CHAR))); 38970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->iobuffer = (U_CHAR *) 39070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 39170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->buffer_width); 39270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 39370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 39470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Create compressor input buffer. */ 39570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (use_raw_buffer) { 39670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* For unscaled raw-input case, we can just map it onto the I/O buffer. */ 39770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Synthesize a JSAMPARRAY pointer structure */ 39870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Cast here implies near->far pointer conversion on PCs */ 39970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pixrow = (JSAMPROW) source->iobuffer; 40070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.buffer = & source->pixrow; 40170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.buffer_height = 1; 40270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 40370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Need to translate anyway, so make a separate sample buffer. */ 40470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.buffer = (*cinfo->mem->alloc_sarray) 40570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ((j_common_ptr) cinfo, JPOOL_IMAGE, 40670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (JDIMENSION) w * cinfo->input_components, (JDIMENSION) 1); 40770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.buffer_height = 1; 40870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 40970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Compute the rescaling array if required. */ 41170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (need_rescale) { 41270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine INT32 val, half_maxval; 41370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 41470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* On 16-bit-int machines we have to be careful of maxval = 65535 */ 41570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->rescale = (JSAMPLE *) 41670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 41770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (size_t) (((long) maxval + 1L) * SIZEOF(JSAMPLE))); 41870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine half_maxval = maxval / 2; 41970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (val = 0; val <= (INT32) maxval; val++) { 42070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* The multiplication here must be done in 32 bits to avoid overflow */ 42170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->rescale[val] = (JSAMPLE) ((val*MAXJSAMPLE + half_maxval)/maxval); 42270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 42370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 42470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 42570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 42770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 42870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Finish up at the end of the file. 42970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 43070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43170a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void) 43270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinefinish_input_ppm (j_compress_ptr cinfo, cjpeg_source_ptr sinfo) 43370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 43470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* no work */ 43570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 43670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 43870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 43970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The module selection routine for PPM format input. 44070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 44170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(cjpeg_source_ptr) 44370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_read_ppm (j_compress_ptr cinfo) 44470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 44570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ppm_source_ptr source; 44670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 44770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Create module interface object */ 44870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source = (ppm_source_ptr) 44970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 45070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine SIZEOF(ppm_source_struct)); 45170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Fill in method ptrs, except get_pixel_rows which start_input sets */ 45270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.start_input = start_input_ppm; 45370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine source->pub.finish_input = finish_input_ppm; 45470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 45570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return (cjpeg_source_ptr) source; 45670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 45770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 45870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* PPM_SUPPORTED */ 459