blob: 5591f4f92786a22c533232c6f07f026495eca686 [file] [log] [blame]
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