19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * wrppm.c
39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1991-1996, Thomas G. Lane.
59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software.
69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file.
79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains routines to write output images in PPM/PGM format.
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The extended 2-byte-per-sample raw PPM/PGM formats are supported.
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The PBMPLUS library is NOT required to compile this software
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (but it is highly useful as a set of PPM image manipulation programs).
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These routines may need modification for non-Unix environments or
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * specialized applications.  As they stand, they assume output to
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an ordinary stdio stream.
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h"		/* Common decls for cjpeg/djpeg applications */
199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef PPM_SUPPORTED
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For 12-bit JPEG data, we either downscale the values to 8 bits
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (to write standard byte-per-sample PPM/PGM files), or output
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * nonstandard word-per-sample PPM/PGM files.  Downscaling is done
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * if PPM_NORAWWORD is defined (this can be done in the Makefile
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * or in jconfig.h).
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * (When the core library supports data precision reduction, a cleaner
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * implementation will be to ask for that instead.)
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if BITS_IN_JSAMPLE == 8
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define PUTPPMSAMPLE(ptr,v)  *ptr++ = (char) (v)
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define BYTESPERSAMPLE 1
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define PPM_MAXVAL 255
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef PPM_NORAWWORD
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define PUTPPMSAMPLE(ptr,v)  *ptr++ = (char) ((v) >> (BITS_IN_JSAMPLE-8))
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define BYTESPERSAMPLE 1
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define PPM_MAXVAL 255
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* The word-per-sample format always puts the LSB first. */
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define PUTPPMSAMPLE(ptr,v)			\
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	{ register int val_ = v;		\
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  *ptr++ = (char) (val_ & 0xFF);	\
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  *ptr++ = (char) ((val_ >> 8) & 0xFF);	\
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	}
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define BYTESPERSAMPLE 2
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define PPM_MAXVAL ((1<<BITS_IN_JSAMPLE)-1)
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * When JSAMPLE is the same size as char, we can just fwrite() the
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * decompressed data to the PPM or PGM file.  On PCs, in order to make this
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * work the output buffer must be allocated in near data space, because we are
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * assuming small-data memory model wherein fwrite() can't reach far memory.
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If you need to process very wide images on a PC, you might have to compile
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * in large-memory model, or else replace fwrite() with a putc() loop ---
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * which will be much slower.
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private version of data destination object */
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct {
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct djpeg_dest_struct pub;	/* public fields */
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Usually these two pointers point to the same place: */
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  char *iobuffer;		/* fwrite's I/O buffer */
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JSAMPROW pixrow;		/* decompressor output buffer */
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  size_t buffer_width;		/* width of I/O buffer */
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JDIMENSION samples_per_row;	/* JSAMPLEs per output row */
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} ppm_dest_struct;
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef ppm_dest_struct * ppm_dest_ptr;
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Write some pixel data.
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In this module rows_supplied will always be 1.
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * put_pixel_rows handles the "normal" 8-bit case where the decompressor
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * output buffer is physically the same as the fwrite buffer.
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		JDIMENSION rows_supplied)
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This code is used when we have to copy the data and apply a pixel
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * format translation.  Typically this only happens in 12-bit mode.
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectcopy_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		 JDIMENSION rows_supplied)
1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;
1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register char * bufferptr;
1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW ptr;
1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JDIMENSION col;
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ptr = dest->pub.buffer[0];
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  bufferptr = dest->iobuffer;
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (col = dest->samples_per_row; col > 0; col--) {
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(*ptr++));
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Write some pixel data when color quantization is in effect.
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We have to demap the color index values to straight data.
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_demapped_rgb (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		  JDIMENSION rows_supplied)
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register char * bufferptr;
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int pixval;
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW ptr;
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW color_map0 = cinfo->colormap[0];
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW color_map1 = cinfo->colormap[1];
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW color_map2 = cinfo->colormap[2];
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JDIMENSION col;
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ptr = dest->pub.buffer[0];
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  bufferptr = dest->iobuffer;
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (col = cinfo->output_width; col > 0; col--) {
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    pixval = GETJSAMPLE(*ptr++);
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map0[pixval]));
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map1[pixval]));
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map2[pixval]));
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		   JDIMENSION rows_supplied)
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register char * bufferptr;
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW ptr;
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW color_map = cinfo->colormap[0];
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JDIMENSION col;
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ptr = dest->pub.buffer[0];
1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  bufferptr = dest->iobuffer;
1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (col = cinfo->output_width; col > 0; col--) {
1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    PUTPPMSAMPLE(bufferptr, GETJSAMPLE(color_map[GETJSAMPLE(*ptr++)]));
1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Startup: write the file header.
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ppm_dest_ptr dest = (ppm_dest_ptr) dinfo;
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Emit file header */
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  switch (cinfo->out_color_space) {
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_GRAYSCALE:
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* emit header for raw PGM format */
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    fprintf(dest->pub.output_file, "P5\n%ld %ld\n%d\n",
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    (long) cinfo->output_width, (long) cinfo->output_height,
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    PPM_MAXVAL);
1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case JCS_RGB:
1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* emit header for raw PPM format */
1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    fprintf(dest->pub.output_file, "P6\n%ld %ld\n%d\n",
1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    (long) cinfo->output_width, (long) cinfo->output_height,
1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	    PPM_MAXVAL);
1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  default:
1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_PPM_COLORSPACE);
1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at the end of the file.
2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_output_ppm (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)
2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Make sure we wrote the output file OK */
2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  fflush(dinfo->output_file);
2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (ferror(dinfo->output_file))
2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_FILE_WRITE);
2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The module selection routine for PPM format output.
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(djpeg_dest_ptr)
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_write_ppm (j_decompress_ptr cinfo)
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ppm_dest_ptr dest;
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Create module interface object, fill in method pointers */
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dest = (ppm_dest_ptr)
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				  SIZEOF(ppm_dest_struct));
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dest->pub.start_output = start_output_ppm;
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dest->pub.finish_output = finish_output_ppm;
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Calculate output image dimensions so we can allocate space */
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jpeg_calc_output_dimensions(cinfo);
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Create physical I/O buffer.  Note we make this near on a PC. */
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dest->samples_per_row = cinfo->output_width * cinfo->out_color_components;
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dest->buffer_width = dest->samples_per_row * (BYTESPERSAMPLE * SIZEOF(char));
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  dest->iobuffer = (char *) (*cinfo->mem->alloc_small)
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width);
2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cinfo->quantize_colors || BITS_IN_JSAMPLE != 8 ||
2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      SIZEOF(JSAMPLE) != SIZEOF(char)) {
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* When quantizing, we need an output buffer for colormap indexes
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * that's separate from the physical I/O buffer.  We also need a
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * separate buffer if pixel format translation must take place.
2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dest->pub.buffer = (*cinfo->mem->alloc_sarray)
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ((j_common_ptr) cinfo, JPOOL_IMAGE,
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       cinfo->output_width * cinfo->output_components, (JDIMENSION) 1);
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dest->pub.buffer_height = 1;
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (! cinfo->quantize_colors)
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      dest->pub.put_pixel_rows = copy_pixel_rows;
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    else if (cinfo->out_color_space == JCS_GRAYSCALE)
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      dest->pub.put_pixel_rows = put_demapped_gray;
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    else
2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      dest->pub.put_pixel_rows = put_demapped_rgb;
2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We will fwrite() directly from decompressor output buffer. */
2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Synthesize a JSAMPARRAY pointer structure */
2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Cast here implies near->far pointer conversion on PCs */
2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dest->pixrow = (JSAMPROW) dest->iobuffer;
2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dest->pub.buffer = & dest->pixrow;
2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dest->pub.buffer_height = 1;
2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    dest->pub.put_pixel_rows = put_pixel_rows;
2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return (djpeg_dest_ptr) dest;
2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* PPM_SUPPORTED */
269