00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #define JPEG_INTERNALS
00021 #include "jinclude.h"
00022 #include "jpeglib.h"
00023
00024
00025
00026
00027
00028
00029
00030 GLOBAL(void)
00031 jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize)
00032 {
00033 int i;
00034
00035
00036 cinfo->mem = NULL;
00037 if (version != JPEG_LIB_VERSION)
00038 ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
00039 if (structsize != SIZEOF(struct jpeg_decompress_struct))
00040 ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
00041 (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize);
00042
00043
00044
00045
00046
00047
00048
00049 {
00050 struct jpeg_error_mgr * err = cinfo->err;
00051 void * client_data = cinfo->client_data;
00052 MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct));
00053 cinfo->err = err;
00054 cinfo->client_data = client_data;
00055 }
00056 cinfo->is_decompressor = TRUE;
00057
00058
00059 jinit_memory_mgr((j_common_ptr) cinfo);
00060
00061
00062 cinfo->progress = NULL;
00063 cinfo->src = NULL;
00064
00065 for (i = 0; i < NUM_QUANT_TBLS; i++)
00066 cinfo->quant_tbl_ptrs[i] = NULL;
00067
00068 for (i = 0; i < NUM_HUFF_TBLS; i++) {
00069 cinfo->dc_huff_tbl_ptrs[i] = NULL;
00070 cinfo->ac_huff_tbl_ptrs[i] = NULL;
00071 }
00072
00073
00074
00075
00076 cinfo->marker_list = NULL;
00077 jinit_marker_reader(cinfo);
00078
00079
00080 jinit_input_controller(cinfo);
00081
00082
00083 cinfo->global_state = DSTATE_START;
00084 }
00085
00086
00087
00088
00089
00090
00091 GLOBAL(void)
00092 jpeg_destroy_decompress (j_decompress_ptr cinfo)
00093 {
00094 jpeg_destroy((j_common_ptr) cinfo);
00095 }
00096
00097
00098
00099
00100
00101
00102
00103 GLOBAL(void)
00104 jpeg_abort_decompress (j_decompress_ptr cinfo)
00105 {
00106 jpeg_abort((j_common_ptr) cinfo);
00107 }
00108
00109
00110
00111
00112
00113
00114 LOCAL(void)
00115 default_decompress_parms (j_decompress_ptr cinfo)
00116 {
00117
00118
00119
00120 switch (cinfo->num_components) {
00121 case 1:
00122 cinfo->jpeg_color_space = JCS_GRAYSCALE;
00123 cinfo->out_color_space = JCS_GRAYSCALE;
00124 break;
00125
00126 case 3:
00127 if (cinfo->saw_JFIF_marker) {
00128 cinfo->jpeg_color_space = JCS_YCbCr;
00129 } else if (cinfo->saw_Adobe_marker) {
00130 switch (cinfo->Adobe_transform) {
00131 case 0:
00132 cinfo->jpeg_color_space = JCS_RGB;
00133 break;
00134 case 1:
00135 cinfo->jpeg_color_space = JCS_YCbCr;
00136 break;
00137 default:
00138 WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
00139 cinfo->jpeg_color_space = JCS_YCbCr;
00140 break;
00141 }
00142 } else {
00143
00144 int cid0 = cinfo->comp_info[0].component_id;
00145 int cid1 = cinfo->comp_info[1].component_id;
00146 int cid2 = cinfo->comp_info[2].component_id;
00147
00148 if (cid0 == 1 && cid1 == 2 && cid2 == 3)
00149 cinfo->jpeg_color_space = JCS_YCbCr;
00150 else if (cid0 == 82 && cid1 == 71 && cid2 == 66)
00151 cinfo->jpeg_color_space = JCS_RGB;
00152 else {
00153 TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2);
00154 cinfo->jpeg_color_space = JCS_YCbCr;
00155 }
00156 }
00157
00158 cinfo->out_color_space = JCS_RGB;
00159 break;
00160
00161 case 4:
00162 if (cinfo->saw_Adobe_marker) {
00163 switch (cinfo->Adobe_transform) {
00164 case 0:
00165 cinfo->jpeg_color_space = JCS_CMYK;
00166 break;
00167 case 2:
00168 cinfo->jpeg_color_space = JCS_YCCK;
00169 break;
00170 default:
00171 WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform);
00172 cinfo->jpeg_color_space = JCS_YCCK;
00173 break;
00174 }
00175 } else {
00176
00177 cinfo->jpeg_color_space = JCS_CMYK;
00178 }
00179 cinfo->out_color_space = JCS_CMYK;
00180 break;
00181
00182 default:
00183 cinfo->jpeg_color_space = JCS_UNKNOWN;
00184 cinfo->out_color_space = JCS_UNKNOWN;
00185 break;
00186 }
00187
00188
00189 cinfo->scale_num = cinfo->block_size;
00190 cinfo->scale_denom = cinfo->block_size;
00191 cinfo->output_gamma = 1.0;
00192 cinfo->buffered_image = FALSE;
00193 cinfo->raw_data_out = FALSE;
00194 cinfo->dct_method = JDCT_DEFAULT;
00195 cinfo->do_fancy_upsampling = TRUE;
00196 cinfo->do_block_smoothing = TRUE;
00197 cinfo->quantize_colors = FALSE;
00198
00199 cinfo->dither_mode = JDITHER_FS;
00200 #ifdef QUANT_2PASS_SUPPORTED
00201 cinfo->two_pass_quantize = TRUE;
00202 #else
00203 cinfo->two_pass_quantize = FALSE;
00204 #endif
00205 cinfo->desired_number_of_colors = 256;
00206 cinfo->colormap = NULL;
00207
00208 cinfo->enable_1pass_quant = FALSE;
00209 cinfo->enable_external_quant = FALSE;
00210 cinfo->enable_2pass_quant = FALSE;
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241 GLOBAL(int)
00242 jpeg_read_header (j_decompress_ptr cinfo, boolean require_image)
00243 {
00244 int retcode;
00245
00246 if (cinfo->global_state != DSTATE_START &&
00247 cinfo->global_state != DSTATE_INHEADER)
00248 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00249
00250 retcode = jpeg_consume_input(cinfo);
00251
00252 switch (retcode) {
00253 case JPEG_REACHED_SOS:
00254 retcode = JPEG_HEADER_OK;
00255 break;
00256 case JPEG_REACHED_EOI:
00257 if (require_image)
00258 ERREXIT(cinfo, JERR_NO_IMAGE);
00259
00260
00261
00262
00263 jpeg_abort((j_common_ptr) cinfo);
00264 retcode = JPEG_HEADER_TABLES_ONLY;
00265 break;
00266 case JPEG_SUSPENDED:
00267
00268 break;
00269 }
00270
00271 return retcode;
00272 }
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287 GLOBAL(int)
00288 jpeg_consume_input (j_decompress_ptr cinfo)
00289 {
00290 int retcode = JPEG_SUSPENDED;
00291
00292
00293 switch (cinfo->global_state) {
00294 case DSTATE_START:
00295
00296 (*cinfo->inputctl->reset_input_controller) (cinfo);
00297
00298 (*cinfo->src->init_source) (cinfo);
00299 cinfo->global_state = DSTATE_INHEADER;
00300
00301 case DSTATE_INHEADER:
00302 retcode = (*cinfo->inputctl->consume_input) (cinfo);
00303 if (retcode == JPEG_REACHED_SOS) {
00304
00305 default_decompress_parms(cinfo);
00306
00307 cinfo->global_state = DSTATE_READY;
00308 }
00309 break;
00310 case DSTATE_READY:
00311
00312 retcode = JPEG_REACHED_SOS;
00313 break;
00314 case DSTATE_PRELOAD:
00315 case DSTATE_PRESCAN:
00316 case DSTATE_SCANNING:
00317 case DSTATE_RAW_OK:
00318 case DSTATE_BUFIMAGE:
00319 case DSTATE_BUFPOST:
00320 case DSTATE_STOPPING:
00321 retcode = (*cinfo->inputctl->consume_input) (cinfo);
00322 break;
00323 default:
00324 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00325 }
00326 return retcode;
00327 }
00328
00329
00330
00331
00332
00333
00334 GLOBAL(boolean)
00335 jpeg_input_complete (j_decompress_ptr cinfo)
00336 {
00337
00338 if (cinfo->global_state < DSTATE_START ||
00339 cinfo->global_state > DSTATE_STOPPING)
00340 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00341 return cinfo->inputctl->eoi_reached;
00342 }
00343
00344
00345
00346
00347
00348
00349 GLOBAL(boolean)
00350 jpeg_has_multiple_scans (j_decompress_ptr cinfo)
00351 {
00352
00353 if (cinfo->global_state < DSTATE_READY ||
00354 cinfo->global_state > DSTATE_STOPPING)
00355 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00356 return cinfo->inputctl->has_multiple_scans;
00357 }
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369 GLOBAL(boolean)
00370 jpeg_finish_decompress (j_decompress_ptr cinfo)
00371 {
00372 if ((cinfo->global_state == DSTATE_SCANNING ||
00373 cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) {
00374
00375 if (cinfo->output_scanline < cinfo->output_height)
00376 ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
00377 (*cinfo->master->finish_output_pass) (cinfo);
00378 cinfo->global_state = DSTATE_STOPPING;
00379 } else if (cinfo->global_state == DSTATE_BUFIMAGE) {
00380
00381 cinfo->global_state = DSTATE_STOPPING;
00382 } else if (cinfo->global_state != DSTATE_STOPPING) {
00383
00384 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00385 }
00386
00387 while (! cinfo->inputctl->eoi_reached) {
00388 if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
00389 return FALSE;
00390 }
00391
00392 (*cinfo->src->term_source) (cinfo);
00393
00394 jpeg_abort((j_common_ptr) cinfo);
00395 return TRUE;
00396 }