Index: third_party/libjpeg_turbo/jdinput.c |
=================================================================== |
--- third_party/libjpeg_turbo/jdinput.c (revision 95020) |
+++ third_party/libjpeg_turbo/jdinput.c (working copy) |
@@ -2,6 +2,8 @@ |
* jdinput.c |
* |
* Copyright (C) 1991-1997, Thomas G. Lane. |
+ * Modified 2002-2009 by Guido Vollbeding. |
+ * Copyright (C) 2010, D. R. Commander. |
* This file is part of the Independent JPEG Group's software. |
* For conditions of distribution and use, see the accompanying README file. |
* |
@@ -14,6 +16,7 @@ |
#define JPEG_INTERNALS |
#include "jinclude.h" |
#include "jpeglib.h" |
+#include "jpegcomp.h" |
/* Private state */ |
@@ -35,6 +38,79 @@ |
* Routines to calculate various quantities related to the size of the image. |
*/ |
+ |
+#if JPEG_LIB_VERSION >= 80 |
+/* |
+ * Compute output image dimensions and related values. |
+ * NOTE: this is exported for possible use by application. |
+ * Hence it mustn't do anything that can't be done twice. |
+ */ |
+ |
+GLOBAL(void) |
+jpeg_core_output_dimensions (j_decompress_ptr cinfo) |
+/* Do computations that are needed before master selection phase. |
+ * This function is used for transcoding and full decompression. |
+ */ |
+{ |
+#ifdef IDCT_SCALING_SUPPORTED |
+ int ci; |
+ jpeg_component_info *compptr; |
+ |
+ /* Compute actual output image dimensions and DCT scaling choices. */ |
+ if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) { |
+ /* Provide 1/block_size scaling */ |
+ cinfo->output_width = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size); |
+ cinfo->output_height = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size); |
+ cinfo->min_DCT_h_scaled_size = 1; |
+ cinfo->min_DCT_v_scaled_size = 1; |
+ } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) { |
+ /* Provide 2/block_size scaling */ |
+ cinfo->output_width = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size); |
+ cinfo->output_height = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size); |
+ cinfo->min_DCT_h_scaled_size = 2; |
+ cinfo->min_DCT_v_scaled_size = 2; |
+ } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) { |
+ /* Provide 4/block_size scaling */ |
+ cinfo->output_width = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size); |
+ cinfo->output_height = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size); |
+ cinfo->min_DCT_h_scaled_size = 4; |
+ cinfo->min_DCT_v_scaled_size = 4; |
+ } else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) { |
+ /* Provide 8/block_size scaling */ |
+ cinfo->output_width = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size); |
+ cinfo->output_height = (JDIMENSION) |
+ jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size); |
+ cinfo->min_DCT_h_scaled_size = 8; |
+ cinfo->min_DCT_v_scaled_size = 8; |
+ } |
+ /* Recompute dimensions of components */ |
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |
+ ci++, compptr++) { |
+ compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size; |
+ compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size; |
+ } |
+ |
+#else /* !IDCT_SCALING_SUPPORTED */ |
+ |
+ /* Hardwire it to "no scaling" */ |
+ cinfo->output_width = cinfo->image_width; |
+ cinfo->output_height = cinfo->image_height; |
+ /* jdinput.c has already initialized DCT_scaled_size, |
+ * and has computed unscaled downsampled_width and downsampled_height. |
+ */ |
+ |
+#endif /* IDCT_SCALING_SUPPORTED */ |
+} |
+#endif |
+ |
+ |
LOCAL(void) |
initial_setup (j_decompress_ptr cinfo) |
/* Called once, when first SOS marker is reached */ |
@@ -70,16 +146,30 @@ |
compptr->v_samp_factor); |
} |
+#if JPEG_LIB_VERSION >=80 |
+ cinfo->block_size = DCTSIZE; |
+ cinfo->natural_order = jpeg_natural_order; |
+ cinfo->lim_Se = DCTSIZE2-1; |
+#endif |
+ |
/* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. |
* In the full decompressor, this will be overridden by jdmaster.c; |
* but in the transcoder, jdmaster.c is not used, so we must do it here. |
*/ |
+#if JPEG_LIB_VERSION >= 70 |
+ cinfo->min_DCT_h_scaled_size = cinfo->min_DCT_v_scaled_size = DCTSIZE; |
+#else |
cinfo->min_DCT_scaled_size = DCTSIZE; |
+#endif |
/* Compute dimensions of components */ |
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; |
ci++, compptr++) { |
+#if JPEG_LIB_VERSION >= 70 |
+ compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size = DCTSIZE; |
+#else |
compptr->DCT_scaled_size = DCTSIZE; |
+#endif |
/* Size in DCT blocks */ |
compptr->width_in_blocks = (JDIMENSION) |
jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, |
@@ -138,7 +228,7 @@ |
compptr->MCU_width = 1; |
compptr->MCU_height = 1; |
compptr->MCU_blocks = 1; |
- compptr->MCU_sample_width = compptr->DCT_scaled_size; |
+ compptr->MCU_sample_width = compptr->_DCT_scaled_size; |
compptr->last_col_width = 1; |
/* For noninterleaved scans, it is convenient to define last_row_height |
* as the number of block rows present in the last iMCU row. |
@@ -174,7 +264,7 @@ |
compptr->MCU_width = compptr->h_samp_factor; |
compptr->MCU_height = compptr->v_samp_factor; |
compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; |
- compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size; |
+ compptr->MCU_sample_width = compptr->MCU_width * compptr->_DCT_scaled_size; |
/* Figure number of non-dummy blocks in last MCU column & row */ |
tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); |
if (tmp == 0) tmp = compptr->MCU_width; |