Hi Sven,
thanks, looks like it still works with the older libjpeg.
Committed revision 2068.
René
On Feb 27, 2015, at 11:03, Sven Eckelmann <[email protected]> wrote:
> ---
> codecs/jpegcomp.h | 30 +++++++
> codecs/jpegint.h | 9 +++
> codecs/transupp.c | 233 ++++++++++++++++++++++++++++++++++++++----------------
> codecs/transupp.h | 41 +++++++---
> 4 files changed, 231 insertions(+), 82 deletions(-)
> create mode 100644 codecs/jpegcomp.h
>
> diff --git a/codecs/jpegcomp.h b/codecs/jpegcomp.h
> new file mode 100644
> index 0000000..ed9eeab
> --- /dev/null
> +++ b/codecs/jpegcomp.h
> @@ -0,0 +1,30 @@
> +/*
> + * jpegcomp.h
> + *
> + * Copyright (C) 2010, D. R. Commander
> + * For conditions of distribution and use, see the accompanying README file.
> + *
> + * JPEG compatibility macros
> + * These declarations are considered internal to the JPEG library; most
> + * applications using the library shouldn't need to include this file.
> + */
> +
> +#if JPEG_LIB_VERSION >= 70
> +#define _DCT_scaled_size DCT_h_scaled_size
> +#define _DCT_h_scaled_size DCT_h_scaled_size
> +#define _DCT_v_scaled_size DCT_v_scaled_size
> +#define _min_DCT_scaled_size min_DCT_h_scaled_size
> +#define _min_DCT_h_scaled_size min_DCT_h_scaled_size
> +#define _min_DCT_v_scaled_size min_DCT_v_scaled_size
> +#define _jpeg_width jpeg_width
> +#define _jpeg_height jpeg_height
> +#else
> +#define _DCT_scaled_size DCT_scaled_size
> +#define _DCT_h_scaled_size DCT_scaled_size
> +#define _DCT_v_scaled_size DCT_scaled_size
> +#define _min_DCT_scaled_size min_DCT_scaled_size
> +#define _min_DCT_h_scaled_size min_DCT_scaled_size
> +#define _min_DCT_v_scaled_size min_DCT_scaled_size
> +#define _jpeg_width image_width
> +#define _jpeg_height image_height
> +#endif
> diff --git a/codecs/jpegint.h b/codecs/jpegint.h
> index 95b00d4..7871748 100644
> --- a/codecs/jpegint.h
> +++ b/codecs/jpegint.h
> @@ -2,6 +2,7 @@
> * jpegint.h
> *
> * Copyright (C) 1991-1997, Thomas G. Lane.
> + * Modified 1997-2009 by Guido Vollbeding.
> * This file is part of the Independent JPEG Group's software.
> * For conditions of distribution and use, see the accompanying README file.
> *
> @@ -304,6 +305,7 @@ struct jpeg_color_quantizer {
> #define jinit_forward_dct jIFDCT
> #define jinit_huff_encoder jIHEncoder
> #define jinit_phuff_encoder jIPHEncoder
> +#define jinit_arith_encoder jIAEncoder
> #define jinit_marker_writer jIMWriter
> #define jinit_master_decompress jIDMaster
> #define jinit_d_main_controller jIDMainC
> @@ -313,6 +315,7 @@ struct jpeg_color_quantizer {
> #define jinit_marker_reader jIMReader
> #define jinit_huff_decoder jIHDecoder
> #define jinit_phuff_decoder jIPHDecoder
> +#define jinit_arith_decoder jIADecoder
> #define jinit_inverse_dct jIIDCT
> #define jinit_upsampler jIUpsampler
> #define jinit_color_deconverter jIDColor
> @@ -327,6 +330,7 @@ struct jpeg_color_quantizer {
> #define jzero_far jZeroFar
> #define jpeg_zigzag_order jZIGTable
> #define jpeg_natural_order jZAGTable
> +#define jpeg_aritab jAriTab
> #endif /* NEED_SHORT_EXTERNAL_NAMES */
>
>
> @@ -345,6 +349,7 @@ EXTERN(void) jinit_downsampler JPP((j_compress_ptr
> cinfo));
> EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
> EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
> EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
> +EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo));
> EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
> /* Decompression module initialization routines */
> EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
> @@ -358,6 +363,7 @@ EXTERN(void) jinit_input_controller JPP((j_decompress_ptr
> cinfo));
> EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
> EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
> EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
> +EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo));
> EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
> EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
> EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
> @@ -382,6 +388,9 @@ extern const int jpeg_zigzag_order[]; /* natural coef
> order to zigzag order */
> #endif
> extern const int jpeg_natural_order[]; /* zigzag coef order to natural order
> */
>
> +/* Arithmetic coding probability estimation tables in jaricom.c */
> +extern const INT32 jpeg_aritab[];
> +
> /* Suppress undefined-structure complaints if necessary. */
>
> #ifdef INCOMPLETE_TYPES_BROKEN
> diff --git a/codecs/transupp.c b/codecs/transupp.c
> index e6bb936..9e80583 100644
> --- a/codecs/transupp.c
> +++ b/codecs/transupp.c
> @@ -1,8 +1,10 @@
> /*
> * transupp.c
> *
> - * Copyright (C) 1997-2001, Thomas G. Lane.
> - * This file is part of the Independent JPEG Group's software.
> + * This file was part of the Independent JPEG Group's software:
> + * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.
> + * Modifications:
> + * Copyright (C) 2010, D. R. Commander.
> * For conditions of distribution and use, see the accompanying README file.
> *
> * This file contains image transformation routines and other utility code
> @@ -20,9 +22,19 @@
> #include "jinclude.h"
> #include "jpeglib.h"
> #include "transupp.h" /* My own external interface */
> +#include "jpegcomp.h"
> #include <ctype.h> /* to declare isdigit() */
>
>
> +#if JPEG_LIB_VERSION >= 70
> +#define dstinfo_min_DCT_h_scaled_size dstinfo->min_DCT_h_scaled_size
> +#define dstinfo_min_DCT_v_scaled_size dstinfo->min_DCT_v_scaled_size
> +#else
> +#define dstinfo_min_DCT_h_scaled_size DCTSIZE
> +#define dstinfo_min_DCT_v_scaled_size DCTSIZE
> +#endif
> +
> +
> #if TRANSFORMS_SUPPORTED
>
> /*
> @@ -133,7 +145,8 @@ do_flip_h_no_crop (j_decompress_ptr srcinfo,
> j_compress_ptr dstinfo,
> * mirroring by changing the signs of odd-numbered columns.
> * Partial iMCUs at the right edge are left untouched.
> */
> - MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
> + MCU_cols = srcinfo->output_width /
> + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size);
>
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -198,7 +211,8 @@ do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr
> dstinfo,
> * different rows of a single virtual array simultaneously. Otherwise,
> * this is essentially the same as the routine above.
> */
> - MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
> + MCU_cols = srcinfo->output_width /
> + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size);
>
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -262,7 +276,8 @@ do_flip_v (j_decompress_ptr srcinfo, j_compress_ptr
> dstinfo,
> * of odd-numbered rows.
> * Partial iMCUs at the bottom edge are copied verbatim.
> */
> - MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
> + MCU_rows = srcinfo->output_height /
> + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size);
>
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -389,7 +404,8 @@ do_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr
> dstinfo,
> * at the (output) right edge properly. They just get transposed and
> * not mirrored.
> */
> - MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE);
> + MCU_cols = srcinfo->output_height /
> + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size);
>
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -469,7 +485,8 @@ do_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr
> dstinfo,
> * at the (output) bottom edge properly. They just get transposed and
> * not mirrored.
> */
> - MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE);
> + MCU_rows = srcinfo->output_width /
> + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size);
>
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -536,8 +553,10 @@ do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr
> dstinfo,
> JCOEFPTR src_ptr, dst_ptr;
> jpeg_component_info *compptr;
>
> - MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
> - MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
> + MCU_cols = srcinfo->output_width /
> + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size);
> + MCU_rows = srcinfo->output_height /
> + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size);
>
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -645,8 +664,10 @@ do_transverse (j_decompress_ptr srcinfo, j_compress_ptr
> dstinfo,
> JCOEFPTR src_ptr, dst_ptr;
> jpeg_component_info *compptr;
>
> - MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE);
> - MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE);
> + MCU_cols = srcinfo->output_height /
> + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size);
> + MCU_rows = srcinfo->output_width /
> + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size);
>
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -762,7 +783,7 @@ jt_read_integer (const char ** strptr, JDIMENSION *
> result)
> * The routine returns TRUE if the spec string is valid, FALSE if not.
> *
> * The crop spec string should have the format
> - * <width>x<height>{+-}<xoffset>{+-}<yoffset>
> + * <width>[f]x<height>[f]{+-}<xoffset>{+-}<yoffset>
> * where width, height, xoffset, and yoffset are unsigned integers.
> * Each of the elements can be omitted to indicate a default value.
> * (A weakness of this style is that it is not possible to omit xoffset
> @@ -784,14 +805,22 @@ jtransform_parse_crop_spec (jpeg_transform_info *info,
> const char *spec)
> /* fetch width */
> if (! jt_read_integer(&spec, &info->crop_width))
> return FALSE;
> - info->crop_width_set = JCROP_POS;
> + if (*spec == 'f' || *spec == 'F') {
> + spec++;
> + info->crop_width_set = JCROP_FORCE;
> + } else
> + info->crop_width_set = JCROP_POS;
> }
> - if (*spec == 'x' || *spec == 'X') {
> + if (*spec == 'x' || *spec == 'X') {
> /* fetch height */
> spec++;
> if (! jt_read_integer(&spec, &info->crop_height))
> return FALSE;
> - info->crop_height_set = JCROP_POS;
> + if (*spec == 'f' || *spec == 'F') {
> + spec++;
> + info->crop_height_set = JCROP_FORCE;
> + } else
> + info->crop_height_set = JCROP_POS;
> }
> if (*spec == '+' || *spec == '-') {
> /* fetch xoffset */
> @@ -822,10 +851,10 @@ trim_right_edge (jpeg_transform_info *info, JDIMENSION
> full_width)
> {
> JDIMENSION MCU_cols;
>
> - MCU_cols = info->output_width / (info->max_h_samp_factor * DCTSIZE);
> + MCU_cols = info->output_width / info->iMCU_sample_width;
> if (MCU_cols > 0 && info->x_crop_offset + MCU_cols ==
> - full_width / (info->max_h_samp_factor * DCTSIZE))
> - info->output_width = MCU_cols * (info->max_h_samp_factor * DCTSIZE);
> + full_width / info->iMCU_sample_width)
> + info->output_width = MCU_cols * info->iMCU_sample_width;
> }
>
> LOCAL(void)
> @@ -833,10 +862,10 @@ trim_bottom_edge (jpeg_transform_info *info, JDIMENSION
> full_height)
> {
> JDIMENSION MCU_rows;
>
> - MCU_rows = info->output_height / (info->max_v_samp_factor * DCTSIZE);
> + MCU_rows = info->output_height / info->iMCU_sample_height;
> if (MCU_rows > 0 && info->y_crop_offset + MCU_rows ==
> - full_height / (info->max_v_samp_factor * DCTSIZE))
> - info->output_height = MCU_rows * (info->max_v_samp_factor * DCTSIZE);
> + full_height / info->iMCU_sample_height)
> + info->output_height = MCU_rows * info->iMCU_sample_height;
> }
>
>
> @@ -852,59 +881,94 @@ trim_bottom_edge (jpeg_transform_info *info, JDIMENSION
> full_height)
> * Hence, this routine must be called after jpeg_read_header (which reads
> * the image dimensions) and before jpeg_read_coefficients (which realizes
> * the source's virtual arrays).
> + *
> + * This function returns FALSE right away if -perfect is given
> + * and transformation is not perfect. Otherwise returns TRUE.
> */
>
> -GLOBAL(void)
> +GLOBAL(boolean)
> jtransform_request_workspace (j_decompress_ptr srcinfo,
> jpeg_transform_info *info)
> {
> - jvirt_barray_ptr *coef_arrays = NULL;
> + jvirt_barray_ptr *coef_arrays;
> boolean need_workspace, transpose_it;
> jpeg_component_info *compptr;
> - JDIMENSION xoffset, yoffset, width_in_iMCUs, height_in_iMCUs;
> + JDIMENSION xoffset, yoffset;
> + JDIMENSION width_in_iMCUs, height_in_iMCUs;
> JDIMENSION width_in_blocks, height_in_blocks;
> int ci, h_samp_factor, v_samp_factor;
>
> /* Determine number of components in output image */
> if (info->force_grayscale &&
> srcinfo->jpeg_color_space == JCS_YCbCr &&
> - srcinfo->num_components == 3) {
> + srcinfo->num_components == 3)
> /* We'll only process the first component */
> info->num_components = 1;
> - } else {
> + else
> /* Process all the components */
> info->num_components = srcinfo->num_components;
> +
> + /* Compute output image dimensions and related values. */
> +#if JPEG_LIB_VERSION >= 80
> + jpeg_core_output_dimensions(srcinfo);
> +#else
> + srcinfo->output_width = srcinfo->image_width;
> + srcinfo->output_height = srcinfo->image_height;
> +#endif
> +
> + /* Return right away if -perfect is given and transformation is not
> perfect.
> + */
> + if (info->perfect) {
> + if (info->num_components == 1) {
> + if (!jtransform_perfect_transform(srcinfo->output_width,
> + srcinfo->output_height,
> + srcinfo->_min_DCT_h_scaled_size,
> + srcinfo->_min_DCT_v_scaled_size,
> + info->transform))
> + return FALSE;
> + } else {
> + if (!jtransform_perfect_transform(srcinfo->output_width,
> + srcinfo->output_height,
> + srcinfo->max_h_samp_factor * srcinfo->_min_DCT_h_scaled_size,
> + srcinfo->max_v_samp_factor * srcinfo->_min_DCT_v_scaled_size,
> + info->transform))
> + return FALSE;
> + }
> }
> +
> /* If there is only one output component, force the iMCU size to be 1;
> * else use the source iMCU size. (This allows us to do the right thing
> * when reducing color to grayscale, and also provides a handy way of
> * cleaning up "funny" grayscale images whose sampling factors are not 1x1.)
> */
> -
> switch (info->transform) {
> case JXFORM_TRANSPOSE:
> case JXFORM_TRANSVERSE:
> case JXFORM_ROT_90:
> case JXFORM_ROT_270:
> - info->output_width = srcinfo->image_height;
> - info->output_height = srcinfo->image_width;
> + info->output_width = srcinfo->output_height;
> + info->output_height = srcinfo->output_width;
> if (info->num_components == 1) {
> - info->max_h_samp_factor = 1;
> - info->max_v_samp_factor = 1;
> + info->iMCU_sample_width = srcinfo->_min_DCT_v_scaled_size;
> + info->iMCU_sample_height = srcinfo->_min_DCT_h_scaled_size;
> } else {
> - info->max_h_samp_factor = srcinfo->max_v_samp_factor;
> - info->max_v_samp_factor = srcinfo->max_h_samp_factor;
> + info->iMCU_sample_width =
> + srcinfo->max_v_samp_factor * srcinfo->_min_DCT_v_scaled_size;
> + info->iMCU_sample_height =
> + srcinfo->max_h_samp_factor * srcinfo->_min_DCT_h_scaled_size;
> }
> break;
> default:
> - info->output_width = srcinfo->image_width;
> - info->output_height = srcinfo->image_height;
> + info->output_width = srcinfo->output_width;
> + info->output_height = srcinfo->output_height;
> if (info->num_components == 1) {
> - info->max_h_samp_factor = 1;
> - info->max_v_samp_factor = 1;
> + info->iMCU_sample_width = srcinfo->_min_DCT_h_scaled_size;
> + info->iMCU_sample_height = srcinfo->_min_DCT_v_scaled_size;
> } else {
> - info->max_h_samp_factor = srcinfo->max_h_samp_factor;
> - info->max_v_samp_factor = srcinfo->max_v_samp_factor;
> + info->iMCU_sample_width =
> + srcinfo->max_h_samp_factor * srcinfo->_min_DCT_h_scaled_size;
> + info->iMCU_sample_height =
> + srcinfo->max_v_samp_factor * srcinfo->_min_DCT_v_scaled_size;
> }
> break;
> }
> @@ -920,7 +984,7 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
> info->crop_yoffset = 0; /* default to +0 */
> if (info->crop_xoffset >= info->output_width ||
> info->crop_yoffset >= info->output_height)
> - ERREXIT(srcinfo, "Invalid crop request"); /* was: JERR_BAD_CROP_SPEC */
> + ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
> if (info->crop_width_set == JCROP_UNSET)
> info->crop_width = info->output_width - info->crop_xoffset;
> if (info->crop_height_set == JCROP_UNSET)
> @@ -930,7 +994,7 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
> info->crop_height <= 0 || info->crop_height > info->output_height ||
> info->crop_xoffset > info->output_width - info->crop_width ||
> info->crop_yoffset > info->output_height - info->crop_height)
> - ERREXIT(srcinfo, "Invalid crop request"); /* was: JERR_BAD_CROP_SPEC */
> + ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
> /* Convert negative crop offsets into regular offsets */
> if (info->crop_xoffset_set == JCROP_NEG)
> xoffset = info->output_width - info->crop_width - info->crop_xoffset;
> @@ -941,13 +1005,19 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
> else
> yoffset = info->crop_yoffset;
> /* Now adjust so that upper left corner falls at an iMCU boundary */
> - info->output_width =
> - info->crop_width + (xoffset % (info->max_h_samp_factor * DCTSIZE));
> - info->output_height =
> - info->crop_height + (yoffset % (info->max_v_samp_factor * DCTSIZE));
> + if (info->crop_width_set == JCROP_FORCE)
> + info->output_width = info->crop_width;
> + else
> + info->output_width =
> + info->crop_width + (xoffset % info->iMCU_sample_width);
> + if (info->crop_height_set == JCROP_FORCE)
> + info->output_height = info->crop_height;
> + else
> + info->output_height =
> + info->crop_height + (yoffset % info->iMCU_sample_height);
> /* Save x/y offsets measured in iMCUs */
> - info->x_crop_offset = xoffset / (info->max_h_samp_factor * DCTSIZE);
> - info->y_crop_offset = yoffset / (info->max_v_samp_factor * DCTSIZE);
> + info->x_crop_offset = xoffset / info->iMCU_sample_width;
> + info->y_crop_offset = yoffset / info->iMCU_sample_height;
> } else {
> info->x_crop_offset = 0;
> info->y_crop_offset = 0;
> @@ -966,14 +1036,14 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
> break;
> case JXFORM_FLIP_H:
> if (info->trim)
> - trim_right_edge(info, srcinfo->image_width);
> - if (info->y_crop_offset != 0)
> + trim_right_edge(info, srcinfo->output_width);
> + if (info->y_crop_offset != 0 || info->slow_hflip)
> need_workspace = TRUE;
> /* do_flip_h_no_crop doesn't need a workspace array */
> break;
> case JXFORM_FLIP_V:
> if (info->trim)
> - trim_bottom_edge(info, srcinfo->image_height);
> + trim_bottom_edge(info, srcinfo->output_height);
> /* Need workspace arrays having same dimensions as source image. */
> need_workspace = TRUE;
> break;
> @@ -985,8 +1055,8 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
> break;
> case JXFORM_TRANSVERSE:
> if (info->trim) {
> - trim_right_edge(info, srcinfo->image_height);
> - trim_bottom_edge(info, srcinfo->image_width);
> + trim_right_edge(info, srcinfo->output_height);
> + trim_bottom_edge(info, srcinfo->output_width);
> }
> /* Need workspace arrays having transposed dimensions. */
> need_workspace = TRUE;
> @@ -994,22 +1064,22 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
> break;
> case JXFORM_ROT_90:
> if (info->trim)
> - trim_right_edge(info, srcinfo->image_height);
> + trim_right_edge(info, srcinfo->output_height);
> /* Need workspace arrays having transposed dimensions. */
> need_workspace = TRUE;
> transpose_it = TRUE;
> break;
> case JXFORM_ROT_180:
> if (info->trim) {
> - trim_right_edge(info, srcinfo->image_width);
> - trim_bottom_edge(info, srcinfo->image_height);
> + trim_right_edge(info, srcinfo->output_width);
> + trim_bottom_edge(info, srcinfo->output_height);
> }
> /* Need workspace arrays having same dimensions as source image. */
> need_workspace = TRUE;
> break;
> case JXFORM_ROT_270:
> if (info->trim)
> - trim_bottom_edge(info, srcinfo->image_width);
> + trim_bottom_edge(info, srcinfo->output_width);
> /* Need workspace arrays having transposed dimensions. */
> need_workspace = TRUE;
> transpose_it = TRUE;
> @@ -1026,10 +1096,10 @@ jtransform_request_workspace (j_decompress_ptr
> srcinfo,
> SIZEOF(jvirt_barray_ptr) * info->num_components);
> width_in_iMCUs = (JDIMENSION)
> jdiv_round_up((long) info->output_width,
> - (long) (info->max_h_samp_factor * DCTSIZE));
> + (long) info->iMCU_sample_width);
> height_in_iMCUs = (JDIMENSION)
> jdiv_round_up((long) info->output_height,
> - (long) (info->max_v_samp_factor * DCTSIZE));
> + (long) info->iMCU_sample_height);
> for (ci = 0; ci < info->num_components; ci++) {
> compptr = srcinfo->comp_info + ci;
> if (info->num_components == 1) {
> @@ -1048,9 +1118,11 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
> ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE,
> width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor);
> }
> - }
> + info->workspace_coef_arrays = coef_arrays;
> + } else
> + info->workspace_coef_arrays = NULL;
>
> - info->workspace_coef_arrays = coef_arrays;
> + return TRUE;
> }
>
>
> @@ -1062,8 +1134,19 @@ transpose_critical_parameters (j_compress_ptr dstinfo)
> int tblno, i, j, ci, itemp;
> jpeg_component_info *compptr;
> JQUANT_TBL *qtblptr;
> + JDIMENSION jtemp;
> UINT16 qtemp;
>
> + /* Transpose image dimensions */
> + jtemp = dstinfo->image_width;
> + dstinfo->image_width = dstinfo->image_height;
> + dstinfo->image_height = jtemp;
> +#if JPEG_LIB_VERSION >= 70
> + itemp = dstinfo->min_DCT_h_scaled_size;
> + dstinfo->min_DCT_h_scaled_size = dstinfo->min_DCT_v_scaled_size;
> + dstinfo->min_DCT_v_scaled_size = itemp;
> +#endif
> +
> /* Transpose sampling factors */
> for (ci = 0; ci < dstinfo->num_components; ci++) {
> compptr = dstinfo->comp_info + ci;
> @@ -1296,10 +1379,12 @@ jtransform_adjust_parameters (j_decompress_ptr
> srcinfo,
> }
>
> /* Correct the destination's image dimensions as necessary
> - * for crop and rotate/flip operations.
> + * for rotate/flip, resize, and crop operations.
> */
> - dstinfo->image_width = info->output_width;
> - dstinfo->image_height = info->output_height;
> +#if JPEG_LIB_VERSION >= 70
> + dstinfo->jpeg_width = info->output_width;
> + dstinfo->jpeg_height = info->output_height;
> +#endif
>
> /* Transpose destination image parameters */
> switch (info->transform) {
> @@ -1307,9 +1392,17 @@ jtransform_adjust_parameters (j_decompress_ptr srcinfo,
> case JXFORM_TRANSVERSE:
> case JXFORM_ROT_90:
> case JXFORM_ROT_270:
> +#if JPEG_LIB_VERSION < 70
> + dstinfo->image_width = info->output_height;
> + dstinfo->image_height = info->output_width;
> +#endif
> transpose_critical_parameters(dstinfo);
> break;
> default:
> +#if JPEG_LIB_VERSION < 70
> + dstinfo->image_width = info->output_width;
> + dstinfo->image_height = info->output_height;
> +#endif
> break;
> }
>
> @@ -1325,13 +1418,15 @@ jtransform_adjust_parameters (j_decompress_ptr
> srcinfo,
> GETJOCTET(srcinfo->marker_list->data[5]) == 0) {
> /* Suppress output of JFIF marker */
> dstinfo->write_JFIF_header = FALSE;
> +#if JPEG_LIB_VERSION >= 70
> /* Adjust Exif image parameters */
> - if (dstinfo->image_width != srcinfo->image_width ||
> - dstinfo->image_height != srcinfo->image_height)
> + if (dstinfo->jpeg_width != srcinfo->image_width ||
> + dstinfo->jpeg_height != srcinfo->image_height)
> /* Align data segment to start of TIFF structure for parsing */
> adjust_exif_parameters(srcinfo->marker_list->data + 6,
> srcinfo->marker_list->data_length - 6,
> - dstinfo->image_width, dstinfo->image_height);
> + dstinfo->jpeg_width, dstinfo->jpeg_height);
> +#endif
> }
>
> /* Return the appropriate output data set */
> @@ -1368,7 +1463,7 @@ jtransform_execute_transform (j_decompress_ptr srcinfo,
> src_coef_arrays, dst_coef_arrays);
> break;
> case JXFORM_FLIP_H:
> - if (info->y_crop_offset != 0)
> + if (info->y_crop_offset != 0 || info->slow_hflip)
> do_flip_h(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
> src_coef_arrays, dst_coef_arrays);
> else
> @@ -1415,8 +1510,8 @@ jtransform_execute_transform (j_decompress_ptr srcinfo,
> * (after reading source header):
> * image_width = cinfo.image_width
> * image_height = cinfo.image_height
> - * MCU_width = cinfo.max_h_samp_factor * DCTSIZE
> - * MCU_height = cinfo.max_v_samp_factor * DCTSIZE
> + * MCU_width = cinfo.max_h_samp_factor * cinfo.block_size
> + * MCU_height = cinfo.max_v_samp_factor * cinfo.block_size
> * Result:
> * TRUE = perfect transformation possible
> * FALSE = perfect transformation not possible
> diff --git a/codecs/transupp.h b/codecs/transupp.h
> index 981b1ce..cfbaca4 100644
> --- a/codecs/transupp.h
> +++ b/codecs/transupp.h
> @@ -1,7 +1,7 @@
> /*
> * transupp.h
> *
> - * Copyright (C) 1997-2001, Thomas G. Lane.
> + * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.
> * This file is part of the Independent JPEG Group's software.
> * For conditions of distribution and use, see the accompanying README file.
> *
> @@ -57,10 +57,16 @@
> * corner up and/or left to make it so, simultaneously increasing the region
> * dimensions to keep the lower right crop corner unchanged. (Thus, the
> * output image covers at least the requested region, but may cover more.)
> + * The adjustment of the region dimensions may be optionally disabled.
> *
> - * If both crop and a rotate/flip transform are requested, the crop is
> applied
> - * last --- that is, the crop region is specified in terms of the destination
> - * image.
> + * We also provide a lossless-resize option, which is kind of a lossless-crop
> + * operation in the DCT coefficient block domain - it discards higher-order
> + * coefficients and losslessly preserves lower-order coefficients of a
> + * sub-block.
> + *
> + * Rotate/flip transform, resize, and crop can be requested together in a
> + * single invocation. The crop is applied last --- that is, the crop region
> + * is specified in terms of the destination image after transform/resize.
> *
> * We also offer a "force to grayscale" option, which simply discards the
> * chrominance channels of a YCbCr image. This is lossless in the sense that
> @@ -101,13 +107,15 @@ typedef enum {
>
> /*
> * Codes for crop parameters, which can individually be unspecified,
> - * positive, or negative. (Negative width or height makes no sense, though.)
> + * positive or negative for xoffset or yoffset,
> + * positive or forced for width or height.
> */
>
> typedef enum {
> - JCROP_UNSET,
> - JCROP_POS,
> - JCROP_NEG
> + JCROP_UNSET,
> + JCROP_POS,
> + JCROP_NEG,
> + JCROP_FORCE
> } JCROP_CODE;
>
> /*
> @@ -123,14 +131,21 @@ typedef struct {
> boolean trim; /* if TRUE, trim partial MCUs as needed
> */
> boolean force_grayscale; /* if TRUE, convert color image to grayscale */
> boolean crop; /* if TRUE, crop source image */
> + boolean slow_hflip; /* For best performance, the JXFORM_FLIP_H transform
> + normally modifies the source coefficients in place.
> + Setting this to TRUE will instead use a slower,
> + double-buffered algorithm, which leaves the source
> + coefficients in tact (necessary if other
> transformed
> + images must be generated from the same set of
> + coefficients. */
>
> /* Crop parameters: application need not set these unless crop is TRUE.
> * These can be filled in by jtransform_parse_crop_spec().
> */
> JDIMENSION crop_width; /* Width of selected region */
> - JCROP_CODE crop_width_set;
> + JCROP_CODE crop_width_set; /* (forced disables adjustment) */
> JDIMENSION crop_height; /* Height of selected region */
> - JCROP_CODE crop_height_set;
> + JCROP_CODE crop_height_set; /* (forced disables adjustment) */
> JDIMENSION crop_xoffset; /* X offset of selected region */
> JCROP_CODE crop_xoffset_set; /* (negative measures from right edge)
> */
> JDIMENSION crop_yoffset; /* Y offset of selected region */
> @@ -143,8 +158,8 @@ typedef struct {
> JDIMENSION output_height;
> JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
> JDIMENSION y_crop_offset;
> - int max_h_samp_factor; /* destination iMCU size */
> - int max_v_samp_factor;
> + int iMCU_sample_width; /* destination iMCU size */
> + int iMCU_sample_height;
> } jpeg_transform_info;
>
>
> @@ -154,7 +169,7 @@ typedef struct {
> EXTERN(boolean) jtransform_parse_crop_spec
> JPP((jpeg_transform_info *info, const char *spec));
> /* Request any required workspace */
> -EXTERN(void) jtransform_request_workspace
> +EXTERN(boolean) jtransform_request_workspace
> JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
> /* Adjust output image parameters */
> EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters
> --
> 2.1.4
>
--
ExactCODE GmbH, Lietzenburger Str. 42, DE-10789 Berlin
DE Legal: Amtsgericht Berlin (Charlottenburg) HRB 105123B, Tax-ID#: DE251602478
Managing Director: René Rebe
http://exactcode.com | http://exactscan.com | http://ocrkit.com |
http://t2-project.org | http://rene.rebe.de
-----------------------------------------------------------
If you wish to unsubscribe from this mailing, send mail to
[email protected] with a subject of: unsubscribe exact-image