| Fix freeimage compilation errors for newer version of libjpeg-turbo. |
| Patch from Christian Heimes's fork at ttps://bitbucket.org/tiran/freeimageturbo |
| |
| --- /dev/null 2013-09-04 18:06:09.961000800 +1000 |
| +++ LibJPEG/jpegcomp.h 2013-09-08 12:00:09.770737557 +1000 |
| @@ -0,0 +1,26 @@ |
| +/* |
| + * 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 _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 _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 |
| --- LibJPEG-orig/jpegint.h 2012-02-19 18:33:18.000000000 +1100 |
| +++ LibJPEG/jpegint.h 2013-09-08 12:00:09.770737557 +1000 |
| @@ -2,7 +2,7 @@ |
| * jpegint.h |
| * |
| * Copyright (C) 1991-1997, Thomas G. Lane. |
| - * Modified 1997-2011 by Guido Vollbeding. |
| + * 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. |
| * |
| @@ -100,16 +100,14 @@ |
| }; |
| |
| /* Forward DCT (also controls coefficient quantization) */ |
| -typedef JMETHOD(void, forward_DCT_ptr, |
| - (j_compress_ptr cinfo, jpeg_component_info * compptr, |
| - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, |
| - JDIMENSION start_row, JDIMENSION start_col, |
| - JDIMENSION num_blocks)); |
| - |
| struct jpeg_forward_dct { |
| JMETHOD(void, start_pass, (j_compress_ptr cinfo)); |
| - /* It is useful to allow each component to have a separate FDCT method. */ |
| - forward_DCT_ptr forward_DCT[MAX_COMPONENTS]; |
| + /* perhaps this should be an array??? */ |
| + JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, |
| + jpeg_component_info * compptr, |
| + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, |
| + JDIMENSION start_row, JDIMENSION start_col, |
| + JDIMENSION num_blocks)); |
| }; |
| |
| /* Entropy encoding */ |
| @@ -213,6 +211,10 @@ |
| JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); |
| JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, |
| JBLOCKROW *MCU_data)); |
| + |
| + /* This is here to share code between baseline and progressive decoders; */ |
| + /* other modules probably should not use it */ |
| + boolean insufficient_data; /* set TRUE after emitting warning */ |
| }; |
| |
| /* Inverse DCT (also performs dequantization) */ |
| @@ -302,6 +304,7 @@ |
| #define jinit_downsampler jIDownsampler |
| #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 |
| @@ -311,6 +314,7 @@ |
| #define jinit_input_controller jIInCtlr |
| #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 |
| @@ -321,41 +325,15 @@ |
| #define jinit_memory_mgr jIMemMgr |
| #define jdiv_round_up jDivRound |
| #define jround_up jRound |
| -#define jzero_far jZeroFar |
| #define jcopy_sample_rows jCopySamples |
| #define jcopy_block_row jCopyBlocks |
| +#define jzero_far jZeroFar |
| #define jpeg_zigzag_order jZIGTable |
| #define jpeg_natural_order jZAGTable |
| -#define jpeg_natural_order7 jZAG7Table |
| -#define jpeg_natural_order6 jZAG6Table |
| -#define jpeg_natural_order5 jZAG5Table |
| -#define jpeg_natural_order4 jZAG4Table |
| -#define jpeg_natural_order3 jZAG3Table |
| -#define jpeg_natural_order2 jZAG2Table |
| #define jpeg_aritab jAriTab |
| #endif /* NEED_SHORT_EXTERNAL_NAMES */ |
| |
| |
| -/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays |
| - * and coefficient-block arrays. This won't work on 80x86 because the arrays |
| - * are FAR and we're assuming a small-pointer memory model. However, some |
| - * DOS compilers provide far-pointer versions of memcpy() and memset() even |
| - * in the small-model libraries. These will be used if USE_FMEM is defined. |
| - * Otherwise, the routines in jutils.c do it the hard way. |
| - */ |
| - |
| -#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */ |
| -#define FMEMZERO(target,size) MEMZERO(target,size) |
| -#else /* 80x86 case */ |
| -#ifdef USE_FMEM |
| -#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) |
| -#else |
| -EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); |
| -#define FMEMZERO(target,size) jzero_far(target, size) |
| -#endif |
| -#endif |
| - |
| - |
| /* Compression module initialization routines */ |
| EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); |
| EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, |
| @@ -370,6 +348,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 */ |
| @@ -383,6 +362,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)); |
| @@ -401,17 +381,12 @@ |
| int num_rows, JDIMENSION num_cols)); |
| EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, |
| JDIMENSION num_blocks)); |
| +EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); |
| /* Constant tables in jutils.c */ |
| #if 0 /* This table is not actually needed in v6a */ |
| 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 */ |
| -extern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */ |
| -extern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */ |
| -extern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */ |
| -extern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */ |
| -extern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */ |
| -extern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */ |
| |
| /* Arithmetic coding probability estimation tables in jaricom.c */ |
| extern const INT32 jpeg_aritab[]; |
| --- LibJPEG-orig/transupp.h 2012-02-19 18:33:18.000000000 +1100 |
| +++ LibJPEG/transupp.h 2013-09-08 12:00:09.820737560 +1000 |
| @@ -1,7 +1,7 @@ |
| /* |
| * transupp.h |
| * |
| - * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding. |
| + * Copyright (C) 1997-2009, 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,7 +57,6 @@ |
| * 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. |
| * |
| * 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 |
| @@ -107,15 +106,13 @@ |
| |
| /* |
| * Codes for crop parameters, which can individually be unspecified, |
| - * positive or negative for xoffset or yoffset, |
| - * positive or forced for width or height. |
| + * positive, or negative. (Negative width or height makes no sense, though.) |
| */ |
| |
| typedef enum { |
| - JCROP_UNSET, |
| - JCROP_POS, |
| - JCROP_NEG, |
| - JCROP_FORCE |
| + JCROP_UNSET, |
| + JCROP_POS, |
| + JCROP_NEG |
| } JCROP_CODE; |
| |
| /* |
| @@ -131,14 +128,21 @@ |
| 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; /* (forced disables adjustment) */ |
| + JCROP_CODE crop_width_set; |
| JDIMENSION crop_height; /* Height of selected region */ |
| - JCROP_CODE crop_height_set; /* (forced disables adjustment) */ |
| + JCROP_CODE crop_height_set; |
| 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 */ |
| --- LibJPEG-orig/transupp.c 2012-02-19 18:33:18.000000000 +1100 |
| +++ LibJPEG/transupp.c 2013-09-08 12:00:09.819737560 +1000 |
| @@ -1,7 +1,8 @@ |
| /* |
| * transupp.c |
| * |
| - * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding. |
| + * Copyright (C) 1997-2009, Thomas G. Lane, 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. |
| * |
| @@ -20,9 +21,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 |
| |
| /* |
| @@ -134,7 +145,7 @@ |
| * Partial iMCUs at the right edge are left untouched. |
| */ |
| MCU_cols = srcinfo->output_width / |
| - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); |
| + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size); |
| |
| for (ci = 0; ci < dstinfo->num_components; ci++) { |
| compptr = dstinfo->comp_info + ci; |
| @@ -200,7 +211,7 @@ |
| * this is essentially the same as the routine above. |
| */ |
| MCU_cols = srcinfo->output_width / |
| - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); |
| + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size); |
| |
| for (ci = 0; ci < dstinfo->num_components; ci++) { |
| compptr = dstinfo->comp_info + ci; |
| @@ -265,7 +276,7 @@ |
| * Partial iMCUs at the bottom edge are copied verbatim. |
| */ |
| MCU_rows = srcinfo->output_height / |
| - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); |
| + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size); |
| |
| for (ci = 0; ci < dstinfo->num_components; ci++) { |
| compptr = dstinfo->comp_info + ci; |
| @@ -393,7 +404,7 @@ |
| * not mirrored. |
| */ |
| MCU_cols = srcinfo->output_height / |
| - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); |
| + (dstinfo->max_h_samp_factor * dstinfo_min_DCT_h_scaled_size); |
| |
| for (ci = 0; ci < dstinfo->num_components; ci++) { |
| compptr = dstinfo->comp_info + ci; |
| @@ -474,7 +485,7 @@ |
| * not mirrored. |
| */ |
| MCU_rows = srcinfo->output_width / |
| - (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size); |
| + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size); |
| |
| for (ci = 0; ci < dstinfo->num_components; ci++) { |
| compptr = dstinfo->comp_info + ci; |
| @@ -542,9 +553,9 @@ |
| jpeg_component_info *compptr; |
| |
| MCU_cols = srcinfo->output_width / |
| - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); |
| + (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); |
| + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size); |
| |
| for (ci = 0; ci < dstinfo->num_components; ci++) { |
| compptr = dstinfo->comp_info + ci; |
| @@ -653,9 +664,9 @@ |
| jpeg_component_info *compptr; |
| |
| MCU_cols = srcinfo->output_height / |
| - (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size); |
| + (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); |
| + (dstinfo->max_v_samp_factor * dstinfo_min_DCT_v_scaled_size); |
| |
| for (ci = 0; ci < dstinfo->num_components; ci++) { |
| compptr = dstinfo->comp_info + ci; |
| @@ -771,7 +782,7 @@ |
| * The routine returns TRUE if the spec string is valid, FALSE if not. |
| * |
| * The crop spec string should have the format |
| - * <width>[f]x<height>[f]{+-}<xoffset>{+-}<yoffset> |
| + * <width>x<height>{+-}<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 |
| @@ -793,22 +804,14 @@ |
| /* fetch width */ |
| if (! jt_read_integer(&spec, &info->crop_width)) |
| return FALSE; |
| - if (*spec == 'f' || *spec == 'F') { |
| - spec++; |
| - info->crop_width_set = JCROP_FORCE; |
| - } else |
| - info->crop_width_set = JCROP_POS; |
| + 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; |
| - if (*spec == 'f' || *spec == 'F') { |
| - spec++; |
| - info->crop_height_set = JCROP_FORCE; |
| - } else |
| - info->crop_height_set = JCROP_POS; |
| + info->crop_height_set = JCROP_POS; |
| } |
| if (*spec == '+' || *spec == '-') { |
| /* fetch xoffset */ |
| @@ -897,7 +900,12 @@ |
| 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. |
| */ |
| @@ -905,15 +913,15 @@ |
| 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, |
| + 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, |
| + 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; |
| } |
| @@ -932,26 +940,26 @@ |
| info->output_width = srcinfo->output_height; |
| info->output_height = srcinfo->output_width; |
| if (info->num_components == 1) { |
| - info->iMCU_sample_width = srcinfo->min_DCT_v_scaled_size; |
| - info->iMCU_sample_height = srcinfo->min_DCT_h_scaled_size; |
| + info->iMCU_sample_width = srcinfo->_min_DCT_v_scaled_size; |
| + info->iMCU_sample_height = srcinfo->_min_DCT_h_scaled_size; |
| } else { |
| info->iMCU_sample_width = |
| - srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size; |
| + 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; |
| + srcinfo->max_h_samp_factor * srcinfo->_min_DCT_h_scaled_size; |
| } |
| break; |
| default: |
| info->output_width = srcinfo->output_width; |
| info->output_height = srcinfo->output_height; |
| if (info->num_components == 1) { |
| - info->iMCU_sample_width = srcinfo->min_DCT_h_scaled_size; |
| - info->iMCU_sample_height = srcinfo->min_DCT_v_scaled_size; |
| + info->iMCU_sample_width = srcinfo->_min_DCT_h_scaled_size; |
| + info->iMCU_sample_height = srcinfo->_min_DCT_v_scaled_size; |
| } else { |
| info->iMCU_sample_width = |
| - srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size; |
| + 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; |
| + srcinfo->max_v_samp_factor * srcinfo->_min_DCT_v_scaled_size; |
| } |
| break; |
| } |
| @@ -988,16 +996,10 @@ |
| else |
| yoffset = info->crop_yoffset; |
| /* Now adjust so that upper left corner falls at an iMCU boundary */ |
| - 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); |
| + info->output_width = |
| + info->crop_width + (xoffset % info->iMCU_sample_width); |
| + info->output_height = |
| + info->crop_height + (yoffset % info->iMCU_sample_height); |
| /* Save x/y offsets measured in iMCUs */ |
| info->x_crop_offset = xoffset / info->iMCU_sample_width; |
| info->y_crop_offset = yoffset / info->iMCU_sample_height; |
| @@ -1020,7 +1022,7 @@ |
| case JXFORM_FLIP_H: |
| if (info->trim) |
| trim_right_edge(info, srcinfo->output_width); |
| - if (info->y_crop_offset != 0) |
| + if (info->y_crop_offset != 0 || info->slow_hflip) |
| need_workspace = TRUE; |
| /* do_flip_h_no_crop doesn't need a workspace array */ |
| break; |
| @@ -1124,9 +1126,11 @@ |
| 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++) { |
| @@ -1362,8 +1366,10 @@ |
| /* Correct the destination's image dimensions as necessary |
| * for rotate/flip, resize, and crop operations. |
| */ |
| +#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) { |
| @@ -1371,9 +1377,17 @@ |
| 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; |
| } |
| |
| @@ -1389,6 +1403,7 @@ |
| 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->jpeg_width != srcinfo->image_width || |
| dstinfo->jpeg_height != srcinfo->image_height) |
| @@ -1396,6 +1411,7 @@ |
| adjust_exif_parameters(srcinfo->marker_list->data + 6, |
| srcinfo->marker_list->data_length - 6, |
| dstinfo->jpeg_width, dstinfo->jpeg_height); |
| +#endif |
| } |
| |
| /* Return the appropriate output data set */ |
| @@ -1432,7 +1448,7 @@ |
| 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 |