The Independent JPEG Group's JPEG software v1
This commit is contained in:
124
jrdppm.c
Normal file
124
jrdppm.c
Normal file
@@ -0,0 +1,124 @@
|
||||
/*
|
||||
* 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 */
|
||||
Reference in New Issue
Block a user