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