19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * rdswitch.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 process some of cjpeg's more complicated 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * command-line switches. Switches processed here are: 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * -qtables file Read quantization tables from text file 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * -scans file Read scan script from text file 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * -qslots N[,N,...] Set component quantization table selectors 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * -sample HxV[,HxV,...] Set component sampling factors 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <ctype.h> /* to declare isdigit(), isspace() */ 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(int) 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projecttext_getc (FILE * file) 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read next char, skipping over any comments (# to end of line) */ 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* A comment/newline sequence is returned as a newline */ 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int ch; 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = getc(file); 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ch == '#') { 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do { 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = getc(file); 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } while (ch != '\n' && ch != EOF); 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return ch; 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean) 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_text_integer (FILE * file, long * result, int * termchar) 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read an unsigned decimal integer from a file, store it in result */ 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Reads one trailing character after the integer; returns it in termchar */ 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int ch; 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register long val; 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Skip any leading whitespace, detect EOF */ 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project do { 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = text_getc(file); 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ch == EOF) { 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *termchar = ch; 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } while (isspace(ch)); 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! isdigit(ch)) { 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *termchar = ch; 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project val = ch - '0'; 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while ((ch = text_getc(file)) != EOF) { 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! isdigit(ch)) 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project break; 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project val *= 10; 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project val += ch - '0'; 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *result = val; 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *termchar = ch; 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(boolean) 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_quant_tables (j_compress_ptr cinfo, char * filename, 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int scale_factor, boolean force_baseline) 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read a set of quantization tables from the specified file. 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The file is plain ASCII text: decimal numbers with whitespace between. 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Comments preceded by '#' may be included in the file. 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values. 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The tables are implicitly numbered 0,1,etc. 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NOTE: does not affect the qslots mapping, which will default to selecting 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * table 0 for luminance (or primary) components, 1 for chrominance components. 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * You must use -qslots if you want a different component->table mapping. 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * fp; 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int tblno, i, termchar; 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long val; 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project unsigned int table[DCTSIZE2]; 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((fp = fopen(filename, "r")) == NULL) { 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Can't open table file %s\n", filename); 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project tblno = 0; 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (read_text_integer(fp, &val, &termchar)) { /* read 1st element of table */ 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (tblno >= NUM_QUANT_TBLS) { 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Too many tables in file %s\n", filename); 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project table[0] = (unsigned int) val; 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (i = 1; i < DCTSIZE2; i++) { 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_text_integer(fp, &val, &termchar)) { 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Invalid table data in file %s\n", filename); 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project table[i] = (unsigned int) val; 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_add_quant_table(cinfo, tblno, table, scale_factor, force_baseline); 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project tblno++; 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (termchar != EOF) { 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Non-numeric data in file %s\n", filename); 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef C_MULTISCAN_FILES_SUPPORTED 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectLOCAL(boolean) 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_scan_integer (FILE * file, long * result, int * termchar) 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Variant of read_text_integer that always looks for a non-space termchar; 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * this simplifies parsing of punctuation in scan scripts. 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int ch; 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_text_integer(file, result, termchar)) 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = *termchar; 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (ch != EOF && isspace(ch)) 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = text_getc(file); 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (isdigit(ch)) { /* oops, put it back */ 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ungetc(ch, file) == EOF) 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = ' '; 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Any separators other than ';' and ':' are ignored; 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * this allows user to insert commas, etc, if desired. 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ch != EOF && ch != ';' && ch != ':') 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = ' '; 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project *termchar = ch; 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(boolean) 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_scan_script (j_compress_ptr cinfo, char * filename) 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Read a scan script from the specified text file. 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Each entry in the file defines one scan to be emitted. 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Entries are separated by semicolons ';'. 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * An entry contains one to four component indexes, 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * optionally followed by a colon ':' and four progressive-JPEG parameters. 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The component indexes denote which component(s) are to be transmitted 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * in the current scan. The first component has index 0. 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Sequential JPEG is used if the progressive-JPEG parameters are omitted. 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * The file is free format text: any whitespace may appear between numbers 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * and the ':' and ';' punctuation marks. Also, other punctuation (such 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * as commas or dashes) can be placed between numbers if desired. 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Comments preceded by '#' may be included in the file. 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Note: we do very little validity checking here; 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * jcmaster.c will validate the script parameters. 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * fp; 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int scanno, ncomps, termchar; 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project long val; 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_scan_info * scanptr; 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#define MAX_SCANS 100 /* quite arbitrary limit */ 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_scan_info scans[MAX_SCANS]; 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((fp = fopen(filename, "r")) == NULL) { 1839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Can't open scan definition file %s\n", filename); 1849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr = scans; 1879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanno = 0; 1889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (read_scan_integer(fp, &val, &termchar)) { 1909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (scanno >= MAX_SCANS) { 1919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Too many scans defined in file %s\n", filename); 1929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 1939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->component_index[0] = (int) val; 1969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ncomps = 1; 1979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (termchar == ' ') { 1989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ncomps >= MAX_COMPS_IN_SCAN) { 1999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Too many components in one scan in file %s\n", 2009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project filename); 2019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 2029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 2039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_scan_integer(fp, &val, &termchar)) 2059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project goto bogus; 2069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->component_index[ncomps] = (int) val; 2079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ncomps++; 2089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->comps_in_scan = ncomps; 2109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (termchar == ':') { 2119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') 2129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project goto bogus; 2139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Ss = (int) val; 2149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') 2159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project goto bogus; 2169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Se = (int) val; 2179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') 2189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project goto bogus; 2199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Ah = (int) val; 2209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (! read_scan_integer(fp, &val, &termchar)) 2219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project goto bogus; 2229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Al = (int) val; 2239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* set non-progressive parameters */ 2259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Ss = 0; 2269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Se = DCTSIZE2-1; 2279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Ah = 0; 2289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr->Al = 0; 2299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (termchar != ';' && termchar != EOF) { 2319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectbogus: 2329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Invalid scan entry format in file %s\n", filename); 2339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 2349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 2359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr++, scanno++; 2379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (termchar != EOF) { 2409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Non-numeric data in file %s\n", filename); 2419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 2429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 2439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (scanno > 0) { 2469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Stash completed scan list in cinfo structure. 2479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NOTE: for cjpeg's use, JPOOL_IMAGE is the right lifetime for this data, 2489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * but if you want to compress multiple images you'd want JPOOL_PERMANENT. 2499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanptr = (jpeg_scan_info *) 2519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 2529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project scanno * SIZEOF(jpeg_scan_info)); 2539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info)); 2549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->scan_info = scanptr; 2559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->num_scans = scanno; 2569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fclose(fp); 2599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; 2609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif /* C_MULTISCAN_FILES_SUPPORTED */ 2639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(boolean) 2669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectset_quant_slots (j_compress_ptr cinfo, char *arg) 2679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Process a quantization-table-selectors parameter string, of the form 2689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * N[,N,...] 2699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If there are more components than parameters, the last value is replicated. 2709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 2719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 2729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int val = 0; /* default table # */ 2739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci; 2749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char ch; 2759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < MAX_COMPONENTS; ci++) { 2779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (*arg) { 2789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch = ','; /* if not set by sscanf, will be ',' */ 2799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sscanf(arg, "%d%c", &val, &ch) < 1) 2809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 2819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ch != ',') /* syntax check */ 2829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 2839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (val < 0 || val >= NUM_QUANT_TBLS) { 2849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "JPEG quantization tables are numbered 0..%d\n", 2859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project NUM_QUANT_TBLS-1); 2869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 2879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->comp_info[ci].quant_tbl_no = val; 2899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (*arg && *arg++ != ',') /* advance to next segment of arg string */ 2909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ; 2919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 2929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* reached end of parameter, set remaining components to last table */ 2939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->comp_info[ci].quant_tbl_no = val; 2949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 2969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; 2979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 2989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 2999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(boolean) 3019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectset_sample_factors (j_compress_ptr cinfo, char *arg) 3029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* Process a sample-factors parameter string, of the form 3039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * HxV[,HxV,...] 3049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * If there are more components than parameters, "1x1" is assumed for the rest. 3059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 3069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 3079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int ci, val1, val2; 3089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project char ch1, ch2; 3099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 3109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project for (ci = 0; ci < MAX_COMPONENTS; ci++) { 3119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (*arg) { 3129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ch2 = ','; /* if not set by sscanf, will be ',' */ 3139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sscanf(arg, "%d%c%d%c", &val1, &ch1, &val2, &ch2) < 3) 3149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 3159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') /* syntax check */ 3169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 3179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (val1 <= 0 || val1 > 4 || val2 <= 0 || val2 > 4) { 3189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "JPEG sampling factors must be 1..4\n"); 3199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 3209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->comp_info[ci].h_samp_factor = val1; 3229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->comp_info[ci].v_samp_factor = val2; 3239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while (*arg && *arg++ != ',') /* advance to next segment of arg string */ 3249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ; 3259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 3269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* reached end of parameter, set remaining components to 1x1 sampling */ 3279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->comp_info[ci].h_samp_factor = 1; 3289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->comp_info[ci].v_samp_factor = 1; 3299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 3319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; 3329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 333