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