19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * rdcolmap.c
39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1994-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 implements djpeg's "-map file" switch.  It reads a source image
99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and constructs a colormap to be supplied to the JPEG decompressor.
109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Currently, these file formats are supported for the map file:
129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *   GIF: the contents of the GIF's global colormap are used.
139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *   PPM (either text or raw flavor): the entire file is read and
149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *      each unique pixel value is entered in the map.
159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note that reading a large PPM file will be horrendously slow.
169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Typically, a PPM-format map file should contain just one pixel
179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * of each desired color.  Such a file can be extracted from an
189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * ordinary image PPM file with ppmtomap(1).
199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *
209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Rescaling a PPM that has a maxval unequal to MAXJSAMPLE is not
219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * currently implemented.
229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h"		/* Common decls for cjpeg/djpeg applications */
259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef QUANT_2PASS_SUPPORTED	/* otherwise can't quantize to supplied map */
279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Portions of this code are based on the PBMPLUS library, which is:
299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project**
309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project** Copyright (C) 1988 by Jef Poskanzer.
319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project**
329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project** Permission to use, copy, modify, and distribute this software and its
339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project** documentation for any purpose and without fee is hereby granted, provided
349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project** that the above copyright notice appear in all copies and that both that
359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project** copyright notice and this permission notice appear in supporting
369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project** documentation.  This software is provided "as is" without express or
379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project** implied warranty.
389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project*/
399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Add a (potentially) new color to the color map.
439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectadd_map_entry (j_decompress_ptr cinfo, int R, int G, int B)
479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JSAMPROW colormap0 = cinfo->colormap[0];
499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JSAMPROW colormap1 = cinfo->colormap[1];
509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  JSAMPROW colormap2 = cinfo->colormap[2];
519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int ncolors = cinfo->actual_number_of_colors;
529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int index;
539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Check for duplicate color. */
559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (index = 0; index < ncolors; index++) {
569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (GETJSAMPLE(colormap0[index]) == R &&
579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	GETJSAMPLE(colormap1[index]) == G &&
589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	GETJSAMPLE(colormap2[index]) == B)
599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      return;			/* color is already in map */
609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Check for map overflow. */
639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (ncolors >= (MAXJSAMPLE+1))
649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, (MAXJSAMPLE+1));
659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* OK, add color to map. */
679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  colormap0[ncolors] = (JSAMPLE) R;
689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  colormap1[ncolors] = (JSAMPLE) G;
699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  colormap2[ncolors] = (JSAMPLE) B;
709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->actual_number_of_colors++;
719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Extract color map from a GIF file.
769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_gif_map (j_decompress_ptr cinfo, FILE * infile)
809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int header[13];
829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int i, colormaplen;
839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int R, G, B;
849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initial 'G' has already been read by read_color_map */
869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Read the rest of the GIF header and logical screen descriptor */
879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 1; i < 13; i++) {
889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if ((header[i] = getc(infile)) == EOF)
899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Verify GIF Header */
939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (header[1] != 'I' || header[2] != 'F')
949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* There must be a global color map. */
979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if ((header[10] & 0x80) == 0)
989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* OK, fetch it. */
1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  colormaplen = 2 << (header[10] & 0x07);
1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  for (i = 0; i < colormaplen; i++) {
1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    R = getc(infile);
1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    G = getc(infile);
1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    B = getc(infile);
1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (R == EOF || G == EOF || B == EOF)
1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    add_map_entry(cinfo,
1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		  R << (BITS_IN_JSAMPLE-8),
1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		  G << (BITS_IN_JSAMPLE-8),
1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project		  B << (BITS_IN_JSAMPLE-8));
1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Support routines for reading PPM */
1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(int)
1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectpbm_getc (FILE * infile)
1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read next char, skipping over any comments */
1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* A comment/newline sequence is returned as a newline */
1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int ch;
1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  ch = getc(infile);
1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (ch == '#') {
1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    do {
1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ch = getc(infile);
1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    } while (ch != '\n' && ch != EOF);
1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return ch;
1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(unsigned int)
1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_pbm_integer (j_decompress_ptr cinfo, FILE * infile)
1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read an unsigned decimal integer from the PPM file */
1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Swallows one trailing character after the integer */
1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Note that on a 16-bit-int machine, only values up to 64k can be read. */
1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* This should not be a problem in practice. */
1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register int ch;
1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  register unsigned int val;
1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Skip any leading whitespace */
1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  do {
1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ch = pbm_getc(infile);
1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    if (ch == EOF)
1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  } while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r');
1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (ch < '0' || ch > '9')
1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  val = ch - '0';
1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') {
1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    val *= 10;
1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    val += ch - '0';
1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  return val;
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 * Extract color map from a PPM file.
1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(void)
1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_ppm_map (j_decompress_ptr cinfo, FILE * infile)
1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int c;
1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  unsigned int w, h, maxval, row, col;
1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  int R, G, B;
1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Initial 'P' has already been read by read_color_map */
1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  c = getc(infile);		/* save format discriminator for a sec */
1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* while we fetch the remaining header info */
1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  w = read_pbm_integer(cinfo, infile);
1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  h = read_pbm_integer(cinfo, infile);
1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  maxval = read_pbm_integer(cinfo, infile);
1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (w <= 0 || h <= 0 || maxval <= 0) /* error check */
1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* For now, we don't support rescaling from an unusual maxval. */
1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  if (maxval != (unsigned int) MAXJSAMPLE)
1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  switch (c) {
1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case '3':			/* it's a text-format PPM file */
1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (row = 0; row < h; row++) {
1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      for (col = 0; col < w; col++) {
1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	R = read_pbm_integer(cinfo, infile);
1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	G = read_pbm_integer(cinfo, infile);
1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	B = read_pbm_integer(cinfo, infile);
1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	add_map_entry(cinfo, R, G, B);
2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case '6':			/* it's a raw-format PPM file */
2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    for (row = 0; row < h; row++) {
2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      for (col = 0; col < w; col++) {
2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	R = getc(infile);
2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	G = getc(infile);
2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	B = getc(infile);
2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	if (R == EOF || G == EOF || B == EOF)
2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	  ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project	add_map_entry(cinfo, R, G, B);
2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project      }
2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    }
2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  default:
2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/*
2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Main entry point from djpeg.c.
2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *  Input: opened input file (from file name argument on command line).
2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *  Output: colormap and actual_number_of_colors fields are set in cinfo.
2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */
2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void)
2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_color_map (j_decompress_ptr cinfo, FILE * infile)
2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{
2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Allocate space for a color map of maximum supported size. */
2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->colormap = (*cinfo->mem->alloc_sarray)
2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ((j_common_ptr) cinfo, JPOOL_IMAGE,
2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project     (JDIMENSION) (MAXJSAMPLE+1), (JDIMENSION) 3);
2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  cinfo->actual_number_of_colors = 0; /* initialize map to empty */
2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  /* Read first byte to determine file format */
2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  switch (getc(infile)) {
2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case 'G':
2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    read_gif_map(cinfo, infile);
2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  case 'P':
2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    read_ppm_map(cinfo, infile);
2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  default:
2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project    break;
2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project  }
2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project}
2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project
2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* QUANT_2PASS_SUPPORTED */
254