Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
jdapistd.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #define JPEG_INTERNALS
00018 #include "jinclude.h"
00019 #include "jpeglib.h"
00020
00021
00022
00023 LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo));
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 GLOBAL(boolean)
00038 jpeg_start_decompress (j_decompress_ptr cinfo)
00039 {
00040 if (cinfo->global_state == DSTATE_READY) {
00041
00042 jinit_master_decompress(cinfo);
00043 if (cinfo->buffered_image) {
00044
00045 cinfo->global_state = DSTATE_BUFIMAGE;
00046 return TRUE;
00047 }
00048 cinfo->global_state = DSTATE_PRELOAD;
00049 }
00050 if (cinfo->global_state == DSTATE_PRELOAD) {
00051
00052 if (cinfo->inputctl->has_multiple_scans) {
00053 #ifdef D_MULTISCAN_FILES_SUPPORTED
00054 for (;;) {
00055 int retcode;
00056
00057 if (cinfo->progress != NULL)
00058 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
00059
00060 retcode = (*cinfo->inputctl->consume_input) (cinfo);
00061 if (retcode == JPEG_SUSPENDED)
00062 return FALSE;
00063 if (retcode == JPEG_REACHED_EOI)
00064 break;
00065
00066 if (cinfo->progress != NULL &&
00067 (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
00068 if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
00069
00070 cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
00071 }
00072 }
00073 }
00074 #else
00075 ERREXIT(cinfo, JERR_NOT_COMPILED);
00076 #endif
00077 }
00078 cinfo->output_scan_number = cinfo->input_scan_number;
00079 } else if (cinfo->global_state != DSTATE_PRESCAN)
00080 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00081
00082 return output_pass_setup(cinfo);
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 LOCAL(boolean)
00095 output_pass_setup (j_decompress_ptr cinfo)
00096 {
00097 if (cinfo->global_state != DSTATE_PRESCAN) {
00098
00099 (*cinfo->master->prepare_for_output_pass) (cinfo);
00100 cinfo->output_scanline = 0;
00101 cinfo->global_state = DSTATE_PRESCAN;
00102 }
00103
00104 while (cinfo->master->is_dummy_pass) {
00105 #ifdef QUANT_2PASS_SUPPORTED
00106
00107 while (cinfo->output_scanline < cinfo->output_height) {
00108 JDIMENSION last_scanline;
00109
00110 if (cinfo->progress != NULL) {
00111 cinfo->progress->pass_counter = (long) cinfo->output_scanline;
00112 cinfo->progress->pass_limit = (long) cinfo->output_height;
00113 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
00114 }
00115
00116 last_scanline = cinfo->output_scanline;
00117 (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
00118 &cinfo->output_scanline, (JDIMENSION) 0);
00119 if (cinfo->output_scanline == last_scanline)
00120 return FALSE;
00121 }
00122
00123 (*cinfo->master->finish_output_pass) (cinfo);
00124 (*cinfo->master->prepare_for_output_pass) (cinfo);
00125 cinfo->output_scanline = 0;
00126 #else
00127 ERREXIT(cinfo, JERR_NOT_COMPILED);
00128 #endif
00129 }
00130
00131
00132
00133 cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
00134 return TRUE;
00135 }
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 GLOBAL(JDIMENSION)
00152 jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
00153 JDIMENSION max_lines)
00154 {
00155 JDIMENSION row_ctr;
00156
00157 if (cinfo->global_state != DSTATE_SCANNING)
00158 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00159 if (cinfo->output_scanline >= cinfo->output_height) {
00160 WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
00161 return 0;
00162 }
00163
00164
00165 if (cinfo->progress != NULL) {
00166 cinfo->progress->pass_counter = (long) cinfo->output_scanline;
00167 cinfo->progress->pass_limit = (long) cinfo->output_height;
00168 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
00169 }
00170
00171
00172 row_ctr = 0;
00173 (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
00174 cinfo->output_scanline += row_ctr;
00175 return row_ctr;
00176 }
00177
00178
00179
00180
00181
00182
00183
00184 GLOBAL(JDIMENSION)
00185 jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
00186 JDIMENSION max_lines)
00187 {
00188 JDIMENSION lines_per_iMCU_row;
00189
00190 if (cinfo->global_state != DSTATE_RAW_OK)
00191 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00192 if (cinfo->output_scanline >= cinfo->output_height) {
00193 WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
00194 return 0;
00195 }
00196
00197
00198 if (cinfo->progress != NULL) {
00199 cinfo->progress->pass_counter = (long) cinfo->output_scanline;
00200 cinfo->progress->pass_limit = (long) cinfo->output_height;
00201 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
00202 }
00203
00204
00205 lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size;
00206 if (max_lines < lines_per_iMCU_row)
00207 ERREXIT(cinfo, JERR_BUFFER_SIZE);
00208
00209
00210 if (! (*cinfo->coef->decompress_data) (cinfo, data))
00211 return 0;
00212
00213
00214 cinfo->output_scanline += lines_per_iMCU_row;
00215 return lines_per_iMCU_row;
00216 }
00217
00218
00219
00220
00221 #ifdef D_MULTISCAN_FILES_SUPPORTED
00222
00223
00224
00225
00226
00227 GLOBAL(boolean)
00228 jpeg_start_output (j_decompress_ptr cinfo, int scan_number)
00229 {
00230 if (cinfo->global_state != DSTATE_BUFIMAGE &&
00231 cinfo->global_state != DSTATE_PRESCAN)
00232 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00233
00234 if (scan_number <= 0)
00235 scan_number = 1;
00236 if (cinfo->inputctl->eoi_reached &&
00237 scan_number > cinfo->input_scan_number)
00238 scan_number = cinfo->input_scan_number;
00239 cinfo->output_scan_number = scan_number;
00240
00241 return output_pass_setup(cinfo);
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 GLOBAL(boolean)
00253 jpeg_finish_output (j_decompress_ptr cinfo)
00254 {
00255 if ((cinfo->global_state == DSTATE_SCANNING ||
00256 cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) {
00257
00258
00259 (*cinfo->master->finish_output_pass) (cinfo);
00260 cinfo->global_state = DSTATE_BUFPOST;
00261 } else if (cinfo->global_state != DSTATE_BUFPOST) {
00262
00263 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
00264 }
00265
00266 while (cinfo->input_scan_number <= cinfo->output_scan_number &&
00267 ! cinfo->inputctl->eoi_reached) {
00268 if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
00269 return FALSE;
00270 }
00271 cinfo->global_state = DSTATE_BUFIMAGE;
00272 return TRUE;
00273 }
00274
00275 #endif