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