Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
rdswitch.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #include "cdjpeg.h"             
00017 #include <ctype.h>              
00018 
00019 
00020 LOCAL(int)
00021 text_getc (FILE * file)
00022 
00023 
00024 {
00025   register int ch;
00026   
00027   ch = getc(file);
00028   if (ch == '#') {
00029     do {
00030       ch = getc(file);
00031     } while (ch != '\n' && ch != EOF);
00032   }
00033   return ch;
00034 }
00035 
00036 
00037 LOCAL(boolean)
00038 read_text_integer (FILE * file, long * result, int * termchar)
00039 
00040 
00041 {
00042   register int ch;
00043   register long val;
00044   
00045   
00046   do {
00047     ch = text_getc(file);
00048     if (ch == EOF) {
00049       *termchar = ch;
00050       return FALSE;
00051     }
00052   } while (isspace(ch));
00053   
00054   if (! isdigit(ch)) {
00055     *termchar = ch;
00056     return FALSE;
00057   }
00058 
00059   val = ch - '0';
00060   while ((ch = text_getc(file)) != EOF) {
00061     if (! isdigit(ch))
00062       break;
00063     val *= 10;
00064     val += ch - '0';
00065   }
00066   *result = val;
00067   *termchar = ch;
00068   return TRUE;
00069 }
00070 
00071 
00072 GLOBAL(boolean)
00073 read_quant_tables (j_compress_ptr cinfo, char * filename,
00074                    int scale_factor, boolean force_baseline)
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 {
00085   FILE * fp;
00086   int tblno, i, termchar;
00087   long val;
00088   unsigned int table[DCTSIZE2];
00089 
00090   if ((fp = fopen(filename, "r")) == NULL) {
00091     fprintf(stderr, "Can't open table file %s\n", filename);
00092     return FALSE;
00093   }
00094   tblno = 0;
00095 
00096   while (read_text_integer(fp, &val, &termchar)) { 
00097     if (tblno >= NUM_QUANT_TBLS) {
00098       fprintf(stderr, "Too many tables in file %s\n", filename);
00099       fclose(fp);
00100       return FALSE;
00101     }
00102     table[0] = (unsigned int) val;
00103     for (i = 1; i < DCTSIZE2; i++) {
00104       if (! read_text_integer(fp, &val, &termchar)) {
00105         fprintf(stderr, "Invalid table data in file %s\n", filename);
00106         fclose(fp);
00107         return FALSE;
00108       }
00109       table[i] = (unsigned int) val;
00110     }
00111     jpeg_add_quant_table(cinfo, tblno, table, scale_factor, force_baseline);
00112     tblno++;
00113   }
00114 
00115   if (termchar != EOF) {
00116     fprintf(stderr, "Non-numeric data in file %s\n", filename);
00117     fclose(fp);
00118     return FALSE;
00119   }
00120 
00121   fclose(fp);
00122   return TRUE;
00123 }
00124 
00125 
00126 #ifdef C_MULTISCAN_FILES_SUPPORTED
00127 
00128 LOCAL(boolean)
00129 read_scan_integer (FILE * file, long * result, int * termchar)
00130 
00131 
00132 
00133 {
00134   register int ch;
00135 
00136   if (! read_text_integer(file, result, termchar))
00137     return FALSE;
00138   ch = *termchar;
00139   while (ch != EOF && isspace(ch))
00140     ch = text_getc(file);
00141   if (isdigit(ch)) {            
00142     if (ungetc(ch, file) == EOF)
00143       return FALSE;
00144     ch = ' ';
00145   } else {
00146     
00147 
00148 
00149     if (ch != EOF && ch != ';' && ch != ':')
00150       ch = ' ';
00151   }
00152   *termchar = ch;
00153   return TRUE;
00154 }
00155 
00156 
00157 GLOBAL(boolean)
00158 read_scan_script (j_compress_ptr cinfo, char * filename)
00159 
00160 
00161 
00162 
00163 
00164 
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 {
00175   FILE * fp;
00176   int scanno, ncomps, termchar;
00177   long val;
00178   jpeg_scan_info * scanptr;
00179 #define MAX_SCANS  100          
00180   jpeg_scan_info scans[MAX_SCANS];
00181 
00182   if ((fp = fopen(filename, "r")) == NULL) {
00183     fprintf(stderr, "Can't open scan definition file %s\n", filename);
00184     return FALSE;
00185   }
00186   scanptr = scans;
00187   scanno = 0;
00188 
00189   while (read_scan_integer(fp, &val, &termchar)) {
00190     if (scanno >= MAX_SCANS) {
00191       fprintf(stderr, "Too many scans defined in file %s\n", filename);
00192       fclose(fp);
00193       return FALSE;
00194     }
00195     scanptr->component_index[0] = (int) val;
00196     ncomps = 1;
00197     while (termchar == ' ') {
00198       if (ncomps >= MAX_COMPS_IN_SCAN) {
00199         fprintf(stderr, "Too many components in one scan in file %s\n",
00200                 filename);
00201         fclose(fp);
00202         return FALSE;
00203       }
00204       if (! read_scan_integer(fp, &val, &termchar))
00205         goto bogus;
00206       scanptr->component_index[ncomps] = (int) val;
00207       ncomps++;
00208     }
00209     scanptr->comps_in_scan = ncomps;
00210     if (termchar == ':') {
00211       if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
00212         goto bogus;
00213       scanptr->Ss = (int) val;
00214       if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
00215         goto bogus;
00216       scanptr->Se = (int) val;
00217       if (! read_scan_integer(fp, &val, &termchar) || termchar != ' ')
00218         goto bogus;
00219       scanptr->Ah = (int) val;
00220       if (! read_scan_integer(fp, &val, &termchar))
00221         goto bogus;
00222       scanptr->Al = (int) val;
00223     } else {
00224       
00225       scanptr->Ss = 0;
00226       scanptr->Se = DCTSIZE2-1;
00227       scanptr->Ah = 0;
00228       scanptr->Al = 0;
00229     }
00230     if (termchar != ';' && termchar != EOF) {
00231 bogus:
00232       fprintf(stderr, "Invalid scan entry format in file %s\n", filename);
00233       fclose(fp);
00234       return FALSE;
00235     }
00236     scanptr++, scanno++;
00237   }
00238 
00239   if (termchar != EOF) {
00240     fprintf(stderr, "Non-numeric data in file %s\n", filename);
00241     fclose(fp);
00242     return FALSE;
00243   }
00244 
00245   if (scanno > 0) {
00246     
00247 
00248 
00249 
00250     scanptr = (jpeg_scan_info *)
00251       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
00252                                   scanno * SIZEOF(jpeg_scan_info));
00253     MEMCOPY(scanptr, scans, scanno * SIZEOF(jpeg_scan_info));
00254     cinfo->scan_info = scanptr;
00255     cinfo->num_scans = scanno;
00256   }
00257 
00258   fclose(fp);
00259   return TRUE;
00260 }
00261 
00262 #endif 
00263 
00264 
00265 GLOBAL(boolean)
00266 set_quant_slots (j_compress_ptr cinfo, char *arg)
00267 
00268 
00269 
00270 
00271 {
00272   int val = 0;                  
00273   int ci;
00274   char ch;
00275 
00276   for (ci = 0; ci < MAX_COMPONENTS; ci++) {
00277     if (*arg) {
00278       ch = ',';                 
00279       if (sscanf(arg, "%d%c", &val, &ch) < 1)
00280         return FALSE;
00281       if (ch != ',')            
00282         return FALSE;
00283       if (val < 0 || val >= NUM_QUANT_TBLS) {
00284         fprintf(stderr, "JPEG quantization tables are numbered 0..%d\n",
00285                 NUM_QUANT_TBLS-1);
00286         return FALSE;
00287       }
00288       cinfo->comp_info[ci].quant_tbl_no = val;
00289       while (*arg && *arg++ != ',') 
00290         ;
00291     } else {
00292       
00293       cinfo->comp_info[ci].quant_tbl_no = val;
00294     }
00295   }
00296   return TRUE;
00297 }
00298 
00299 
00300 GLOBAL(boolean)
00301 set_sample_factors (j_compress_ptr cinfo, char *arg)
00302 
00303 
00304 
00305 
00306 {
00307   int ci, val1, val2;
00308   char ch1, ch2;
00309 
00310   for (ci = 0; ci < MAX_COMPONENTS; ci++) {
00311     if (*arg) {
00312       ch2 = ',';                
00313       if (sscanf(arg, "%d%c%d%c", &val1, &ch1, &val2, &ch2) < 3)
00314         return FALSE;
00315       if ((ch1 != 'x' && ch1 != 'X') || ch2 != ',') 
00316         return FALSE;
00317       if (val1 <= 0 || val1 > 4 || val2 <= 0 || val2 > 4) {
00318         fprintf(stderr, "JPEG sampling factors must be 1..4\n");
00319         return FALSE;
00320       }
00321       cinfo->comp_info[ci].h_samp_factor = val1;
00322       cinfo->comp_info[ci].v_samp_factor = val2;
00323       while (*arg && *arg++ != ',') 
00324         ;
00325     } else {
00326       
00327       cinfo->comp_info[ci].h_samp_factor = 1;
00328       cinfo->comp_info[ci].v_samp_factor = 1;
00329     }
00330   }
00331   return TRUE;
00332 }