125 lines
3.0 KiB
C
125 lines
3.0 KiB
C
/*
|
|
* jrdppm.c
|
|
*
|
|
* Copyright (C) 1991, Thomas G. Lane.
|
|
* This file is part of the Independent JPEG Group's software.
|
|
* For conditions of distribution and use, see the accompanying README file.
|
|
*
|
|
* This file contains routines to read input images in PPM format.
|
|
* The PBMPLUS library is required (well, it will be in the real version).
|
|
*
|
|
* These routines may need modification for non-Unix environments or
|
|
* specialized applications. As they stand, they assume input from
|
|
* an ordinary stdio stream. They further assume that reading begins
|
|
* at the start of the file; input_init may need work if the
|
|
* user interface has already read some data (e.g., to determine that
|
|
* the file is indeed PPM format).
|
|
*
|
|
* These routines are invoked via the methods get_input_row
|
|
* and input_init/term.
|
|
*/
|
|
|
|
#include "jinclude.h"
|
|
|
|
#ifdef PPM_SUPPORTED
|
|
|
|
|
|
/*
|
|
* Read the file header; return image size and component count.
|
|
*/
|
|
|
|
METHODDEF void
|
|
input_init (compress_info_ptr cinfo)
|
|
{
|
|
int c, w, h, prec;
|
|
|
|
if (getc(cinfo->input_file) != 'P')
|
|
ERREXIT(cinfo->emethods, "Not a PPM file");
|
|
|
|
c = getc(cinfo->input_file);
|
|
switch (c) {
|
|
case '5': /* it's a PGM file */
|
|
cinfo->input_components = 1;
|
|
cinfo->in_color_space = CS_GRAYSCALE;
|
|
break;
|
|
|
|
case '6': /* it's a PPM file */
|
|
cinfo->input_components = 3;
|
|
cinfo->in_color_space = CS_RGB;
|
|
break;
|
|
|
|
default:
|
|
ERREXIT(cinfo->emethods, "Not a PPM file");
|
|
break;
|
|
}
|
|
|
|
if (fscanf(cinfo->input_file, " %d %d %d", &w, &h, &prec) != 3)
|
|
ERREXIT(cinfo->emethods, "Not a PPM file");
|
|
|
|
if (getc(cinfo->input_file) != '\n' || w <= 0 || h <= 0 || prec != 255)
|
|
ERREXIT(cinfo->emethods, "Not a PPM file");
|
|
|
|
cinfo->image_width = w;
|
|
cinfo->image_height = h;
|
|
cinfo->data_precision = 8;
|
|
}
|
|
|
|
|
|
/*
|
|
* Read one row of pixels.
|
|
*/
|
|
|
|
METHODDEF void
|
|
get_input_row (compress_info_ptr cinfo, JSAMPARRAY pixel_row)
|
|
{
|
|
register FILE * infile = cinfo->input_file;
|
|
register JSAMPROW ptr0, ptr1, ptr2;
|
|
register long col;
|
|
|
|
if (cinfo->input_components == 1) {
|
|
ptr0 = pixel_row[0];
|
|
for (col = cinfo->image_width; col > 0; col--) {
|
|
*ptr0++ = getc(infile);
|
|
}
|
|
} else {
|
|
ptr0 = pixel_row[0];
|
|
ptr1 = pixel_row[1];
|
|
ptr2 = pixel_row[2];
|
|
for (col = cinfo->image_width; col > 0; col--) {
|
|
*ptr0++ = getc(infile);
|
|
*ptr1++ = getc(infile);
|
|
*ptr2++ = getc(infile);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Finish up at the end of the file.
|
|
*/
|
|
|
|
METHODDEF void
|
|
input_term (compress_info_ptr cinfo)
|
|
{
|
|
/* no work required */
|
|
}
|
|
|
|
|
|
/*
|
|
* The method selection routine for PPM format input.
|
|
* Note that this must be called by the user interface before calling
|
|
* jpeg_compress. If multiple input formats are supported, the
|
|
* user interface is responsible for discovering the file format and
|
|
* calling the appropriate method selection routine.
|
|
*/
|
|
|
|
GLOBAL void
|
|
jselrppm (compress_info_ptr cinfo)
|
|
{
|
|
cinfo->methods->input_init = input_init;
|
|
cinfo->methods->get_input_row = get_input_row;
|
|
cinfo->methods->input_term = input_term;
|
|
}
|
|
|
|
#endif /* PPM_SUPPORTED */
|