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