| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * rdswitch.c | 2  * rdswitch.c | 
| 3  * | 3  * | 
| 4  * Copyright (C) 1991-1996, Thomas G. Lane. | 4  * Copyright (C) 1991-1996, Thomas G. Lane. | 
|  | 5  * Copyright (C) 2010, D. R. Commander. | 
| 5  * This file is part of the Independent JPEG Group's software. | 6  * This file is part of the Independent JPEG Group's software. | 
| 6  * For conditions of distribution and use, see the accompanying README file. | 7  * For conditions of distribution and use, see the accompanying README file. | 
| 7  * | 8  * | 
| 8  * This file contains routines to process some of cjpeg's more complicated | 9  * This file contains routines to process some of cjpeg's more complicated | 
| 9  * command-line switches.  Switches processed here are: | 10  * command-line switches.  Switches processed here are: | 
| 10  *      -qtables file           Read quantization tables from text file | 11  *      -qtables file           Read quantization tables from text file | 
| 11  *      -scans file             Read scan script from text file | 12  *      -scans file             Read scan script from text file | 
|  | 13  *      -quality N[,N,...]      Set quality ratings | 
| 12  *      -qslots N[,N,...]       Set component quantization table selectors | 14  *      -qslots N[,N,...]       Set component quantization table selectors | 
| 13  *      -sample HxV[,HxV,...]   Set component sampling factors | 15  *      -sample HxV[,HxV,...]   Set component sampling factors | 
| 14  */ | 16  */ | 
| 15 | 17 | 
| 16 #include "cdjpeg.h"             /* Common decls for cjpeg/djpeg applications */ | 18 #include "cdjpeg.h"             /* Common decls for cjpeg/djpeg applications */ | 
| 17 #include <ctype.h>              /* to declare isdigit(), isspace() */ | 19 #include <ctype.h>              /* to declare isdigit(), isspace() */ | 
| 18 | 20 | 
| 19 | 21 | 
| 20 LOCAL(int) | 22 LOCAL(int) | 
| 21 text_getc (FILE * file) | 23 text_getc (FILE * file) | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 62       break; | 64       break; | 
| 63     val *= 10; | 65     val *= 10; | 
| 64     val += ch - '0'; | 66     val += ch - '0'; | 
| 65   } | 67   } | 
| 66   *result = val; | 68   *result = val; | 
| 67   *termchar = ch; | 69   *termchar = ch; | 
| 68   return TRUE; | 70   return TRUE; | 
| 69 } | 71 } | 
| 70 | 72 | 
| 71 | 73 | 
|  | 74 #if JPEG_LIB_VERSION < 70 | 
|  | 75 static int q_scale_factor[NUM_QUANT_TBLS] = {100, 100, 100, 100}; | 
|  | 76 #endif | 
|  | 77 | 
| 72 GLOBAL(boolean) | 78 GLOBAL(boolean) | 
| 73 read_quant_tables (j_compress_ptr cinfo, char * filename, | 79 read_quant_tables (j_compress_ptr cinfo, char * filename, boolean force_baseline
     ) | 
| 74 »       »          int scale_factor, boolean force_baseline) |  | 
| 75 /* Read a set of quantization tables from the specified file. | 80 /* Read a set of quantization tables from the specified file. | 
| 76  * The file is plain ASCII text: decimal numbers with whitespace between. | 81  * The file is plain ASCII text: decimal numbers with whitespace between. | 
| 77  * Comments preceded by '#' may be included in the file. | 82  * Comments preceded by '#' may be included in the file. | 
| 78  * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values. | 83  * There may be one to NUM_QUANT_TBLS tables in the file, each of 64 values. | 
| 79  * The tables are implicitly numbered 0,1,etc. | 84  * The tables are implicitly numbered 0,1,etc. | 
| 80  * NOTE: does not affect the qslots mapping, which will default to selecting | 85  * NOTE: does not affect the qslots mapping, which will default to selecting | 
| 81  * table 0 for luminance (or primary) components, 1 for chrominance components. | 86  * table 0 for luminance (or primary) components, 1 for chrominance components. | 
| 82  * You must use -qslots if you want a different component->table mapping. | 87  * You must use -qslots if you want a different component->table mapping. | 
| 83  */ | 88  */ | 
| 84 { | 89 { | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 101     } | 106     } | 
| 102     table[0] = (unsigned int) val; | 107     table[0] = (unsigned int) val; | 
| 103     for (i = 1; i < DCTSIZE2; i++) { | 108     for (i = 1; i < DCTSIZE2; i++) { | 
| 104       if (! read_text_integer(fp, &val, &termchar)) { | 109       if (! read_text_integer(fp, &val, &termchar)) { | 
| 105         fprintf(stderr, "Invalid table data in file %s\n", filename); | 110         fprintf(stderr, "Invalid table data in file %s\n", filename); | 
| 106         fclose(fp); | 111         fclose(fp); | 
| 107         return FALSE; | 112         return FALSE; | 
| 108       } | 113       } | 
| 109       table[i] = (unsigned int) val; | 114       table[i] = (unsigned int) val; | 
| 110     } | 115     } | 
| 111     jpeg_add_quant_table(cinfo, tblno, table, scale_factor, force_baseline); | 116 #if JPEG_LIB_VERSION >= 70 | 
|  | 117     jpeg_add_quant_table(cinfo, tblno, table, cinfo->q_scale_factor[tblno], | 
|  | 118 »       »       »        force_baseline); | 
|  | 119 #else | 
|  | 120     jpeg_add_quant_table(cinfo, tblno, table, q_scale_factor[tblno], | 
|  | 121                          force_baseline); | 
|  | 122 #endif | 
| 112     tblno++; | 123     tblno++; | 
| 113   } | 124   } | 
| 114 | 125 | 
| 115   if (termchar != EOF) { | 126   if (termchar != EOF) { | 
| 116     fprintf(stderr, "Non-numeric data in file %s\n", filename); | 127     fprintf(stderr, "Non-numeric data in file %s\n", filename); | 
| 117     fclose(fp); | 128     fclose(fp); | 
| 118     return FALSE; | 129     return FALSE; | 
| 119   } | 130   } | 
| 120 | 131 | 
| 121   fclose(fp); | 132   fclose(fp); | 
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 255     cinfo->num_scans = scanno; | 266     cinfo->num_scans = scanno; | 
| 256   } | 267   } | 
| 257 | 268 | 
| 258   fclose(fp); | 269   fclose(fp); | 
| 259   return TRUE; | 270   return TRUE; | 
| 260 } | 271 } | 
| 261 | 272 | 
| 262 #endif /* C_MULTISCAN_FILES_SUPPORTED */ | 273 #endif /* C_MULTISCAN_FILES_SUPPORTED */ | 
| 263 | 274 | 
| 264 | 275 | 
|  | 276 #if JPEG_LIB_VERSION < 70 | 
|  | 277 /* These are the sample quantization tables given in JPEG spec section K.1. | 
|  | 278  * The spec says that the values given produce "good" quality, and | 
|  | 279  * when divided by 2, "very good" quality. | 
|  | 280  */ | 
|  | 281 static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { | 
|  | 282   16,  11,  10,  16,  24,  40,  51,  61, | 
|  | 283   12,  12,  14,  19,  26,  58,  60,  55, | 
|  | 284   14,  13,  16,  24,  40,  57,  69,  56, | 
|  | 285   14,  17,  22,  29,  51,  87,  80,  62, | 
|  | 286   18,  22,  37,  56,  68, 109, 103,  77, | 
|  | 287   24,  35,  55,  64,  81, 104, 113,  92, | 
|  | 288   49,  64,  78,  87, 103, 121, 120, 101, | 
|  | 289   72,  92,  95,  98, 112, 100, 103,  99 | 
|  | 290 }; | 
|  | 291 static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { | 
|  | 292   17,  18,  24,  47,  99,  99,  99,  99, | 
|  | 293   18,  21,  26,  66,  99,  99,  99,  99, | 
|  | 294   24,  26,  56,  99,  99,  99,  99,  99, | 
|  | 295   47,  66,  99,  99,  99,  99,  99,  99, | 
|  | 296   99,  99,  99,  99,  99,  99,  99,  99, | 
|  | 297   99,  99,  99,  99,  99,  99,  99,  99, | 
|  | 298   99,  99,  99,  99,  99,  99,  99,  99, | 
|  | 299   99,  99,  99,  99,  99,  99,  99,  99 | 
|  | 300 }; | 
|  | 301 | 
|  | 302 | 
|  | 303 LOCAL(void) | 
|  | 304 jpeg_default_qtables (j_compress_ptr cinfo, boolean force_baseline) | 
|  | 305 { | 
|  | 306   jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, | 
|  | 307                        q_scale_factor[0], force_baseline); | 
|  | 308   jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, | 
|  | 309                        q_scale_factor[1], force_baseline); | 
|  | 310 } | 
|  | 311 #endif | 
|  | 312 | 
|  | 313 | 
|  | 314 GLOBAL(boolean) | 
|  | 315 set_quality_ratings (j_compress_ptr cinfo, char *arg, boolean force_baseline) | 
|  | 316 /* Process a quality-ratings parameter string, of the form | 
|  | 317  *     N[,N,...] | 
|  | 318  * If there are more q-table slots than parameters, the last value is replicated
     . | 
|  | 319  */ | 
|  | 320 { | 
|  | 321   int val = 75;                 /* default value */ | 
|  | 322   int tblno; | 
|  | 323   char ch; | 
|  | 324 | 
|  | 325   for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { | 
|  | 326     if (*arg) { | 
|  | 327       ch = ',';                 /* if not set by sscanf, will be ',' */ | 
|  | 328       if (sscanf(arg, "%d%c", &val, &ch) < 1) | 
|  | 329         return FALSE; | 
|  | 330       if (ch != ',')            /* syntax check */ | 
|  | 331         return FALSE; | 
|  | 332       /* Convert user 0-100 rating to percentage scaling */ | 
|  | 333 #if JPEG_LIB_VERSION >= 70 | 
|  | 334       cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); | 
|  | 335 #else | 
|  | 336       q_scale_factor[tblno] = jpeg_quality_scaling(val); | 
|  | 337 #endif | 
|  | 338       while (*arg && *arg++ != ',') /* advance to next segment of arg string */ | 
|  | 339         ; | 
|  | 340     } else { | 
|  | 341       /* reached end of parameter, set remaining factors to last value */ | 
|  | 342 #if JPEG_LIB_VERSION >= 70 | 
|  | 343       cinfo->q_scale_factor[tblno] = jpeg_quality_scaling(val); | 
|  | 344 #else | 
|  | 345       q_scale_factor[tblno] = jpeg_quality_scaling(val); | 
|  | 346 #endif | 
|  | 347     } | 
|  | 348   } | 
|  | 349   jpeg_default_qtables(cinfo, force_baseline); | 
|  | 350   return TRUE; | 
|  | 351 } | 
|  | 352 | 
|  | 353 | 
| 265 GLOBAL(boolean) | 354 GLOBAL(boolean) | 
| 266 set_quant_slots (j_compress_ptr cinfo, char *arg) | 355 set_quant_slots (j_compress_ptr cinfo, char *arg) | 
| 267 /* Process a quantization-table-selectors parameter string, of the form | 356 /* Process a quantization-table-selectors parameter string, of the form | 
| 268  *     N[,N,...] | 357  *     N[,N,...] | 
| 269  * If there are more components than parameters, the last value is replicated. | 358  * If there are more components than parameters, the last value is replicated. | 
| 270  */ | 359  */ | 
| 271 { | 360 { | 
| 272   int val = 0;                  /* default table # */ | 361   int val = 0;                  /* default table # */ | 
| 273   int ci; | 362   int ci; | 
| 274   char ch; | 363   char ch; | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 323       while (*arg && *arg++ != ',') /* advance to next segment of arg string */ | 412       while (*arg && *arg++ != ',') /* advance to next segment of arg string */ | 
| 324         ; | 413         ; | 
| 325     } else { | 414     } else { | 
| 326       /* reached end of parameter, set remaining components to 1x1 sampling */ | 415       /* reached end of parameter, set remaining components to 1x1 sampling */ | 
| 327       cinfo->comp_info[ci].h_samp_factor = 1; | 416       cinfo->comp_info[ci].h_samp_factor = 1; | 
| 328       cinfo->comp_info[ci].v_samp_factor = 1; | 417       cinfo->comp_info[ci].v_samp_factor = 1; | 
| 329     } | 418     } | 
| 330   } | 419   } | 
| 331   return TRUE; | 420   return TRUE; | 
| 332 } | 421 } | 
| OLD | NEW | 
|---|