1f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
2f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * wrtarga.c
3f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *
4f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Copyright (C) 1991-1996, Thomas G. Lane.
5f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file is part of the Independent JPEG Group's software.
6f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For conditions of distribution and use, see the accompanying README file.
7f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *
8f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This file contains routines to write output images in Targa format.
9f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *
10f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * These routines may need modification for non-Unix environments or
11f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * specialized applications.  As they stand, they assume output to
12f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * an ordinary stdio stream.
13f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org *
14f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Based on code contributed by Lee Daniel Crocker.
15f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
16f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
17f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#include "cdjpeg.h"		/* Common decls for cjpeg/djpeg applications */
18f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
19f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#ifdef TARGA_SUPPORTED
20f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
21f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
22f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
23f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * To support 12-bit JPEG data, we'd have to scale output down to 8 bits.
24f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * This is not yet implemented.
25f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
26f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
27f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#if BITS_IN_JSAMPLE != 8
28f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  Sorry, this code only copes with 8-bit JSAMPLEs. /* deliberate syntax err */
29f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif
30f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
31f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
32f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The output buffer needs to be writable by fwrite().  On PCs, we must
33f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * allocate the buffer in near data space, because we are assuming small-data
34f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * memory model, wherein fwrite() can't reach far memory.  If you need to
35f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * process very wide images on a PC, you might have to compile in large-memory
36f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * model, or else replace fwrite() with a putc() loop --- which will be much
37f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * slower.
38f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
39f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
40f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
41f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Private version of data destination object */
42f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
43f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef struct {
44f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  struct djpeg_dest_struct pub;	/* public fields */
45f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
46f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  char *iobuffer;		/* physical I/O buffer */
47f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  JDIMENSION buffer_width;	/* width of one row */
48f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org} tga_dest_struct;
49f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
50f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgtypedef tga_dest_struct * tga_dest_ptr;
51f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
52f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
53f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgLOCAL(void)
54f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgwrite_header (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo, int num_colors)
55f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* Create and write a Targa header */
56f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{
57f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  char targaheader[18];
58f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
59f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  /* Set unused fields of header to 0 */
60f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  MEMZERO(targaheader, SIZEOF(targaheader));
61f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
62f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  if (num_colors > 0) {
63f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    targaheader[1] = 1;		/* color map type 1 */
64f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    targaheader[5] = (char) (num_colors & 0xFF);
65f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    targaheader[6] = (char) (num_colors >> 8);
66f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    targaheader[7] = 24;	/* 24 bits per cmap entry */
67f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  }
68f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
69f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  targaheader[12] = (char) (cinfo->output_width & 0xFF);
70f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  targaheader[13] = (char) (cinfo->output_width >> 8);
71f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  targaheader[14] = (char) (cinfo->output_height & 0xFF);
72f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  targaheader[15] = (char) (cinfo->output_height >> 8);
73f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  targaheader[17] = 0x20;	/* Top-down, non-interlaced */
74f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
75f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  if (cinfo->out_color_space == JCS_GRAYSCALE) {
76f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    targaheader[2] = 3;		/* image type = uncompressed gray-scale */
77f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    targaheader[16] = 8;	/* bits per pixel */
78f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  } else {			/* must be RGB */
79f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    if (num_colors > 0) {
80f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      targaheader[2] = 1;	/* image type = colormapped RGB */
81f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      targaheader[16] = 8;
82f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    } else {
83f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      targaheader[2] = 2;	/* image type = uncompressed RGB */
84f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      targaheader[16] = 24;
85f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    }
86f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  }
87f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
88f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  if (JFWRITE(dinfo->output_file, targaheader, 18) != (size_t) 18)
89f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    ERREXIT(cinfo, JERR_FILE_WRITE);
90f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org}
91f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
92f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
93f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
94f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Write some pixel data.
95f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * In this module rows_supplied will always be 1.
96f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
97f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
98f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void)
99f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgput_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
100f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org		JDIMENSION rows_supplied)
101f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* used for unquantized full-color output */
102f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{
103f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  tga_dest_ptr dest = (tga_dest_ptr) dinfo;
104f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register JSAMPROW inptr;
105f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register char * outptr;
106f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register JDIMENSION col;
107f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
108f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  inptr = dest->pub.buffer[0];
109f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  outptr = dest->iobuffer;
110f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  for (col = cinfo->output_width; col > 0; col--) {
111f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    outptr[0] = (char) GETJSAMPLE(inptr[2]); /* RGB to BGR order */
112f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    outptr[1] = (char) GETJSAMPLE(inptr[1]);
113f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    outptr[2] = (char) GETJSAMPLE(inptr[0]);
114f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    inptr += 3, outptr += 3;
115f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  }
116f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
117f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org}
118f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
119f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void)
120f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgput_gray_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
121f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	       JDIMENSION rows_supplied)
122f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/* used for grayscale OR quantized color output */
123f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{
124f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  tga_dest_ptr dest = (tga_dest_ptr) dinfo;
125f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register JSAMPROW inptr;
126f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register char * outptr;
127f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register JDIMENSION col;
128f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
129f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  inptr = dest->pub.buffer[0];
130f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  outptr = dest->iobuffer;
131f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  for (col = cinfo->output_width; col > 0; col--) {
132f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    *outptr++ = (char) GETJSAMPLE(*inptr++);
133f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  }
134f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
135f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org}
136f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
137f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
138f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
139f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Write some demapped pixel data when color quantization is in effect.
140f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * For Targa, this is only applied to grayscale data.
141f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
142f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
143f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void)
144f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgput_demapped_gray (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
145f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org		   JDIMENSION rows_supplied)
146f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{
147f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  tga_dest_ptr dest = (tga_dest_ptr) dinfo;
148f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register JSAMPROW inptr;
149f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register char * outptr;
150f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register JSAMPROW color_map0 = cinfo->colormap[0];
151f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  register JDIMENSION col;
152f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
153f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  inptr = dest->pub.buffer[0];
154f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  outptr = dest->iobuffer;
155f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  for (col = cinfo->output_width; col > 0; col--) {
156f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    *outptr++ = (char) GETJSAMPLE(color_map0[GETJSAMPLE(*inptr++)]);
157f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  }
158f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  (void) JFWRITE(dest->pub.output_file, dest->iobuffer, dest->buffer_width);
159f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org}
160f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
161f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
162f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
163f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Startup: write the file header.
164f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
165f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
166f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void)
167f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgstart_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)
168f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{
169f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  tga_dest_ptr dest = (tga_dest_ptr) dinfo;
170f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  int num_colors, i;
171f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  FILE *outfile;
172f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
173f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  if (cinfo->out_color_space == JCS_GRAYSCALE) {
174f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    /* Targa doesn't have a mapped grayscale format, so we will */
175f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    /* demap quantized gray output.  Never emit a colormap. */
176f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    write_header(cinfo, dinfo, 0);
177f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    if (cinfo->quantize_colors)
178f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      dest->pub.put_pixel_rows = put_demapped_gray;
179f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    else
180f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      dest->pub.put_pixel_rows = put_gray_rows;
181f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  } else if (cinfo->out_color_space == JCS_RGB) {
182f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    if (cinfo->quantize_colors) {
183f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      /* We only support 8-bit colormap indexes, so only 256 colors */
184f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      num_colors = cinfo->actual_number_of_colors;
185f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      if (num_colors > 256)
186f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	ERREXIT1(cinfo, JERR_TOO_MANY_COLORS, num_colors);
187f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      write_header(cinfo, dinfo, num_colors);
188f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      /* Write the colormap.  Note Targa uses BGR byte order */
189f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      outfile = dest->pub.output_file;
190f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      for (i = 0; i < num_colors; i++) {
191f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	putc(GETJSAMPLE(cinfo->colormap[2][i]), outfile);
192f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	putc(GETJSAMPLE(cinfo->colormap[1][i]), outfile);
193f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org	putc(GETJSAMPLE(cinfo->colormap[0][i]), outfile);
194f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      }
195f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      dest->pub.put_pixel_rows = put_gray_rows;
196f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    } else {
197f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      write_header(cinfo, dinfo, 0);
198f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      dest->pub.put_pixel_rows = put_pixel_rows;
199f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    }
200f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  } else {
201f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    ERREXIT(cinfo, JERR_TGA_COLORSPACE);
202f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  }
203f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org}
204f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
205f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
206f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
207f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * Finish up at the end of the file.
208f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
209f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
210f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgMETHODDEF(void)
211f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgfinish_output_tga (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)
212f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{
213f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  /* Make sure we wrote the output file OK */
214f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  fflush(dinfo->output_file);
215f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  if (ferror(dinfo->output_file))
216f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    ERREXIT(cinfo, JERR_FILE_WRITE);
217f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org}
218f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
219f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
220f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org/*
221f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org * The module selection routine for Targa format output.
222f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org */
223f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
224f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgGLOBAL(djpeg_dest_ptr)
225f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.orgjinit_write_targa (j_decompress_ptr cinfo)
226f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org{
227f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  tga_dest_ptr dest;
228f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
229f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  /* Create module interface object, fill in method pointers */
230f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  dest = (tga_dest_ptr)
231f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
232f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org				  SIZEOF(tga_dest_struct));
233f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  dest->pub.start_output = start_output_tga;
234f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  dest->pub.finish_output = finish_output_tga;
235f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
236f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  /* Calculate output image dimensions so we can allocate space */
237f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  jpeg_calc_output_dimensions(cinfo);
238f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
239f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  /* Create I/O buffer.  Note we make this near on a PC. */
240f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  dest->buffer_width = cinfo->output_width * cinfo->output_components;
241f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  dest->iobuffer = (char *)
242f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
243f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org				(size_t) (dest->buffer_width * SIZEOF(char)));
244f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
245f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  /* Create decompressor output buffer. */
246f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  dest->pub.buffer = (*cinfo->mem->alloc_sarray)
247f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org    ((j_common_ptr) cinfo, JPOOL_IMAGE, dest->buffer_width, (JDIMENSION) 1);
248f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  dest->pub.buffer_height = 1;
249f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
250f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org  return (djpeg_dest_ptr) dest;
251f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org}
252f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org
253f0c4f33a4aa0760ba0e12a254b69d996442c9c5hbono@chromium.org#endif /* TARGA_SUPPORTED */
254