19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * wrtarga.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 Targa format. 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * These routines may need modification for non-Unix environments or 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * specialized applications. As they stand, they assume output to 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an ordinary stdio stream. 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Based on code contributed by Lee Daniel Crocker. 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef TARGA_SUPPORTED 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * To support 12-bit JPEG data, we'd have to scale output down to 8 bits. 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This is not yet implemented. 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#if BITS_IN_JSAMPLE != 8 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */ 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The output buffer needs to be writable by fwrite(). On PCs, we must 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * allocate the buffer in near data space, because we are assuming small-data 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * memory model, wherein fwrite() can't reach far memory. If you need to 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * process very wide images on a PC, you might have to compile in large-memory 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * model, or else replace fwrite() with a putc() loop --- which will be much 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * slower. 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private version of data destination object */ 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct { 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project struct djpeg_dest_struct pub; /* public fields */ 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char *iobuffer; /* physical I/O buffer */ 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION buffer_width; /* width of one row */ 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} tga_dest_struct; 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef tga_dest_struct * tga_dest_ptr; 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void) 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectwrite_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors) 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Create and write a Targa header */ 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char targaheader[18]; 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Set unused fields of header to 0 */ 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MEMZERO(targaheader, SIZEOF(targaheader)); 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_colors > 0) { 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[1] = 1; /* color map type 1 */ 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[5] = (char) (num_colors & 0xFF); 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[6] = (char) (num_colors >> 8); 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[7] = 24; /* 24 bits per cmap entry */ 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[12] = (char) (cinfo->output_width & 0xFF); 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[13] = (char) (cinfo->output_width >> 8); 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[14] = (char) (cinfo->output_height & 0xFF); 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[15] = (char) (cinfo->output_height >> 8); 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[17] = 0x20; /* Top-down, non-interlaced */ 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->out_color_space == JCS_GRAYSCALE) { 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[2] = 3; /* image type = uncompressed gray-scale */ 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[16] = 8; /* bits per pixel */ 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { /* must be RGB */ 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_colors > 0) { 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[2] = 1; /* image type = colormapped RGB */ 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[16] = 8; 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[2] = 2; /* image type = uncompressed RGB */ 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project targaheader[16] = 24; 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (JFWRITE(dinfo->output_file, targaheader, 18) != (size_t) 18) 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_FILE_WRITE); 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Write some pixel data. 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * In this module rows_supplied will always be 1. 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION rows_supplied) 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* used for unquantized full-color output */ 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project tga_dest_ptr dest = (tga_dest_ptr) dinfo; 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW inptr; 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register char * outptr; 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JDIMENSION col; 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr = dest->pub.buffer[0]; 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = dest->iobuffer; 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width; col > 0; col--) { 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[0] = (char) GETJSAMPLE(inptr[2]); /* RGB to BGR order */ 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[1] = (char) GETJSAMPLE(inptr[1]); 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr[2] = (char) GETJSAMPLE(inptr[0]); 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr += 3, outptr += 3; 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION rows_supplied) 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* used for grayscale OR quantized color output */ 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project tga_dest_ptr dest = (tga_dest_ptr) dinfo; 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW inptr; 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register char * outptr; 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JDIMENSION col; 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr = dest->pub.buffer[0]; 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = dest->iobuffer; 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width; col > 0; col--) { 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *outptr++ = (char) GETJSAMPLE(*inptr++); 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Write some demapped pixel data when color quantization is in effect. 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For Targa, this is only applied to grayscale data. 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectput_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project JDIMENSION rows_supplied) 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project tga_dest_ptr dest = (tga_dest_ptr) dinfo; 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW inptr; 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register char * outptr; 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JSAMPROW color_map0 = cinfo->colormap[0]; 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register JDIMENSION col; 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project inptr = dest->pub.buffer[0]; 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outptr = dest->iobuffer; 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (col = cinfo->output_width; col > 0; col--) { 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *outptr++ = (char) GETJSAMPLE(color_map0[GETJSAMPLE(*inptr++)]); 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width); 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Startup: write the file header. 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project tga_dest_ptr dest = (tga_dest_ptr) dinfo; 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int num_colors, i; 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE *outfile; 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->out_color_space == JCS_GRAYSCALE) { 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Targa doesn't have a mapped grayscale format, so we will */ 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* demap quantized gray output. Never emit a colormap. */ 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project write_header(cinfo, dinfo, 0); 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->quantize_colors) 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.put_pixel_rows = put_demapped_gray; 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project else 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.put_pixel_rows = put_gray_rows; 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else if (cinfo->out_color_space == JCS_RGB) { 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->quantize_colors) { 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* We only support 8-bit colormap indexes, so only 256 colors */ 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project num_colors = cinfo->actual_number_of_colors; 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (num_colors > 256) 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, num_colors); 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project write_header(cinfo, dinfo, num_colors); 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Write the colormap. Note Targa uses BGR byte order */ 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project outfile = dest->pub.output_file; 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 0; i < num_colors; i++) { 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(GETJSAMPLE(cinfo->colormap[2][i]), outfile); 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(GETJSAMPLE(cinfo->colormap[1][i]), outfile); 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project putc(GETJSAMPLE(cinfo->colormap[0][i]), outfile); 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.put_pixel_rows = put_gray_rows; 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project write_header(cinfo, dinfo, 0); 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.put_pixel_rows = put_pixel_rows; 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_TGA_COLORSPACE); 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at the end of the file. 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo) 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Make sure we wrote the output file OK */ 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fflush(dinfo->output_file); 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ferror(dinfo->output_file)) 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ERREXIT(cinfo, JERR_FILE_WRITE); 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The module selection routine for Targa format output. 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(djpeg_dest_ptr) 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_write_targa (j_decompress_ptr cinfo) 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project tga_dest_ptr dest; 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create module interface object, fill in method pointers */ 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest = (tga_dest_ptr) 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project SIZEOF(tga_dest_struct)); 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.start_output = start_output_tga; 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.finish_output = finish_output_tga; 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Calculate output image dimensions so we can allocate space */ 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_calc_output_dimensions(cinfo); 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create I/O buffer. Note we make this near on a PC. */ 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->buffer_width = cinfo->output_width * cinfo->output_components; 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->iobuffer = (char *) 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (size_t) (dest->buffer_width * SIZEOF(char))); 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Create decompressor output buffer. */ 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.buffer = (*cinfo->mem->alloc_sarray) 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1); 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project dest->pub.buffer_height = 1; 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return (djpeg_dest_ptr) dest; 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* TARGA_SUPPORTED */ 254