Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1066)

Side by Side Diff: jdapistd.c

Issue 1934113002: Update libjpeg_turbo to 1.4.90 from https://github.com/libjpeg-turbo/ (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * jdapistd.c 2 * jdapistd.c
3 * 3 *
4 * This file was part of the Independent JPEG Group's software: 4 * This file was part of the Independent JPEG Group's software:
5 * Copyright (C) 1994-1996, Thomas G. Lane. 5 * Copyright (C) 1994-1996, Thomas G. Lane.
6 * libjpeg-turbo Modifications: 6 * libjpeg-turbo Modifications:
7 * Copyright (C) 2010, 2015, D. R. Commander. 7 * Copyright (C) 2010, 2015-2016, D. R. Commander.
8 * Copyright (C) 2015, Google, Inc. 8 * Copyright (C) 2015, Google, Inc.
9 * For conditions of distribution and use, see the accompanying README file. 9 * For conditions of distribution and use, see the accompanying README.ijg
10 * file.
10 * 11 *
11 * This file contains application interface code for the decompression half 12 * This file contains application interface code for the decompression half
12 * of the JPEG library. These are the "standard" API routines that are 13 * of the JPEG library. These are the "standard" API routines that are
13 * used in the normal full-decompression case. They are not used by a 14 * used in the normal full-decompression case. They are not used by a
14 * transcoding-only application. Note that if an application links in 15 * transcoding-only application. Note that if an application links in
15 * jpeg_start_decompress, it will end up linking in the entire decompressor. 16 * jpeg_start_decompress, it will end up linking in the entire decompressor.
16 * We thus must separate this file from jdapimin.c to avoid linking the 17 * We thus must separate this file from jdapimin.c to avoid linking the
17 * whole decompression library into a transcoder. 18 * whole decompression library into a transcoder.
18 */ 19 */
19 20
21 #include "jinclude.h"
20 #include "jdmainct.h" 22 #include "jdmainct.h"
21 #include "jdcoefct.h" 23 #include "jdcoefct.h"
22 #include "jdsample.h" 24 #include "jdsample.h"
23 #include "jmemsys.h" 25 #include "jmemsys.h"
24 26
25
26 /* Forward declarations */ 27 /* Forward declarations */
27 LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); 28 LOCAL(boolean) output_pass_setup (j_decompress_ptr cinfo);
28 29
29 30
30 /* 31 /*
31 * Decompression initialization. 32 * Decompression initialization.
32 * jpeg_read_header must be completed before calling this. 33 * jpeg_read_header must be completed before calling this.
33 * 34 *
34 * If a multipass operating mode was selected, this will do all but the 35 * If a multipass operating mode was selected, this will do all but the
35 * last pass, and thus may take a great deal of time. 36 * last pass, and thus may take a great deal of time.
36 * 37 *
37 * Returns FALSE if suspended. The return value need be inspected only if 38 * Returns FALSE if suspended. The return value need be inspected only if
(...skipping 11 matching lines...) Expand all
49 cinfo->global_state = DSTATE_BUFIMAGE; 50 cinfo->global_state = DSTATE_BUFIMAGE;
50 return TRUE; 51 return TRUE;
51 } 52 }
52 cinfo->global_state = DSTATE_PRELOAD; 53 cinfo->global_state = DSTATE_PRELOAD;
53 } 54 }
54 if (cinfo->global_state == DSTATE_PRELOAD) { 55 if (cinfo->global_state == DSTATE_PRELOAD) {
55 /* If file has multiple scans, absorb them all into the coef buffer */ 56 /* If file has multiple scans, absorb them all into the coef buffer */
56 if (cinfo->inputctl->has_multiple_scans) { 57 if (cinfo->inputctl->has_multiple_scans) {
57 #ifdef D_MULTISCAN_FILES_SUPPORTED 58 #ifdef D_MULTISCAN_FILES_SUPPORTED
58 for (;;) { 59 for (;;) {
59 » int retcode; 60 int retcode;
60 » /* Call progress monitor hook if present */ 61 /* Call progress monitor hook if present */
61 » if (cinfo->progress != NULL) 62 if (cinfo->progress != NULL)
62 » (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 63 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
63 » /* Absorb some more input */ 64 /* Absorb some more input */
64 » retcode = (*cinfo->inputctl->consume_input) (cinfo); 65 retcode = (*cinfo->inputctl->consume_input) (cinfo);
65 » if (retcode == JPEG_SUSPENDED) 66 if (retcode == JPEG_SUSPENDED)
66 » return FALSE; 67 return FALSE;
67 » if (retcode == JPEG_REACHED_EOI) 68 if (retcode == JPEG_REACHED_EOI)
68 » break; 69 break;
69 » /* Advance progress counter if appropriate */ 70 /* Advance progress counter if appropriate */
70 » if (cinfo->progress != NULL && 71 if (cinfo->progress != NULL &&
71 » (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { 72 (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) {
72 » if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { 73 if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) {
73 » /* jdmaster underestimated number of scans; ratchet up one scan */ 74 /* jdmaster underestimated number of scans; ratchet up one scan */
74 » cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; 75 cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows;
75 » } 76 }
76 » } 77 }
77 } 78 }
78 #else 79 #else
79 ERREXIT(cinfo, JERR_NOT_COMPILED); 80 ERREXIT(cinfo, JERR_NOT_COMPILED);
80 #endif /* D_MULTISCAN_FILES_SUPPORTED */ 81 #endif /* D_MULTISCAN_FILES_SUPPORTED */
81 } 82 }
82 cinfo->output_scan_number = cinfo->input_scan_number; 83 cinfo->output_scan_number = cinfo->input_scan_number;
83 } else if (cinfo->global_state != DSTATE_PRESCAN) 84 } else if (cinfo->global_state != DSTATE_PRESCAN)
84 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 85 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
85 /* Perform any dummy output passes, and set up for the final pass */ 86 /* Perform any dummy output passes, and set up for the final pass */
86 return output_pass_setup(cinfo); 87 return output_pass_setup(cinfo);
(...skipping 18 matching lines...) Expand all
105 cinfo->global_state = DSTATE_PRESCAN; 106 cinfo->global_state = DSTATE_PRESCAN;
106 } 107 }
107 /* Loop over any required dummy passes */ 108 /* Loop over any required dummy passes */
108 while (cinfo->master->is_dummy_pass) { 109 while (cinfo->master->is_dummy_pass) {
109 #ifdef QUANT_2PASS_SUPPORTED 110 #ifdef QUANT_2PASS_SUPPORTED
110 /* Crank through the dummy pass */ 111 /* Crank through the dummy pass */
111 while (cinfo->output_scanline < cinfo->output_height) { 112 while (cinfo->output_scanline < cinfo->output_height) {
112 JDIMENSION last_scanline; 113 JDIMENSION last_scanline;
113 /* Call progress monitor hook if present */ 114 /* Call progress monitor hook if present */
114 if (cinfo->progress != NULL) { 115 if (cinfo->progress != NULL) {
115 » cinfo->progress->pass_counter = (long) cinfo->output_scanline; 116 cinfo->progress->pass_counter = (long) cinfo->output_scanline;
116 » cinfo->progress->pass_limit = (long) cinfo->output_height; 117 cinfo->progress->pass_limit = (long) cinfo->output_height;
117 » (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 118 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
118 } 119 }
119 /* Process some data */ 120 /* Process some data */
120 last_scanline = cinfo->output_scanline; 121 last_scanline = cinfo->output_scanline;
121 (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, 122 (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL,
122 » » » » &cinfo->output_scanline, (JDIMENSION) 0); 123 &cinfo->output_scanline, (JDIMENSION) 0);
123 if (cinfo->output_scanline == last_scanline) 124 if (cinfo->output_scanline == last_scanline)
124 » return FALSE;» » /* No progress made, must suspend */ 125 return FALSE; /* No progress made, must suspend */
125 } 126 }
126 /* Finish up dummy pass, and set up for another one */ 127 /* Finish up dummy pass, and set up for another one */
127 (*cinfo->master->finish_output_pass) (cinfo); 128 (*cinfo->master->finish_output_pass) (cinfo);
128 (*cinfo->master->prepare_for_output_pass) (cinfo); 129 (*cinfo->master->prepare_for_output_pass) (cinfo);
129 cinfo->output_scanline = 0; 130 cinfo->output_scanline = 0;
130 #else 131 #else
131 ERREXIT(cinfo, JERR_NOT_COMPILED); 132 ERREXIT(cinfo, JERR_NOT_COMPILED);
132 #endif /* QUANT_2PASS_SUPPORTED */ 133 #endif /* QUANT_2PASS_SUPPORTED */
133 } 134 }
134 /* Ready for application to drive output pass through 135 /* Ready for application to drive output pass through
135 * jpeg_read_scanlines or jpeg_read_raw_data. 136 * jpeg_read_scanlines or jpeg_read_raw_data.
136 */ 137 */
137 cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; 138 cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING;
138 return TRUE; 139 return TRUE;
139 } 140 }
140 141
141 142
142 /* 143 /*
144 * Enable partial scanline decompression
145 *
146 * Must be called after jpeg_start_decompress() and before any calls to
147 * jpeg_read_scanlines() or jpeg_skip_scanlines().
148 *
149 * Refer to libjpeg.txt for more information.
150 */
151
152 GLOBAL(void)
153 jpeg_crop_scanline (j_decompress_ptr cinfo, JDIMENSION *xoffset,
154 JDIMENSION *width)
155 {
156 int ci, align, orig_downsampled_width;
157 JDIMENSION input_xoffset;
158 boolean reinit_upsampler = FALSE;
159 jpeg_component_info *compptr;
160
161 if (cinfo->global_state != DSTATE_SCANNING || cinfo->output_scanline != 0)
162 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
163
164 if (!xoffset || !width)
165 ERREXIT(cinfo, JERR_BAD_CROP_SPEC);
166
167 /* xoffset and width must fall within the output image dimensions. */
168 if (*width == 0 || *xoffset + *width > cinfo->output_width)
169 ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
170
171 /* No need to do anything if the caller wants the entire width. */
172 if (*width == cinfo->output_width)
173 return;
174
175 /* Ensuring the proper alignment of xoffset is tricky. At minimum, it
176 * must align with an MCU boundary, because:
177 *
178 * (1) The IDCT is performed in blocks, and it is not feasible to modify
179 * the algorithm so that it can transform partial blocks.
180 * (2) Because of the SIMD extensions, any input buffer passed to the
181 * upsampling and color conversion routines must be aligned to the
182 * SIMD word size (for instance, 128-bit in the case of SSE2.) The
183 * easiest way to accomplish this without copying data is to ensure
184 * that upsampling and color conversion begin at the start of the
185 * first MCU column that will be inverse transformed.
186 *
187 * In practice, we actually impose a stricter alignment requirement. We
188 * require that xoffset be a multiple of the maximum MCU column width of all
189 * of the components (the "iMCU column width.") This is to simplify the
190 * single-pass decompression case, allowing us to use the same MCU column
191 * width for all of the components.
192 */
193 align = cinfo->_min_DCT_scaled_size * cinfo->max_h_samp_factor;
194
195 /* Adjust xoffset to the nearest iMCU boundary <= the requested value */
196 input_xoffset = *xoffset;
197 *xoffset = (input_xoffset / align) * align;
198
199 /* Adjust the width so that the right edge of the output image is as
200 * requested (only the left edge is altered.) It is important that calling
201 * programs check this value after this function returns, so that they can
202 * allocate an output buffer with the appropriate size.
203 */
204 *width = *width + input_xoffset - *xoffset;
205 cinfo->output_width = *width;
206
207 /* Set the first and last iMCU columns that we must decompress. These values
208 * will be used in single-scan decompressions.
209 */
210 cinfo->master->first_iMCU_col =
211 (JDIMENSION) (long) (*xoffset) / (long) align;
212 cinfo->master->last_iMCU_col =
213 (JDIMENSION) jdiv_round_up((long) (*xoffset + cinfo->output_width),
214 (long) align) - 1;
215
216 for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
217 ci++, compptr++) {
218 /* Set downsampled_width to the new output width. */
219 orig_downsampled_width = compptr->downsampled_width;
220 compptr->downsampled_width =
221 (JDIMENSION) jdiv_round_up((long) (cinfo->output_width *
222 compptr->h_samp_factor),
223 (long) cinfo->max_h_samp_factor);
224 if (compptr->downsampled_width < 2 && orig_downsampled_width >= 2)
225 reinit_upsampler = TRUE;
226
227 /* Set the first and last iMCU columns that we must decompress. These
228 * values will be used in multi-scan decompressions.
229 */
230 cinfo->master->first_MCU_col[ci] =
231 (JDIMENSION) (long) (*xoffset * compptr->h_samp_factor) /
232 (long) align;
233 cinfo->master->last_MCU_col[ci] =
234 (JDIMENSION) jdiv_round_up((long) ((*xoffset + cinfo->output_width) *
235 compptr->h_samp_factor),
236 (long) align) - 1;
237 }
238
239 if (reinit_upsampler) {
240 cinfo->master->jinit_upsampler_no_alloc = TRUE;
241 jinit_upsampler(cinfo);
242 cinfo->master->jinit_upsampler_no_alloc = FALSE;
243 }
244 }
245
246
247 /*
143 * Read some scanlines of data from the JPEG decompressor. 248 * Read some scanlines of data from the JPEG decompressor.
144 * 249 *
145 * The return value will be the number of lines actually read. 250 * The return value will be the number of lines actually read.
146 * This may be less than the number requested in several cases, 251 * This may be less than the number requested in several cases,
147 * including bottom of image, data source suspension, and operating 252 * including bottom of image, data source suspension, and operating
148 * modes that emit multiple scanlines at a time. 253 * modes that emit multiple scanlines at a time.
149 * 254 *
150 * Note: we warn about excess calls to jpeg_read_scanlines() since 255 * Note: we warn about excess calls to jpeg_read_scanlines() since
151 * this likely signals an application programmer error. However, 256 * this likely signals an application programmer error. However,
152 * an oversize buffer (max_lines > scanlines remaining) is not an error. 257 * an oversize buffer (max_lines > scanlines remaining) is not an error.
153 */ 258 */
154 259
155 GLOBAL(JDIMENSION) 260 GLOBAL(JDIMENSION)
156 jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, 261 jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines,
157 » » JDIMENSION max_lines) 262 JDIMENSION max_lines)
158 { 263 {
159 JDIMENSION row_ctr; 264 JDIMENSION row_ctr;
160 265
161 if (cinfo->global_state != DSTATE_SCANNING) 266 if (cinfo->global_state != DSTATE_SCANNING)
162 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 267 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
163 if (cinfo->output_scanline >= cinfo->output_height) { 268 if (cinfo->output_scanline >= cinfo->output_height) {
164 WARNMS(cinfo, JWRN_TOO_MUCH_DATA); 269 WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
165 return 0; 270 return 0;
166 } 271 }
167 272
168 /* Call progress monitor hook if present */ 273 /* Call progress monitor hook if present */
169 if (cinfo->progress != NULL) { 274 if (cinfo->progress != NULL) {
170 cinfo->progress->pass_counter = (long) cinfo->output_scanline; 275 cinfo->progress->pass_counter = (long) cinfo->output_scanline;
171 cinfo->progress->pass_limit = (long) cinfo->output_height; 276 cinfo->progress->pass_limit = (long) cinfo->output_height;
172 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 277 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
173 } 278 }
174 279
175 /* Process some data */ 280 /* Process some data */
176 row_ctr = 0; 281 row_ctr = 0;
177 (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); 282 (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines);
178 cinfo->output_scanline += row_ctr; 283 cinfo->output_scanline += row_ctr;
179 return row_ctr; 284 return row_ctr;
180 } 285 }
181 286
182 287
183
184 /* Dummy color convert function used by jpeg_skip_scanlines() */ 288 /* Dummy color convert function used by jpeg_skip_scanlines() */
185 LOCAL(void) 289 LOCAL(void)
186 noop_convert (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, 290 noop_convert (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
187 JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows) 291 JDIMENSION input_row, JSAMPARRAY output_buf, int num_rows)
188 { 292 {
189 } 293 }
190 294
191 295
192 /* 296 /*
193 * In some cases, it is best to call jpeg_read_scanlines() and discard the 297 * In some cases, it is best to call jpeg_read_scanlines() and discard the
194 * output, rather than skipping the scanlines, because this allows us to 298 * output, rather than skipping the scanlines, because this allows us to
195 * maintain the internal state of the context-based upsampler. In these cases, 299 * maintain the internal state of the context-based upsampler. In these cases,
196 * we set up and tear down a dummy color converter in order to avoid valgrind 300 * we set up and tear down a dummy color converter in order to avoid valgrind
197 * errors and to achieve the best possible performance. 301 * errors and to achieve the best possible performance.
198 */ 302 */
303
199 LOCAL(void) 304 LOCAL(void)
200 read_and_discard_scanlines (j_decompress_ptr cinfo, JDIMENSION num_lines) 305 read_and_discard_scanlines (j_decompress_ptr cinfo, JDIMENSION num_lines)
201 { 306 {
202 JDIMENSION n; 307 JDIMENSION n;
203 void (*color_convert) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf, 308 void (*color_convert) (j_decompress_ptr cinfo, JSAMPIMAGE input_buf,
204 JDIMENSION input_row, JSAMPARRAY output_buf, 309 JDIMENSION input_row, JSAMPARRAY output_buf,
205 int num_rows); 310 int num_rows);
206 311
207 color_convert = cinfo->cconvert->color_convert; 312 color_convert = cinfo->cconvert->color_convert;
208 cinfo->cconvert->color_convert = noop_convert; 313 cinfo->cconvert->color_convert = noop_convert;
209 314
210 for (n = 0; n < num_lines; n++) 315 for (n = 0; n < num_lines; n++)
211 jpeg_read_scanlines(cinfo, NULL, 1); 316 jpeg_read_scanlines(cinfo, NULL, 1);
212 317
213 cinfo->cconvert->color_convert = color_convert; 318 cinfo->cconvert->color_convert = color_convert;
214 } 319 }
215 320
321
216 /* 322 /*
217 * Called by jpeg_skip_scanlines(). This partially skips a decompress block by 323 * Called by jpeg_skip_scanlines(). This partially skips a decompress block by
218 * incrementing the rowgroup counter. 324 * incrementing the rowgroup counter.
219 */ 325 */
220 326
221 LOCAL(void) 327 LOCAL(void)
222 increment_simple_rowgroup_ctr (j_decompress_ptr cinfo, JDIMENSION rows) 328 increment_simple_rowgroup_ctr (j_decompress_ptr cinfo, JDIMENSION rows)
223 { 329 {
224 JDIMENSION rows_left; 330 JDIMENSION rows_left;
225 my_main_ptr main_ptr = (my_main_ptr) cinfo->main; 331 my_main_ptr main_ptr = (my_main_ptr) cinfo->main;
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 return num_lines; 515 return num_lines;
410 } 516 }
411 517
412 /* 518 /*
413 * Alternate entry point to read raw data. 519 * Alternate entry point to read raw data.
414 * Processes exactly one iMCU row per call, unless suspended. 520 * Processes exactly one iMCU row per call, unless suspended.
415 */ 521 */
416 522
417 GLOBAL(JDIMENSION) 523 GLOBAL(JDIMENSION)
418 jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, 524 jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data,
419 » » JDIMENSION max_lines) 525 JDIMENSION max_lines)
420 { 526 {
421 JDIMENSION lines_per_iMCU_row; 527 JDIMENSION lines_per_iMCU_row;
422 528
423 if (cinfo->global_state != DSTATE_RAW_OK) 529 if (cinfo->global_state != DSTATE_RAW_OK)
424 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 530 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
425 if (cinfo->output_scanline >= cinfo->output_height) { 531 if (cinfo->output_scanline >= cinfo->output_height) {
426 WARNMS(cinfo, JWRN_TOO_MUCH_DATA); 532 WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
427 return 0; 533 return 0;
428 } 534 }
429 535
430 /* Call progress monitor hook if present */ 536 /* Call progress monitor hook if present */
431 if (cinfo->progress != NULL) { 537 if (cinfo->progress != NULL) {
432 cinfo->progress->pass_counter = (long) cinfo->output_scanline; 538 cinfo->progress->pass_counter = (long) cinfo->output_scanline;
433 cinfo->progress->pass_limit = (long) cinfo->output_height; 539 cinfo->progress->pass_limit = (long) cinfo->output_height;
434 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); 540 (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
435 } 541 }
436 542
437 /* Verify that at least one iMCU row can be returned. */ 543 /* Verify that at least one iMCU row can be returned. */
438 lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->_min_DCT_scaled_size; 544 lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->_min_DCT_scaled_size;
439 if (max_lines < lines_per_iMCU_row) 545 if (max_lines < lines_per_iMCU_row)
440 ERREXIT(cinfo, JERR_BUFFER_SIZE); 546 ERREXIT(cinfo, JERR_BUFFER_SIZE);
441 547
442 /* Decompress directly into user's buffer. */ 548 /* Decompress directly into user's buffer. */
443 if (! (*cinfo->coef->decompress_data) (cinfo, data)) 549 if (! (*cinfo->coef->decompress_data) (cinfo, data))
444 return 0;» » » /* suspension forced, can do nothing more */ 550 return 0; /* suspension forced, can do nothing more */
445 551
446 /* OK, we processed one iMCU row. */ 552 /* OK, we processed one iMCU row. */
447 cinfo->output_scanline += lines_per_iMCU_row; 553 cinfo->output_scanline += lines_per_iMCU_row;
448 return lines_per_iMCU_row; 554 return lines_per_iMCU_row;
449 } 555 }
450 556
451 557
452 /* Additional entry points for buffered-image mode. */ 558 /* Additional entry points for buffered-image mode. */
453 559
454 #ifdef D_MULTISCAN_FILES_SUPPORTED 560 #ifdef D_MULTISCAN_FILES_SUPPORTED
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 /* Terminate this pass. */ 596 /* Terminate this pass. */
491 /* We do not require the whole pass to have been completed. */ 597 /* We do not require the whole pass to have been completed. */
492 (*cinfo->master->finish_output_pass) (cinfo); 598 (*cinfo->master->finish_output_pass) (cinfo);
493 cinfo->global_state = DSTATE_BUFPOST; 599 cinfo->global_state = DSTATE_BUFPOST;
494 } else if (cinfo->global_state != DSTATE_BUFPOST) { 600 } else if (cinfo->global_state != DSTATE_BUFPOST) {
495 /* BUFPOST = repeat call after a suspension, anything else is error */ 601 /* BUFPOST = repeat call after a suspension, anything else is error */
496 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); 602 ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
497 } 603 }
498 /* Read markers looking for SOS or EOI */ 604 /* Read markers looking for SOS or EOI */
499 while (cinfo->input_scan_number <= cinfo->output_scan_number && 605 while (cinfo->input_scan_number <= cinfo->output_scan_number &&
500 » ! cinfo->inputctl->eoi_reached) { 606 ! cinfo->inputctl->eoi_reached) {
501 if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) 607 if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED)
502 return FALSE;» » /* Suspend, come back later */ 608 return FALSE; /* Suspend, come back later */
503 } 609 }
504 cinfo->global_state = DSTATE_BUFIMAGE; 610 cinfo->global_state = DSTATE_BUFIMAGE;
505 return TRUE; 611 return TRUE;
506 } 612 }
507 613
508 #endif /* D_MULTISCAN_FILES_SUPPORTED */ 614 #endif /* D_MULTISCAN_FILES_SUPPORTED */
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698