19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * rdtarga.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 read input 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 input from
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * an ordinary stdio stream.  They further assume that reading begins
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * at the start of the file; start_input may need work if the
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * user interface has already read some data (e.g., to determine that
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * the file is indeed Targa format).
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Based on code contributed by Lee Daniel Crocker.
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h"		/* Common decls for cjpeg/djpeg applications */
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef TARGA_SUPPORTED
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Macros to deal with unsigned chars as efficiently as compiler allows */
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef HAVE_UNSIGNED_CHAR
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef unsigned char U_CHAR;
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define UCH(x)	((int) (x))
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else /* !HAVE_UNSIGNED_CHAR */
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef CHAR_IS_UNSIGNED
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef char U_CHAR;
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define UCH(x)	((int) (x))
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#else
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef char U_CHAR;
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define UCH(x)	((int) (x) & 0xFF)
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* HAVE_UNSIGNED_CHAR */
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define	ReadOK(file,buffer,len)	(JFREAD(file,buffer,len) == ((size_t) (len)))
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Private version of data source object */
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct _tga_source_struct * tga_source_ptr;
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttypedef struct _tga_source_struct {
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  struct cjpeg_source_struct pub; /* public fields */
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  j_compress_ptr cinfo;		/* back link saves passing separate parm */
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JSAMPARRAY colormap;		/* Targa colormap (converted to my format) */
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  jvirt_sarray_ptr whole_image;	/* Needed if funny input row order */
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JDIMENSION current_row;	/* Current logical row number to read */
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Pointer to routine to extract next Targa pixel from input file */
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JMETHOD(void, read_pixel, (tga_source_ptr sinfo));
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Result of read_pixel is delivered here: */
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  U_CHAR tga_pixel[4];
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int pixel_size;		/* Bytes per Targa pixel (1 to 4) */
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* State info for reading RLE-coded pixels; both counts must be init to 0 */
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int block_count;		/* # of pixels remaining in RLE block */
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int dup_pixel_count;		/* # of times to duplicate previous pixel */
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* This saves the correct pixel-row-expansion method for preload_image */
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				       cjpeg_source_ptr sinfo));
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} tga_source_struct;
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* For expanding 5-bit pixel values to 8-bit with best rounding */
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic const UINT8 c5to8bits[32] = {
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    0,   8,  16,  25,  33,  41,  49,  58,
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project   66,  74,  82,  90,  99, 107, 115, 123,
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  132, 140, 148, 156, 165, 173, 181, 189,
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  197, 206, 214, 222, 230, 239, 247, 255
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project};
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(int)
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_byte (tga_source_ptr sinfo)
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read next byte from Targa file */
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register FILE *infile = sinfo->pub.input_file;
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int c;
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if ((c = getc(infile)) == EOF)
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(sinfo->cinfo, JERR_INPUT_EOF);
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return c;
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_colormap (tga_source_ptr sinfo, int cmaplen, int mapentrysize)
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read the colormap from a Targa file */
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int i;
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Presently only handles 24-bit BGR format */
1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (mapentrysize != 24)
1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(sinfo->cinfo, JERR_TGA_BADCMAP);
1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i < cmaplen; i++) {
1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo);
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo);
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo);
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * read_pixel methods: get a single pixel from Targa file into tga_pixel[]
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_non_rle_pixel (tga_source_ptr sinfo)
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read one Targa pixel from the input file; no RLE expansion */
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register FILE *infile = sinfo->pub.input_file;
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int i;
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i < sinfo->pixel_size; i++) {
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    sinfo->tga_pixel[i] = (U_CHAR) getc(infile);
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_rle_pixel (tga_source_ptr sinfo)
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read one Targa pixel from the input file, expanding RLE data as needed */
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register FILE *infile = sinfo->pub.input_file;
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int i;
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Duplicate previously read pixel? */
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (sinfo->dup_pixel_count > 0) {
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    sinfo->dup_pixel_count--;
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    return;
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Time to read RLE block header? */
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (--sinfo->block_count < 0) { /* decrement pixels remaining in block */
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    i = read_byte(sinfo);
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (i & 0x80) {		/* Start of duplicate-pixel block? */
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      sinfo->dup_pixel_count = i & 0x7F; /* number of dups after this one */
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      sinfo->block_count = 0;	/* then read new block header */
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } else {
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      sinfo->block_count = i & 0x7F; /* number of pixels after this one */
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Read next pixel */
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i < sinfo->pixel_size; i++) {
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    sinfo->tga_pixel[i] = (U_CHAR) getc(infile);
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Read one row of pixels.
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We provide several different versions depending on input file format.
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION)
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectget_8bit_gray_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This version is for reading 8-bit grayscale pixels */
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source = (tga_source_ptr) sinfo;
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW ptr;
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JDIMENSION col;
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ptr = source->pub.buffer[0];
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (col = cinfo->image_width; col > 0; col--) {
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]);
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return 1;
1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION)
1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectget_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This version is for reading 8-bit colormap indexes */
1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source = (tga_source_ptr) sinfo;
1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int t;
1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW ptr;
1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JDIMENSION col;
1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPARRAY colormap = source->colormap;
1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ptr = source->pub.buffer[0];
2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (col = cinfo->image_width; col > 0; col--) {
2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */
2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    t = UCH(source->tga_pixel[0]);
2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *ptr++ = colormap[0][t];
2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *ptr++ = colormap[1][t];
2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *ptr++ = colormap[2][t];
2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return 1;
2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION)
2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectget_16bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This version is for reading 16-bit pixels */
2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source = (tga_source_ptr) sinfo;
2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int t;
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW ptr;
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JDIMENSION col;
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ptr = source->pub.buffer[0];
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (col = cinfo->image_width; col > 0; col--) {
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    t = UCH(source->tga_pixel[0]);
2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    t += UCH(source->tga_pixel[1]) << 8;
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* We expand 5 bit data to 8 bit sample width.
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     * The format of the 16-bit (LSB first) input word is
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     *     xRRRRRGGGGGBBBBB
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     */
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ptr[2] = (JSAMPLE) c5to8bits[t & 0x1F];
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    t >>= 5;
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ptr[1] = (JSAMPLE) c5to8bits[t & 0x1F];
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    t >>= 5;
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ptr[0] = (JSAMPLE) c5to8bits[t & 0x1F];
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ptr += 3;
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return 1;
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION)
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectget_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This version is for reading 24-bit pixels */
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source = (tga_source_ptr) sinfo;
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JSAMPROW ptr;
2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register JDIMENSION col;
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ptr = source->pub.buffer[0];
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (col = cinfo->image_width; col > 0; col--) {
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*source->read_pixel) (source); /* Load next pixel into tga_pixel */
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[2]); /* change BGR to RGB order */
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[1]);
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    *ptr++ = (JSAMPLE) UCH(source->tga_pixel[0]);
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return 1;
2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Targa also defines a 32-bit pixel format with order B,G,R,A.
2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * We presently ignore the attribute byte, so the code for reading
2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * these pixels is identical to the 24-bit routine above.
2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This works because the actual pixel length is only known to read_pixel.
2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define get_32bit_row  get_24bit_row
2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This method is for re-reading the input data in standard top-down
2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * row order.  The entire image has already been read into whole_image
2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * with proper conversion of pixel format, but it's in a funny row order.
2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION)
2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectget_memory_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source = (tga_source_ptr) sinfo;
2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JDIMENSION source_row;
2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Compute row of source that maps to current_row of normal order */
2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* For now, assume image is bottom-up and not interlaced. */
2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* NEEDS WORK to support interlaced images! */
2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source_row = cinfo->image_height - source->current_row - 1;
2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Fetch that row from virtual array */
2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->pub.buffer = (*cinfo->mem->access_virt_sarray)
2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ((j_common_ptr) cinfo, source->whole_image,
2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     source_row, (JDIMENSION) 1, FALSE);
2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->current_row++;
2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return 1;
2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This method loads the image into whole_image during the first call on
2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * get_pixel_rows.  The get_pixel_rows pointer is then adjusted to call
2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * get_memory_row on subsequent calls.
2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(JDIMENSION)
3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectpreload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source = (tga_source_ptr) sinfo;
3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JDIMENSION row;
3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;
3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Read the data into a virtual array in input-file row order. */
3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (row = 0; row < cinfo->image_height; row++) {
3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (progress != NULL) {
3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      progress->pub.pass_counter = (long) row;
3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      progress->pub.pass_limit = (long) cinfo->image_height;
3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);
3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->pub.buffer = (*cinfo->mem->access_virt_sarray)
3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ((j_common_ptr) cinfo, source->whole_image, row, (JDIMENSION) 1, TRUE);
3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (*source->get_pixel_rows) (cinfo, sinfo);
3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (progress != NULL)
3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    progress->completed_extra_passes++;
3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Set up to read from the virtual array in unscrambled order */
3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->pub.get_pixel_rows = get_memory_row;
3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->current_row = 0;
3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* And read the first row */
3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return get_memory_row(cinfo, sinfo);
3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Read the file header; return image size and component count.
3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
3339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
3349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
3359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source = (tga_source_ptr) sinfo;
3369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  U_CHAR targaheader[18];
3379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int idlen, cmaptype, subtype, flags, interlace_type, components;
3389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int width, height, maplen;
3399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  boolean is_bottom_up;
3409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define GET_2B(offset)	((unsigned int) UCH(targaheader[offset]) + \
3429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project			 (((unsigned int) UCH(targaheader[offset+1])) << 8))
3439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (! ReadOK(source->pub.input_file, targaheader, 18))
3459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_INPUT_EOF);
3469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Pretend "15-bit" pixels are 16-bit --- we ignore attribute bit anyway */
3489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (targaheader[16] == 15)
3499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    targaheader[16] = 16;
3509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  idlen = UCH(targaheader[0]);
3529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cmaptype = UCH(targaheader[1]);
3539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  subtype = UCH(targaheader[2]);
3549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  maplen = GET_2B(5);
3559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  width = GET_2B(12);
3569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  height = GET_2B(14);
3579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->pixel_size = UCH(targaheader[16]) >> 3;
3589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  flags = UCH(targaheader[17]);	/* Image Descriptor byte */
3599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  is_bottom_up = ((flags & 0x20) == 0);	/* bit 5 set => top-down */
3619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  interlace_type = flags >> 6;	/* bits 6/7 are interlace code */
3629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (cmaptype > 1 ||		/* cmaptype must be 0 or 1 */
3649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      source->pixel_size < 1 || source->pixel_size > 4 ||
3659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (UCH(targaheader[16]) & 7) != 0 || /* bits/pixel must be multiple of 8 */
3669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      interlace_type != 0)	/* currently don't allow interlaced image */
3679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_TGA_BADPARMS);
3689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (subtype > 8) {
3709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* It's an RLE-coded file */
3719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->read_pixel = read_rle_pixel;
3729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->block_count = source->dup_pixel_count = 0;
3739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    subtype -= 8;
3749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
3759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Non-RLE file */
3769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->read_pixel = read_non_rle_pixel;
3779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
3789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Now should have subtype 1, 2, or 3 */
3809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  components = 3;		/* until proven different */
3819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->in_color_space = JCS_RGB;
3829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
3839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  switch (subtype) {
3849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case 1:			/* Colormapped image */
3859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (source->pixel_size == 1 && cmaptype == 1)
3869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      source->get_pixel_rows = get_8bit_row;
3879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    else
3889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_TGA_BADPARMS);
3899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    TRACEMS2(cinfo, 1, JTRC_TGA_MAPPED, width, height);
3909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
3919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case 2:			/* RGB image */
3929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    switch (source->pixel_size) {
3939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    case 2:
3949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      source->get_pixel_rows = get_16bit_row;
3959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      break;
3969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    case 3:
3979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      source->get_pixel_rows = get_24bit_row;
3989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      break;
3999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    case 4:
4009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      source->get_pixel_rows = get_32bit_row;
4019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      break;
4029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    default:
4039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_TGA_BADPARMS);
4049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      break;
4059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    TRACEMS2(cinfo, 1, JTRC_TGA, width, height);
4079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
4089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case 3:			/* Grayscale image */
4099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    components = 1;
4109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    cinfo->in_color_space = JCS_GRAYSCALE;
4119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (source->pixel_size == 1)
4129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      source->get_pixel_rows = get_8bit_gray_row;
4139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    else
4149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_TGA_BADPARMS);
4159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    TRACEMS2(cinfo, 1, JTRC_TGA_GRAY, width, height);
4169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
4179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  default:
4189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_TGA_BADPARMS);
4199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
4209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (is_bottom_up) {
4239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Create a virtual array to buffer the upside-down image. */
4249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->whole_image = (*cinfo->mem->request_virt_sarray)
4259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
4269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       (JDIMENSION) width * components, (JDIMENSION) height, (JDIMENSION) 1);
4279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cinfo->progress != NULL) {
4289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;
4299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      progress->total_extra_passes++; /* count file input as separate pass */
4309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
4319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* source->pub.buffer will point to the virtual array. */
4329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->pub.buffer_height = 1; /* in case anyone looks at it */
4339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->pub.get_pixel_rows = preload_image;
4349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
4359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Don't need a virtual array, but do need a one-row input buffer. */
4369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->whole_image = NULL;
4379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->pub.buffer = (*cinfo->mem->alloc_sarray)
4389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ((j_common_ptr) cinfo, JPOOL_IMAGE,
4399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project       (JDIMENSION) width * components, (JDIMENSION) 1);
4409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->pub.buffer_height = 1;
4419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->pub.get_pixel_rows = source->get_pixel_rows;
4429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while (idlen--)		/* Throw away ID field */
4459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    (void) read_byte(source);
4469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (maplen > 0) {
4489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (maplen > 256 || GET_2B(3) != 0)
4499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_TGA_BADCMAP);
4509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* Allocate space to store the colormap */
4519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->colormap = (*cinfo->mem->alloc_sarray)
4529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ((j_common_ptr) cinfo, JPOOL_IMAGE, (JDIMENSION) maplen, (JDIMENSION) 3);
4539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    /* and read it from the file */
4549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    read_colormap(source, (int) maplen, UCH(targaheader[7]));
4559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } else {
4569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (cmaptype)		/* but you promised a cmap! */
4579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_TGA_BADPARMS);
4589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    source->colormap = NULL;
4599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
4609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->input_components = components;
4629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->data_precision = 8;
4639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->image_width = width;
4649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->image_height = height;
4659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Finish up at the end of the file.
4709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void)
4739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectfinish_input_tga (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
4749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* no work */
4769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
4809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The module selection routine for Targa format input.
4819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
4829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(cjpeg_source_ptr)
4849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectjinit_read_targa (j_compress_ptr cinfo)
4859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
4869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  tga_source_ptr source;
4879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Create module interface object */
4899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source = (tga_source_ptr)
4909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
4919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project				  SIZEOF(tga_source_struct));
4929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->cinfo = cinfo;	/* make back link for subroutines */
4939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Fill in method ptrs, except get_pixel_rows which start_input sets */
4949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->pub.start_input = start_input_tga;
4959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  source->pub.finish_input = finish_input_tga;
4969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
4979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return (cjpeg_source_ptr) source;
4989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
4999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
5009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* TARGA_SUPPORTED */
501