forked from calculate/calculate-overlay
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
532 lines
20 KiB
532 lines
20 KiB
--- /dev/null
|
|
+++ b/LibJPEG/jpegcomp.h
|
|
@@ -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
|
|
--- a/LibJPEG/jpegint.h
|
|
+++ b/LibJPEG/jpegint.h
|
|
@@ -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[];
|
|
--- a/LibJPEG/transupp.h
|
|
+++ b/LibJPEG/transupp.h
|
|
@@ -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 */
|
|
--- a/LibJPEG/transupp.c
|
|
+++ b/LibJPEG/transupp.c
|
|
@@ -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
|