| /* |
| * 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 */ |