170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* 270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * rdswitch.c 370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1991-1996, Thomas G. Lane. 570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software. 670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file. 770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * 870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains routines to process some of cjpeg's more complicated 970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * command-line switches. Switches processed here are: 1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * -qtables file Read quantization tables from text file 1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * -scans file Read scan script from text file 1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * -qslots N[,N,...] Set component quantization table selectors 1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * -sample HxV[,HxV,...] Set component sampling factors 1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include <ctype.h> /* to declare isdigit(), isspace() */ 1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(int) 2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetext_getc (FILE * file) 2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read next char, skipping over any comments (# to end of line) */ 2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* A comment/newline sequence is returned as a newline */ 2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int ch; 2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = getc(file); 2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch == '#') { 2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine do { 3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = getc(file); 3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } while (ch != '\n' && ch != EOF); 3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return ch; 3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(boolean) 3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_text_integer (FILE * file, long * result, int * termchar) 3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read an unsigned decimal integer from a file, store it in result */ 4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Reads one trailing character after the integer; returns it in termchar */ 4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int ch; 4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register long val; 4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Skip any leading whitespace, detect EOF */ 4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine do { 4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = text_getc(file); 4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch == EOF) { 4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *termchar = ch; 5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } while (isspace(ch)); 5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! isdigit(ch)) { 5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *termchar = ch; 5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine val = ch - '0'; 6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while ((ch = text_getc(file)) != EOF) { 6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! isdigit(ch)) 6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine break; 6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine val *= 10; 6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine val += ch - '0'; 6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *result = val; 6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *termchar = ch; 6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return TRUE; 6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(boolean) 7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_quant_tables (j_compress_ptr cinfo, char * filename, 7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int scale_factor, boolean force_baseline) 7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read a set of quantization tables from the specified file. 7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The file is plain ASCII text: decimal numbers with whitespace between. 7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Comments preceded by '#' may be included in the file. 7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values. 7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The tables are implicitly numbered 0,1,etc. 8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * NOTE: does not affect the qslots mapping, which will default to selecting 8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * table 0 for luminance (or primary) components, 1 for chrominance components. 8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * You must use -qslots if you want a different component->table mapping. 8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FILE * fp; 8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int tblno, i, termchar; 8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine long val; 8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine unsigned int table[DCTSIZE2]; 8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((fp = fopen(filename, "r")) == NULL) { 9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Can't open table file %s\n", filename); 9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine tblno = 0; 9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (read_text_integer(fp, &val, &termchar)) { /* read 1st element of table */ 9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (tblno >= NUM_QUANT_TBLS) { 9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Too many tables in file %s\n", filename); 9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine table[0] = (unsigned int) val; 10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (i = 1; i < DCTSIZE2; i++) { 10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_text_integer(fp, &val, &termchar)) { 10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Invalid table data in file %s\n", filename); 10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine table[i] = (unsigned int) val; 11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_add_quant_table(cinfo, tblno, table, scale_factor, force_baseline); 11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine tblno++; 11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (termchar != EOF) { 11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Non-numeric data in file %s\n", filename); 11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return TRUE; 12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef C_MULTISCAN_FILES_SUPPORTED 12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineLOCAL(boolean) 12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_scan_integer (FILE * file, long * result, int * termchar) 13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Variant of read_text_integer that always looks for a non-space termchar; 13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * this simplifies parsing of punctuation in scan scripts. 13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine register int ch; 13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_text_integer(file, result, termchar)) 13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = *termchar; 13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (ch != EOF && isspace(ch)) 14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = text_getc(file); 14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (isdigit(ch)) { /* oops, put it back */ 14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ungetc(ch, file) == EOF) 14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = ' '; 14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Any separators other than ';' and ':' are ignored; 14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * this allows user to insert commas, etc, if desired. 14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch != EOF && ch != ';' && ch != ':') 15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = ' '; 15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *termchar = ch; 15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return TRUE; 15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(boolean) 15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineread_scan_script (j_compress_ptr cinfo, char * filename) 15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Read a scan script from the specified text file. 16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Each entry in the file defines one scan to be emitted. 16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Entries are separated by semicolons ';'. 16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * An entry contains one to four component indexes, 16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * optionally followed by a colon ':' and four progressive-JPEG parameters. 16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The component indexes denote which component(s) are to be transmitted 16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * in the current scan. The first component has index 0. 16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Sequential JPEG is used if the progressive-JPEG parameters are omitted. 16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The file is free format text: any whitespace may appear between numbers 16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and the ':' and ';' punctuation marks. Also, other punctuation (such 16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * as commas or dashes) can be placed between numbers if desired. 17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Comments preceded by '#' may be included in the file. 17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note: we do very little validity checking here; 17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jcmaster.c will validate the script parameters. 17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine FILE * fp; 17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int scanno, ncomps, termchar; 17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine long val; 17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_scan_info * scanptr; 17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define MAX_SCANS 100 /* quite arbitrary limit */ 18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine jpeg_scan_info scans[MAX_SCANS]; 18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((fp = fopen(filename, "r")) == NULL) { 18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Can't open scan definition file %s\n", filename); 18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = scans; 18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanno = 0; 18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (read_scan_integer(fp, &val, &termchar)) { 19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (scanno >= MAX_SCANS) { 19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Too many scans defined in file %s\n", filename); 19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->component_index[0] = (int) val; 19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ncomps = 1; 19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (termchar == ' ') { 19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ncomps >= MAX_COMPS_IN_SCAN) { 19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Too many components in one scan in file %s\n", 20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine filename); 20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_scan_integer(fp, &val, &termchar)) 20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto bogus; 20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->component_index[ncomps] = (int) val; 20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ncomps++; 20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->comps_in_scan = ncomps; 21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (termchar == ':') { 21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') 21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto bogus; 21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ss = (int) val; 21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') 21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto bogus; 21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Se = (int) val; 21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ') 21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto bogus; 21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ah = (int) val; 22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (! read_scan_integer(fp, &val, &termchar)) 22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine goto bogus; 22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Al = (int) val; 22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* set non-progressive parameters */ 22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ss = 0; 22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Se = DCTSIZE2-1; 22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Ah = 0; 22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr->Al = 0; 22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (termchar != ';' && termchar != EOF) { 23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinebogus: 23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Invalid scan entry format in file %s\n", filename); 23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr++, scanno++; 23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (termchar != EOF) { 24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "Non-numeric data in file %s\n", filename); 24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (scanno > 0) { 24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* Stash completed scan list in cinfo structure. 24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * NOTE: for cjpeg's use, JPOOL_IMAGE is the right lifetime for this data, 24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * but if you want to compress multiple images you'd want JPOOL_PERMANENT. 24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanptr = (jpeg_scan_info *) 25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, 25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine scanno * SIZEOF(jpeg_scan_info)); 25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info)); 25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->scan_info = scanptr; 25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->num_scans = scanno; 25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fclose(fp); 25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return TRUE; 26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* C_MULTISCAN_FILES_SUPPORTED */ 26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(boolean) 26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineset_quant_slots (j_compress_ptr cinfo, char *arg) 26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Process a quantization-table-selectors parameter string, of the form 26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * N[,N,...] 26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If there are more components than parameters, the last value is replicated. 27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int val = 0; /* default table # */ 27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci; 27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char ch; 27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < MAX_COMPONENTS; ci++) { 27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (*arg) { 27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch = ','; /* if not set by sscanf, will be ',' */ 27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (sscanf(arg, "%d%c", &val, &ch) < 1) 28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (ch != ',') /* syntax check */ 28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (val < 0 || val >= NUM_QUANT_TBLS) { 28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "JPEG quantization tables are numbered 0..%d\n", 28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine NUM_QUANT_TBLS-1); 28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->comp_info[ci].quant_tbl_no = val; 28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (*arg && *arg++ != ',') /* advance to next segment of arg string */ 29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ; 29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* reached end of parameter, set remaining components to last table */ 29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->comp_info[ci].quant_tbl_no = val; 29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return TRUE; 29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(boolean) 30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineset_sample_factors (j_compress_ptr cinfo, char *arg) 30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Process a sample-factors parameter string, of the form 30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * HxV[,HxV,...] 30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * If there are more components than parameters, "1x1" is assumed for the rest. 30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */ 30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{ 30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine int ci, val1, val2; 30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine char ch1, ch2; 30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine 31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine for (ci = 0; ci < MAX_COMPONENTS; ci++) { 31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (*arg) { 31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ch2 = ','; /* if not set by sscanf, will be ',' */ 31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (sscanf(arg, "%d%c%d%c", &val1, &ch1, &val2, &ch2) < 3) 31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') /* syntax check */ 31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine if (val1 <= 0 || val1 > 4 || val2 <= 0 || val2 > 4) { 31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine fprintf(stderr, "JPEG sampling factors must be 1..4\n"); 31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return FALSE; 32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->comp_info[ci].h_samp_factor = val1; 32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->comp_info[ci].v_samp_factor = val2; 32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine while (*arg && *arg++ != ',') /* advance to next segment of arg string */ 32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine ; 32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } else { 32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine /* reached end of parameter, set remaining components to 1x1 sampling */ 32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->comp_info[ci].h_samp_factor = 1; 32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine cinfo->comp_info[ci].v_samp_factor = 1; 32970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 33070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine } 33170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine return TRUE; 33270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} 333