mirror of
https://git.FreeBSD.org/ports.git
synced 2024-12-22 04:17:44 +00:00
- merged cropping patch and drop patch
Submitted by: Mike Johnson
This commit is contained in:
parent
1820b57436
commit
dbbda266a1
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=110866
@ -9,7 +9,7 @@
|
||||
|
||||
PORTNAME= jpeg
|
||||
PORTVERSION= 6b
|
||||
PORTREVISION= 2
|
||||
PORTREVISION= 3
|
||||
CATEGORIES= graphics
|
||||
MASTER_SITES= http://www.ijg.org/files/ \
|
||||
ftp://ftp.uu.net/graphics/jpeg/ \
|
||||
|
30
graphics/jpeg-mmx/files/patch-jerror.h
Normal file
30
graphics/jpeg-mmx/files/patch-jerror.h
Normal file
@ -0,0 +1,30 @@
|
||||
--- jerror.h.orig Sat Oct 18 14:59:10 1997
|
||||
+++ jerror.h Fri Jun 4 15:20:23 2004
|
||||
@@ -45,8 +45,11 @@
|
||||
JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
|
||||
JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
|
||||
JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
|
||||
+JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request")
|
||||
JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
|
||||
JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
|
||||
+JMESSAGE(JERR_BAD_DROP_SAMPLING,
|
||||
+ "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c")
|
||||
JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
|
||||
JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
|
||||
JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
|
||||
@@ -226,6 +229,15 @@
|
||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
||||
(cinfo)->err->msg_parm.i[2] = (p3), \
|
||||
(cinfo)->err->msg_parm.i[3] = (p4), \
|
||||
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
||||
+#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \
|
||||
+ ((cinfo)->err->msg_code = (code), \
|
||||
+ (cinfo)->err->msg_parm.i[0] = (p1), \
|
||||
+ (cinfo)->err->msg_parm.i[1] = (p2), \
|
||||
+ (cinfo)->err->msg_parm.i[2] = (p3), \
|
||||
+ (cinfo)->err->msg_parm.i[3] = (p4), \
|
||||
+ (cinfo)->err->msg_parm.i[4] = (p5), \
|
||||
+ (cinfo)->err->msg_parm.i[5] = (p6), \
|
||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
||||
#define ERREXITS(cinfo,code,str) \
|
||||
((cinfo)->err->msg_code = (code), \
|
@ -1,6 +1,23 @@
|
||||
--- jpegtran.c.exif 1997-07-24 04:37:26.000000000 +0200
|
||||
+++ jpegtran.c 2003-09-29 22:31:22.000000000 +0200
|
||||
@@ -56,6 +56,7 @@
|
||||
--- jpegtran.c.orig Wed Jul 23 22:37:26 1997
|
||||
+++ jpegtran.c Fri Jun 4 14:47:24 2004
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* jpegtran.c
|
||||
*
|
||||
- * Copyright (C) 1995-1997, Thomas G. Lane.
|
||||
+ * Copyright (C) 1995-2001, Thomas G. Lane.
|
||||
* This file is part of the Independent JPEG Group's software.
|
||||
* For conditions of distribution and use, see the accompanying README file.
|
||||
*
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
static const char * progname; /* program name for error messages */
|
||||
static char * outfilename; /* for -outfile switch */
|
||||
+static char * dropfilename; /* for -drop switch */
|
||||
static JCOPY_OPTION copyoption; /* -copy switch */
|
||||
static jpeg_transform_info transformoption; /* image transformation options */
|
||||
|
||||
@@ -56,6 +57,7 @@
|
||||
fprintf(stderr, " -copy none Copy no extra markers from source file\n");
|
||||
fprintf(stderr, " -copy comments Copy only comment markers (default)\n");
|
||||
fprintf(stderr, " -copy all Copy all extra markers\n");
|
||||
@ -8,7 +25,25 @@
|
||||
#ifdef ENTROPY_OPT_SUPPORTED
|
||||
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n");
|
||||
#endif
|
||||
@@ -109,6 +110,50 @@
|
||||
@@ -64,12 +66,16 @@
|
||||
#endif
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
fprintf(stderr, "Switches for modifying the image:\n");
|
||||
+ fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n");
|
||||
+ fprintf(stderr, " -drop +X+Y filename Drop another image\n");
|
||||
fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
|
||||
fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n");
|
||||
+ fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n");
|
||||
fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n");
|
||||
fprintf(stderr, " -transpose Transpose image\n");
|
||||
fprintf(stderr, " -transverse Transverse transpose image\n");
|
||||
- fprintf(stderr, " -trim Drop non-transformable edge blocks\n");
|
||||
+ fprintf(stderr, " -trim Drop non-transformable edge blocks or\n");
|
||||
+ fprintf(stderr, " with -drop: Requantize drop file to source file\n");
|
||||
#endif /* TRANSFORMS_SUPPORTED */
|
||||
fprintf(stderr, "Switches for advanced users:\n");
|
||||
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
|
||||
@@ -109,6 +115,50 @@
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -59,7 +94,30 @@
|
||||
|
||||
LOCAL(int)
|
||||
parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||
@@ -170,6 +215,8 @@
|
||||
@@ -130,10 +180,13 @@
|
||||
/* Set up default JPEG parameters. */
|
||||
simple_progressive = FALSE;
|
||||
outfilename = NULL;
|
||||
+ dropfilename = NULL;
|
||||
copyoption = JCOPYOPT_DEFAULT;
|
||||
transformoption.transform = JXFORM_NONE;
|
||||
transformoption.trim = FALSE;
|
||||
+ transformoption.perfect = FALSE;
|
||||
transformoption.force_grayscale = FALSE;
|
||||
+ transformoption.crop = FALSE;
|
||||
cinfo->err->trace_level = 0;
|
||||
|
||||
/* Scan command line options, adjust parameters */
|
||||
@@ -160,7 +213,7 @@
|
||||
exit(EXIT_FAILURE);
|
||||
#endif
|
||||
|
||||
- } else if (keymatch(arg, "copy", 1)) {
|
||||
+ } else if (keymatch(arg, "copy", 2)) {
|
||||
/* Select which extra markers to copy. */
|
||||
if (++argn >= argc) /* advance to next argument */
|
||||
usage();
|
||||
@@ -170,9 +223,47 @@
|
||||
copyoption = JCOPYOPT_COMMENTS;
|
||||
} else if (keymatch(argv[argn], "all", 1)) {
|
||||
copyoption = JCOPYOPT_ALL;
|
||||
@ -68,7 +126,46 @@
|
||||
} else
|
||||
usage();
|
||||
|
||||
@@ -181,6 +228,7 @@
|
||||
+ } else if (keymatch(arg, "crop", 2)) {
|
||||
+ /* Perform lossless cropping. */
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (++argn >= argc) /* advance to next argument */
|
||||
+ usage();
|
||||
+ if (transformoption.crop /* reject multiple crop/drop requests */ ||
|
||||
+ ! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
|
||||
+ fprintf(stderr, "%s: bogus -crop argument '%s'\n",
|
||||
+ progname, argv[argn]);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+#else
|
||||
+ select_transform(JXFORM_NONE); /* force an error */
|
||||
+#endif
|
||||
+
|
||||
+ } else if (keymatch(arg, "drop", 2)) {
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (++argn >= argc) /* advance to next argument */
|
||||
+ usage();
|
||||
+ if (transformoption.crop /* reject multiple crop/drop requests */ ||
|
||||
+ ! jtransform_parse_crop_spec(&transformoption, argv[argn]) ||
|
||||
+ transformoption.crop_width_set != JCROP_UNSET ||
|
||||
+ transformoption.crop_height_set != JCROP_UNSET) {
|
||||
+ fprintf(stderr, "%s: bogus -drop argument '%s'\n",
|
||||
+ progname, argv[argn]);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ if (++argn >= argc) /* advance to next argument */
|
||||
+ usage();
|
||||
+ dropfilename = argv[argn];
|
||||
+ select_transform(JXFORM_DROP);
|
||||
+#else
|
||||
+ select_transform(JXFORM_NONE); /* force an error */
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
||||
/* Enable debug printouts. */
|
||||
/* On first -d, print version identification */
|
||||
@@ -181,6 +272,7 @@
|
||||
if (! printed_version) {
|
||||
fprintf(stderr, "Independent JPEG Group's JPEGTRAN, version %s\n%s\n",
|
||||
JVERSION, JCOPYRIGHT);
|
||||
@ -76,7 +173,136 @@
|
||||
printed_version = TRUE;
|
||||
}
|
||||
cinfo->err->trace_level++;
|
||||
@@ -452,6 +500,7 @@
|
||||
@@ -233,7 +325,12 @@
|
||||
usage();
|
||||
outfilename = argv[argn]; /* save it away for later use */
|
||||
|
||||
- } else if (keymatch(arg, "progressive", 1)) {
|
||||
+ } else if (keymatch(arg, "perfect", 2)) {
|
||||
+ /* Fail if there is any partial edge MCUs that the transform can't
|
||||
+ * handle. */
|
||||
+ transformoption.perfect = TRUE;
|
||||
+
|
||||
+ } else if (keymatch(arg, "progressive", 2)) {
|
||||
/* Select simple progressive mode. */
|
||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
||||
simple_progressive = TRUE;
|
||||
@@ -334,16 +431,24 @@
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
struct jpeg_decompress_struct srcinfo;
|
||||
+ struct jpeg_error_mgr jsrcerr;
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ struct jpeg_decompress_struct dropinfo;
|
||||
+ struct jpeg_error_mgr jdroperr;
|
||||
+ FILE * drop_file;
|
||||
+#endif
|
||||
struct jpeg_compress_struct dstinfo;
|
||||
- struct jpeg_error_mgr jsrcerr, jdsterr;
|
||||
+ struct jpeg_error_mgr jdsterr;
|
||||
#ifdef PROGRESS_REPORT
|
||||
struct cdjpeg_progress_mgr progress;
|
||||
#endif
|
||||
jvirt_barray_ptr * src_coef_arrays;
|
||||
jvirt_barray_ptr * dst_coef_arrays;
|
||||
int file_index;
|
||||
- FILE * input_file;
|
||||
- FILE * output_file;
|
||||
+ /* We assume all-in-memory processing and can therefore use only a
|
||||
+ * single file pointer for sequential input and output operation.
|
||||
+ */
|
||||
+ FILE * fp;
|
||||
|
||||
/* On Mac, fetch a command line. */
|
||||
#ifdef USE_CCOMMAND
|
||||
@@ -406,32 +511,36 @@
|
||||
|
||||
/* Open the input file. */
|
||||
if (file_index < argc) {
|
||||
- if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) {
|
||||
- fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]);
|
||||
+ if ((fp = fopen(argv[file_index], READ_BINARY)) == NULL) {
|
||||
+ fprintf(stderr, "%s: can't open %s for reading\n", progname, argv[file_index]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
} else {
|
||||
/* default input file is stdin */
|
||||
- input_file = read_stdin();
|
||||
+ fp = read_stdin();
|
||||
}
|
||||
-
|
||||
- /* Open the output file. */
|
||||
- if (outfilename != NULL) {
|
||||
- if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) {
|
||||
- fprintf(stderr, "%s: can't open %s\n", progname, outfilename);
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ /* Open the drop file. */
|
||||
+ if (dropfilename != NULL) {
|
||||
+ if ((drop_file = fopen(dropfilename, READ_BINARY)) == NULL) {
|
||||
+ fprintf(stderr, "%s: can't open %s for reading\n", progname, dropfilename);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
+ dropinfo.err = jpeg_std_error(&jdroperr);
|
||||
+ jpeg_create_decompress(&dropinfo);
|
||||
+ jpeg_stdio_src(&dropinfo, drop_file);
|
||||
} else {
|
||||
- /* default output file is stdout */
|
||||
- output_file = write_stdout();
|
||||
+ drop_file = NULL;
|
||||
}
|
||||
+#endif
|
||||
+
|
||||
|
||||
#ifdef PROGRESS_REPORT
|
||||
start_progress_monitor((j_common_ptr) &dstinfo, &progress);
|
||||
#endif
|
||||
|
||||
/* Specify data source for decompression */
|
||||
- jpeg_stdio_src(&srcinfo, input_file);
|
||||
+ jpeg_stdio_src(&srcinfo, fp);
|
||||
|
||||
/* Enable saving of extra markers that we want to copy */
|
||||
jcopy_markers_setup(&srcinfo, copyoption);
|
||||
@@ -439,19 +548,46 @@
|
||||
/* Read file header */
|
||||
(void) jpeg_read_header(&srcinfo, TRUE);
|
||||
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL) {
|
||||
+ (void) jpeg_read_header(&dropinfo, TRUE);
|
||||
+ transformoption.crop_width = dropinfo.image_width;
|
||||
+ transformoption.crop_width_set = JCROP_POS;
|
||||
+ transformoption.crop_height = dropinfo.image_height;
|
||||
+ transformoption.crop_height_set = JCROP_POS;
|
||||
+ transformoption.drop_ptr = &dropinfo;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* Any space needed by a transform option must be requested before
|
||||
* jpeg_read_coefficients so that memory allocation will be done right.
|
||||
*/
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
+ /* Fails right away if -perfect is given and transformation is not perfect.
|
||||
+ */
|
||||
+ if (transformoption.perfect &&
|
||||
+ !jtransform_perfect_transform(srcinfo.image_width, srcinfo.image_height,
|
||||
+ srcinfo.max_h_samp_factor * DCTSIZE, srcinfo.max_v_samp_factor * DCTSIZE,
|
||||
+ transformoption.transform)) {
|
||||
+ fprintf(stderr, "%s: transformation is not perfect\n", progname);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
jtransform_request_workspace(&srcinfo, &transformoption);
|
||||
#endif
|
||||
|
||||
/* Read source file as DCT coefficients */
|
||||
src_coef_arrays = jpeg_read_coefficients(&srcinfo);
|
||||
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL) {
|
||||
+ transformoption.drop_coef_arrays = jpeg_read_coefficients(&dropinfo);
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* Initialize destination compression parameters from source values */
|
||||
jpeg_copy_critical_parameters(&srcinfo, &dstinfo);
|
||||
|
||||
@ -84,9 +310,31 @@
|
||||
/* Adjust destination parameters if required by transform options;
|
||||
* also find out which set of coefficient arrays will hold the output.
|
||||
*/
|
||||
@@ -464,8 +513,12 @@
|
||||
@@ -463,11 +599,36 @@
|
||||
dst_coef_arrays = src_coef_arrays;
|
||||
#endif
|
||||
|
||||
+ /* Close input file, if we opened it.
|
||||
+ * Note: we assume that jpeg_read_coefficients consumed all input
|
||||
+ * until JPEG_REACHED_EOI, and that jpeg_finish_decompress will
|
||||
+ * only consume more while (! cinfo->inputctl->eoi_reached).
|
||||
+ * We cannot call jpeg_finish_decompress here since we still need the
|
||||
+ * virtual arrays allocated from the source object for processing.
|
||||
+ */
|
||||
+ if (fp != stdin)
|
||||
+ fclose(fp);
|
||||
+
|
||||
+ /* Open the output file. */
|
||||
+ if (outfilename != NULL) {
|
||||
+ if ((fp = fopen(outfilename, WRITE_BINARY)) == NULL) {
|
||||
+ fprintf(stderr, "%s: can't open %s for writing\n", progname, outfilename);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ } else {
|
||||
+ /* default output file is stdout */
|
||||
+ fp = write_stdout();
|
||||
+ }
|
||||
+
|
||||
/* Adjust default compression parameters by re-parsing the options */
|
||||
+ /* Save value of copyoption */
|
||||
file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE);
|
||||
@ -95,5 +343,58 @@
|
||||
+ handle_exif(&srcinfo,&dstinfo,©option);
|
||||
+
|
||||
/* Specify data destination for compression */
|
||||
jpeg_stdio_dest(&dstinfo, output_file);
|
||||
- jpeg_stdio_dest(&dstinfo, output_file);
|
||||
+ jpeg_stdio_dest(&dstinfo, fp);
|
||||
|
||||
/* Start compressor (note no image data is actually written here) */
|
||||
jpeg_write_coefficients(&dstinfo, dst_coef_arrays);
|
||||
@@ -477,28 +638,41 @@
|
||||
|
||||
/* Execute image transformation, if any */
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
- jtransform_execute_transformation(&srcinfo, &dstinfo,
|
||||
- src_coef_arrays,
|
||||
- &transformoption);
|
||||
+ jtransform_execute_transform(&srcinfo, &dstinfo,
|
||||
+ src_coef_arrays,
|
||||
+ &transformoption);
|
||||
#endif
|
||||
|
||||
/* Finish compression and release memory */
|
||||
jpeg_finish_compress(&dstinfo);
|
||||
jpeg_destroy_compress(&dstinfo);
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL) {
|
||||
+ (void) jpeg_finish_decompress(&dropinfo);
|
||||
+ jpeg_destroy_decompress(&dropinfo);
|
||||
+ }
|
||||
+#endif
|
||||
(void) jpeg_finish_decompress(&srcinfo);
|
||||
jpeg_destroy_decompress(&srcinfo);
|
||||
|
||||
- /* Close files, if we opened them */
|
||||
- if (input_file != stdin)
|
||||
- fclose(input_file);
|
||||
- if (output_file != stdout)
|
||||
- fclose(output_file);
|
||||
+ /* Close output file, if we opened it */
|
||||
+ if (fp != stdout)
|
||||
+ fclose(fp);
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (drop_file != NULL)
|
||||
+ fclose(drop_file);
|
||||
+#endif
|
||||
|
||||
#ifdef PROGRESS_REPORT
|
||||
end_progress_monitor((j_common_ptr) &dstinfo);
|
||||
#endif
|
||||
|
||||
/* All done. */
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL)
|
||||
+ exit(jsrcerr.num_warnings + jdroperr.num_warnings + jdsterr.num_warnings ?
|
||||
+ EXIT_WARNING : EXIT_SUCCESS);
|
||||
+#endif
|
||||
exit(jsrcerr.num_warnings + jdsterr.num_warnings ?EXIT_WARNING:EXIT_SUCCESS);
|
||||
return 0; /* suppress no-return-value warnings */
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,191 @@
|
||||
--- transupp.h.exif 1997-07-24 04:39:12.000000000 +0200
|
||||
+++ transupp.h 2003-09-25 01:05:12.000000000 +0200
|
||||
@@ -121,7 +121,8 @@
|
||||
--- transupp.h.orig Wed Jul 23 22:39:12 1997
|
||||
+++ transupp.h Fri Jun 4 15:07:31 2004
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* transupp.h
|
||||
*
|
||||
- * Copyright (C) 1997, Thomas G. Lane.
|
||||
+ * Copyright (C) 1997-2001, Thomas G. Lane.
|
||||
* This file is part of the Independent JPEG Group's software.
|
||||
* For conditions of distribution and use, see the accompanying README file.
|
||||
*
|
||||
@@ -22,32 +22,6 @@
|
||||
#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */
|
||||
#endif
|
||||
|
||||
-/* Short forms of external names for systems with brain-damaged linkers. */
|
||||
-
|
||||
-#ifdef NEED_SHORT_EXTERNAL_NAMES
|
||||
-#define jtransform_request_workspace jTrRequest
|
||||
-#define jtransform_adjust_parameters jTrAdjust
|
||||
-#define jtransform_execute_transformation jTrExec
|
||||
-#define jcopy_markers_setup jCMrkSetup
|
||||
-#define jcopy_markers_execute jCMrkExec
|
||||
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
||||
-
|
||||
-
|
||||
-/*
|
||||
- * Codes for supported types of image transformations.
|
||||
- */
|
||||
-
|
||||
-typedef enum {
|
||||
- JXFORM_NONE, /* no transformation */
|
||||
- JXFORM_FLIP_H, /* horizontal flip */
|
||||
- JXFORM_FLIP_V, /* vertical flip */
|
||||
- JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */
|
||||
- JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
|
||||
- JXFORM_ROT_90, /* 90-degree clockwise rotation */
|
||||
- JXFORM_ROT_180, /* 180-degree rotation */
|
||||
- JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */
|
||||
-} JXFORM_CODE;
|
||||
-
|
||||
/*
|
||||
* Although rotating and flipping data expressed as DCT coefficients is not
|
||||
* hard, there is an asymmetry in the JPEG format specification for images
|
||||
@@ -75,6 +49,19 @@
|
||||
* (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
|
||||
* followed by -rot 180 -trim trims both edges.)
|
||||
*
|
||||
+ * We also offer a lossless-crop option, which discards data outside a given
|
||||
+ * image region but losslessly preserves what is inside. Like the rotate and
|
||||
+ * flip transforms, lossless crop is restricted by the JPEG format: the upper
|
||||
+ * left corner of the selected region must fall on an iMCU boundary. If this
|
||||
+ * does not hold for the given crop parameters, we silently move the upper left
|
||||
+ * 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.)
|
||||
+ *
|
||||
+ * 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 offer a "force to grayscale" option, which simply discards the
|
||||
* chrominance channels of a YCbCr image. This is lossless in the sense that
|
||||
* the luminance channel is preserved exactly. It's not the same kind of
|
||||
@@ -83,20 +70,96 @@
|
||||
* be aware of the option to know how many components to work on.
|
||||
*/
|
||||
|
||||
+
|
||||
+/* Short forms of external names for systems with brain-damaged linkers. */
|
||||
+
|
||||
+#ifdef NEED_SHORT_EXTERNAL_NAMES
|
||||
+#define jtransform_parse_crop_spec jTrParCrop
|
||||
+#define jtransform_request_workspace jTrRequest
|
||||
+#define jtransform_adjust_parameters jTrAdjust
|
||||
+#define jtransform_execute_transform jTrExec
|
||||
+#define jtransform_perfect_transform jTrPerfect
|
||||
+#define jcopy_markers_setup jCMrkSetup
|
||||
+#define jcopy_markers_execute jCMrkExec
|
||||
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * Codes for supported types of image transformations.
|
||||
+ */
|
||||
+
|
||||
+typedef enum {
|
||||
+ JXFORM_NONE, /* no transformation */
|
||||
+ JXFORM_FLIP_H, /* horizontal flip */
|
||||
+ JXFORM_FLIP_V, /* vertical flip */
|
||||
+ JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */
|
||||
+ JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
|
||||
+ JXFORM_ROT_90, /* 90-degree clockwise rotation */
|
||||
+ JXFORM_ROT_180, /* 180-degree rotation */
|
||||
+ JXFORM_ROT_270, /* 270-degree clockwise (or 90 ccw) */
|
||||
+ JXFORM_DROP /* drop */
|
||||
+} JXFORM_CODE;
|
||||
+
|
||||
+/*
|
||||
+ * Codes for crop parameters, which can individually be unspecified,
|
||||
+ * positive, or negative. (Negative width or height makes no sense, though.)
|
||||
+ */
|
||||
+
|
||||
+typedef enum {
|
||||
+ JCROP_UNSET,
|
||||
+ JCROP_POS,
|
||||
+ JCROP_NEG
|
||||
+} JCROP_CODE;
|
||||
+
|
||||
+/*
|
||||
+ * Transform parameters struct.
|
||||
+ * NB: application must not change any elements of this struct after
|
||||
+ * calling jtransform_request_workspace.
|
||||
+ */
|
||||
+
|
||||
typedef struct {
|
||||
/* Options: set by caller */
|
||||
JXFORM_CODE transform; /* image transform operator */
|
||||
+ boolean perfect; /* if TRUE, fail if partial MCUs are requested */
|
||||
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 */
|
||||
+
|
||||
+ /* 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;
|
||||
+ JDIMENSION crop_height; /* Height of selected region */
|
||||
+ 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 */
|
||||
+ JCROP_CODE crop_yoffset_set; /* (negative measures from bottom edge) */
|
||||
+
|
||||
+ /* Drop parameters: set by caller for drop request */
|
||||
+ j_decompress_ptr drop_ptr;
|
||||
+ jvirt_barray_ptr * drop_coef_arrays;
|
||||
|
||||
/* Internal workspace: caller should not touch these */
|
||||
int num_components; /* # of components in workspace */
|
||||
jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
|
||||
+ JDIMENSION output_width; /* cropped destination dimensions */
|
||||
+ JDIMENSION output_height;
|
||||
+ JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
|
||||
+ JDIMENSION y_crop_offset;
|
||||
+ JDIMENSION drop_width; /* drop dimensions measured in iMCUs */
|
||||
+ JDIMENSION drop_height;
|
||||
+ int max_h_samp_factor; /* destination iMCU size */
|
||||
+ int max_v_samp_factor;
|
||||
} jpeg_transform_info;
|
||||
|
||||
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
|
||||
+/* Parse a crop specification (written in X11 geometry style) */
|
||||
+EXTERN(boolean) jtransform_parse_crop_spec
|
||||
+ JPP((jpeg_transform_info *info, const char *spec));
|
||||
/* Request any required workspace */
|
||||
EXTERN(void) jtransform_request_workspace
|
||||
JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
|
||||
@@ -106,10 +169,24 @@
|
||||
jvirt_barray_ptr *src_coef_arrays,
|
||||
jpeg_transform_info *info));
|
||||
/* Execute the actual transformation, if any */
|
||||
-EXTERN(void) jtransform_execute_transformation
|
||||
+EXTERN(void) jtransform_execute_transform
|
||||
JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
|
||||
jvirt_barray_ptr *src_coef_arrays,
|
||||
jpeg_transform_info *info));
|
||||
+/* Determine whether lossless transformation is perfectly
|
||||
+ * possible for a specified image and transformation.
|
||||
+ */
|
||||
+EXTERN(boolean) jtransform_perfect_transform
|
||||
+ JPP((JDIMENSION image_width, JDIMENSION image_height,
|
||||
+ int MCU_width, int MCU_height,
|
||||
+ JXFORM_CODE transform));
|
||||
+
|
||||
+/* jtransform_execute_transform used to be called
|
||||
+ * jtransform_execute_transformation, but some compilers complain about
|
||||
+ * routine names that long. This macro is here to avoid breaking any
|
||||
+ * old source code that uses the original name...
|
||||
+ */
|
||||
+#define jtransform_execute_transformation jtransform_execute_transform
|
||||
|
||||
#endif /* TRANSFORMS_SUPPORTED */
|
||||
|
||||
@@ -121,7 +198,8 @@
|
||||
typedef enum {
|
||||
JCOPYOPT_NONE, /* copy no optional markers */
|
||||
JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
PORTNAME= jpeg
|
||||
PORTVERSION= 6b
|
||||
PORTREVISION= 2
|
||||
PORTREVISION= 3
|
||||
CATEGORIES= graphics
|
||||
MASTER_SITES= http://www.ijg.org/files/ \
|
||||
ftp://ftp.uu.net/graphics/jpeg/ \
|
||||
|
30
graphics/jpeg/files/patch-jerror.h
Normal file
30
graphics/jpeg/files/patch-jerror.h
Normal file
@ -0,0 +1,30 @@
|
||||
--- jerror.h.orig Sat Oct 18 14:59:10 1997
|
||||
+++ jerror.h Fri Jun 4 15:20:23 2004
|
||||
@@ -45,8 +45,11 @@
|
||||
JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
|
||||
JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
|
||||
JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
|
||||
+JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request")
|
||||
JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
|
||||
JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
|
||||
+JMESSAGE(JERR_BAD_DROP_SAMPLING,
|
||||
+ "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c")
|
||||
JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
|
||||
JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace")
|
||||
JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace")
|
||||
@@ -226,6 +229,15 @@
|
||||
(cinfo)->err->msg_parm.i[1] = (p2), \
|
||||
(cinfo)->err->msg_parm.i[2] = (p3), \
|
||||
(cinfo)->err->msg_parm.i[3] = (p4), \
|
||||
+ (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
||||
+#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \
|
||||
+ ((cinfo)->err->msg_code = (code), \
|
||||
+ (cinfo)->err->msg_parm.i[0] = (p1), \
|
||||
+ (cinfo)->err->msg_parm.i[1] = (p2), \
|
||||
+ (cinfo)->err->msg_parm.i[2] = (p3), \
|
||||
+ (cinfo)->err->msg_parm.i[3] = (p4), \
|
||||
+ (cinfo)->err->msg_parm.i[4] = (p5), \
|
||||
+ (cinfo)->err->msg_parm.i[5] = (p6), \
|
||||
(*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo)))
|
||||
#define ERREXITS(cinfo,code,str) \
|
||||
((cinfo)->err->msg_code = (code), \
|
@ -1,6 +1,23 @@
|
||||
--- jpegtran.c.exif 1997-07-24 04:37:26.000000000 +0200
|
||||
+++ jpegtran.c 2003-09-29 22:31:22.000000000 +0200
|
||||
@@ -56,6 +56,7 @@
|
||||
--- jpegtran.c.orig Wed Jul 23 22:37:26 1997
|
||||
+++ jpegtran.c Fri Jun 4 14:47:24 2004
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* jpegtran.c
|
||||
*
|
||||
- * Copyright (C) 1995-1997, Thomas G. Lane.
|
||||
+ * Copyright (C) 1995-2001, Thomas G. Lane.
|
||||
* This file is part of the Independent JPEG Group's software.
|
||||
* For conditions of distribution and use, see the accompanying README file.
|
||||
*
|
||||
@@ -37,6 +37,7 @@
|
||||
|
||||
static const char * progname; /* program name for error messages */
|
||||
static char * outfilename; /* for -outfile switch */
|
||||
+static char * dropfilename; /* for -drop switch */
|
||||
static JCOPY_OPTION copyoption; /* -copy switch */
|
||||
static jpeg_transform_info transformoption; /* image transformation options */
|
||||
|
||||
@@ -56,6 +57,7 @@
|
||||
fprintf(stderr, " -copy none Copy no extra markers from source file\n");
|
||||
fprintf(stderr, " -copy comments Copy only comment markers (default)\n");
|
||||
fprintf(stderr, " -copy all Copy all extra markers\n");
|
||||
@ -8,7 +25,25 @@
|
||||
#ifdef ENTROPY_OPT_SUPPORTED
|
||||
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n");
|
||||
#endif
|
||||
@@ -109,6 +110,50 @@
|
||||
@@ -64,12 +66,16 @@
|
||||
#endif
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
fprintf(stderr, "Switches for modifying the image:\n");
|
||||
+ fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n");
|
||||
+ fprintf(stderr, " -drop +X+Y filename Drop another image\n");
|
||||
fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
|
||||
fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n");
|
||||
+ fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n");
|
||||
fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n");
|
||||
fprintf(stderr, " -transpose Transpose image\n");
|
||||
fprintf(stderr, " -transverse Transverse transpose image\n");
|
||||
- fprintf(stderr, " -trim Drop non-transformable edge blocks\n");
|
||||
+ fprintf(stderr, " -trim Drop non-transformable edge blocks or\n");
|
||||
+ fprintf(stderr, " with -drop: Requantize drop file to source file\n");
|
||||
#endif /* TRANSFORMS_SUPPORTED */
|
||||
fprintf(stderr, "Switches for advanced users:\n");
|
||||
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
|
||||
@@ -109,6 +115,50 @@
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -59,7 +94,30 @@
|
||||
|
||||
LOCAL(int)
|
||||
parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
||||
@@ -170,6 +215,8 @@
|
||||
@@ -130,10 +180,13 @@
|
||||
/* Set up default JPEG parameters. */
|
||||
simple_progressive = FALSE;
|
||||
outfilename = NULL;
|
||||
+ dropfilename = NULL;
|
||||
copyoption = JCOPYOPT_DEFAULT;
|
||||
transformoption.transform = JXFORM_NONE;
|
||||
transformoption.trim = FALSE;
|
||||
+ transformoption.perfect = FALSE;
|
||||
transformoption.force_grayscale = FALSE;
|
||||
+ transformoption.crop = FALSE;
|
||||
cinfo->err->trace_level = 0;
|
||||
|
||||
/* Scan command line options, adjust parameters */
|
||||
@@ -160,7 +213,7 @@
|
||||
exit(EXIT_FAILURE);
|
||||
#endif
|
||||
|
||||
- } else if (keymatch(arg, "copy", 1)) {
|
||||
+ } else if (keymatch(arg, "copy", 2)) {
|
||||
/* Select which extra markers to copy. */
|
||||
if (++argn >= argc) /* advance to next argument */
|
||||
usage();
|
||||
@@ -170,9 +223,47 @@
|
||||
copyoption = JCOPYOPT_COMMENTS;
|
||||
} else if (keymatch(argv[argn], "all", 1)) {
|
||||
copyoption = JCOPYOPT_ALL;
|
||||
@ -68,7 +126,46 @@
|
||||
} else
|
||||
usage();
|
||||
|
||||
@@ -181,6 +228,7 @@
|
||||
+ } else if (keymatch(arg, "crop", 2)) {
|
||||
+ /* Perform lossless cropping. */
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (++argn >= argc) /* advance to next argument */
|
||||
+ usage();
|
||||
+ if (transformoption.crop /* reject multiple crop/drop requests */ ||
|
||||
+ ! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
|
||||
+ fprintf(stderr, "%s: bogus -crop argument '%s'\n",
|
||||
+ progname, argv[argn]);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+#else
|
||||
+ select_transform(JXFORM_NONE); /* force an error */
|
||||
+#endif
|
||||
+
|
||||
+ } else if (keymatch(arg, "drop", 2)) {
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (++argn >= argc) /* advance to next argument */
|
||||
+ usage();
|
||||
+ if (transformoption.crop /* reject multiple crop/drop requests */ ||
|
||||
+ ! jtransform_parse_crop_spec(&transformoption, argv[argn]) ||
|
||||
+ transformoption.crop_width_set != JCROP_UNSET ||
|
||||
+ transformoption.crop_height_set != JCROP_UNSET) {
|
||||
+ fprintf(stderr, "%s: bogus -drop argument '%s'\n",
|
||||
+ progname, argv[argn]);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ if (++argn >= argc) /* advance to next argument */
|
||||
+ usage();
|
||||
+ dropfilename = argv[argn];
|
||||
+ select_transform(JXFORM_DROP);
|
||||
+#else
|
||||
+ select_transform(JXFORM_NONE); /* force an error */
|
||||
+#endif
|
||||
+
|
||||
+
|
||||
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
||||
/* Enable debug printouts. */
|
||||
/* On first -d, print version identification */
|
||||
@@ -181,6 +272,7 @@
|
||||
if (! printed_version) {
|
||||
fprintf(stderr, "Independent JPEG Group's JPEGTRAN, version %s\n%s\n",
|
||||
JVERSION, JCOPYRIGHT);
|
||||
@ -76,7 +173,136 @@
|
||||
printed_version = TRUE;
|
||||
}
|
||||
cinfo->err->trace_level++;
|
||||
@@ -452,6 +500,7 @@
|
||||
@@ -233,7 +325,12 @@
|
||||
usage();
|
||||
outfilename = argv[argn]; /* save it away for later use */
|
||||
|
||||
- } else if (keymatch(arg, "progressive", 1)) {
|
||||
+ } else if (keymatch(arg, "perfect", 2)) {
|
||||
+ /* Fail if there is any partial edge MCUs that the transform can't
|
||||
+ * handle. */
|
||||
+ transformoption.perfect = TRUE;
|
||||
+
|
||||
+ } else if (keymatch(arg, "progressive", 2)) {
|
||||
/* Select simple progressive mode. */
|
||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
||||
simple_progressive = TRUE;
|
||||
@@ -334,16 +431,24 @@
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
struct jpeg_decompress_struct srcinfo;
|
||||
+ struct jpeg_error_mgr jsrcerr;
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ struct jpeg_decompress_struct dropinfo;
|
||||
+ struct jpeg_error_mgr jdroperr;
|
||||
+ FILE * drop_file;
|
||||
+#endif
|
||||
struct jpeg_compress_struct dstinfo;
|
||||
- struct jpeg_error_mgr jsrcerr, jdsterr;
|
||||
+ struct jpeg_error_mgr jdsterr;
|
||||
#ifdef PROGRESS_REPORT
|
||||
struct cdjpeg_progress_mgr progress;
|
||||
#endif
|
||||
jvirt_barray_ptr * src_coef_arrays;
|
||||
jvirt_barray_ptr * dst_coef_arrays;
|
||||
int file_index;
|
||||
- FILE * input_file;
|
||||
- FILE * output_file;
|
||||
+ /* We assume all-in-memory processing and can therefore use only a
|
||||
+ * single file pointer for sequential input and output operation.
|
||||
+ */
|
||||
+ FILE * fp;
|
||||
|
||||
/* On Mac, fetch a command line. */
|
||||
#ifdef USE_CCOMMAND
|
||||
@@ -406,32 +511,36 @@
|
||||
|
||||
/* Open the input file. */
|
||||
if (file_index < argc) {
|
||||
- if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) {
|
||||
- fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]);
|
||||
+ if ((fp = fopen(argv[file_index], READ_BINARY)) == NULL) {
|
||||
+ fprintf(stderr, "%s: can't open %s for reading\n", progname, argv[file_index]);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
} else {
|
||||
/* default input file is stdin */
|
||||
- input_file = read_stdin();
|
||||
+ fp = read_stdin();
|
||||
}
|
||||
-
|
||||
- /* Open the output file. */
|
||||
- if (outfilename != NULL) {
|
||||
- if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) {
|
||||
- fprintf(stderr, "%s: can't open %s\n", progname, outfilename);
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ /* Open the drop file. */
|
||||
+ if (dropfilename != NULL) {
|
||||
+ if ((drop_file = fopen(dropfilename, READ_BINARY)) == NULL) {
|
||||
+ fprintf(stderr, "%s: can't open %s for reading\n", progname, dropfilename);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
+ dropinfo.err = jpeg_std_error(&jdroperr);
|
||||
+ jpeg_create_decompress(&dropinfo);
|
||||
+ jpeg_stdio_src(&dropinfo, drop_file);
|
||||
} else {
|
||||
- /* default output file is stdout */
|
||||
- output_file = write_stdout();
|
||||
+ drop_file = NULL;
|
||||
}
|
||||
+#endif
|
||||
+
|
||||
|
||||
#ifdef PROGRESS_REPORT
|
||||
start_progress_monitor((j_common_ptr) &dstinfo, &progress);
|
||||
#endif
|
||||
|
||||
/* Specify data source for decompression */
|
||||
- jpeg_stdio_src(&srcinfo, input_file);
|
||||
+ jpeg_stdio_src(&srcinfo, fp);
|
||||
|
||||
/* Enable saving of extra markers that we want to copy */
|
||||
jcopy_markers_setup(&srcinfo, copyoption);
|
||||
@@ -439,19 +548,46 @@
|
||||
/* Read file header */
|
||||
(void) jpeg_read_header(&srcinfo, TRUE);
|
||||
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL) {
|
||||
+ (void) jpeg_read_header(&dropinfo, TRUE);
|
||||
+ transformoption.crop_width = dropinfo.image_width;
|
||||
+ transformoption.crop_width_set = JCROP_POS;
|
||||
+ transformoption.crop_height = dropinfo.image_height;
|
||||
+ transformoption.crop_height_set = JCROP_POS;
|
||||
+ transformoption.drop_ptr = &dropinfo;
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* Any space needed by a transform option must be requested before
|
||||
* jpeg_read_coefficients so that memory allocation will be done right.
|
||||
*/
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
+ /* Fails right away if -perfect is given and transformation is not perfect.
|
||||
+ */
|
||||
+ if (transformoption.perfect &&
|
||||
+ !jtransform_perfect_transform(srcinfo.image_width, srcinfo.image_height,
|
||||
+ srcinfo.max_h_samp_factor * DCTSIZE, srcinfo.max_v_samp_factor * DCTSIZE,
|
||||
+ transformoption.transform)) {
|
||||
+ fprintf(stderr, "%s: transformation is not perfect\n", progname);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
jtransform_request_workspace(&srcinfo, &transformoption);
|
||||
#endif
|
||||
|
||||
/* Read source file as DCT coefficients */
|
||||
src_coef_arrays = jpeg_read_coefficients(&srcinfo);
|
||||
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL) {
|
||||
+ transformoption.drop_coef_arrays = jpeg_read_coefficients(&dropinfo);
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
/* Initialize destination compression parameters from source values */
|
||||
jpeg_copy_critical_parameters(&srcinfo, &dstinfo);
|
||||
|
||||
@ -84,9 +310,31 @@
|
||||
/* Adjust destination parameters if required by transform options;
|
||||
* also find out which set of coefficient arrays will hold the output.
|
||||
*/
|
||||
@@ -464,8 +513,12 @@
|
||||
@@ -463,11 +599,36 @@
|
||||
dst_coef_arrays = src_coef_arrays;
|
||||
#endif
|
||||
|
||||
+ /* Close input file, if we opened it.
|
||||
+ * Note: we assume that jpeg_read_coefficients consumed all input
|
||||
+ * until JPEG_REACHED_EOI, and that jpeg_finish_decompress will
|
||||
+ * only consume more while (! cinfo->inputctl->eoi_reached).
|
||||
+ * We cannot call jpeg_finish_decompress here since we still need the
|
||||
+ * virtual arrays allocated from the source object for processing.
|
||||
+ */
|
||||
+ if (fp != stdin)
|
||||
+ fclose(fp);
|
||||
+
|
||||
+ /* Open the output file. */
|
||||
+ if (outfilename != NULL) {
|
||||
+ if ((fp = fopen(outfilename, WRITE_BINARY)) == NULL) {
|
||||
+ fprintf(stderr, "%s: can't open %s for writing\n", progname, outfilename);
|
||||
+ exit(EXIT_FAILURE);
|
||||
+ }
|
||||
+ } else {
|
||||
+ /* default output file is stdout */
|
||||
+ fp = write_stdout();
|
||||
+ }
|
||||
+
|
||||
/* Adjust default compression parameters by re-parsing the options */
|
||||
+ /* Save value of copyoption */
|
||||
file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE);
|
||||
@ -95,5 +343,58 @@
|
||||
+ handle_exif(&srcinfo,&dstinfo,©option);
|
||||
+
|
||||
/* Specify data destination for compression */
|
||||
jpeg_stdio_dest(&dstinfo, output_file);
|
||||
- jpeg_stdio_dest(&dstinfo, output_file);
|
||||
+ jpeg_stdio_dest(&dstinfo, fp);
|
||||
|
||||
/* Start compressor (note no image data is actually written here) */
|
||||
jpeg_write_coefficients(&dstinfo, dst_coef_arrays);
|
||||
@@ -477,28 +638,41 @@
|
||||
|
||||
/* Execute image transformation, if any */
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
- jtransform_execute_transformation(&srcinfo, &dstinfo,
|
||||
- src_coef_arrays,
|
||||
- &transformoption);
|
||||
+ jtransform_execute_transform(&srcinfo, &dstinfo,
|
||||
+ src_coef_arrays,
|
||||
+ &transformoption);
|
||||
#endif
|
||||
|
||||
/* Finish compression and release memory */
|
||||
jpeg_finish_compress(&dstinfo);
|
||||
jpeg_destroy_compress(&dstinfo);
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL) {
|
||||
+ (void) jpeg_finish_decompress(&dropinfo);
|
||||
+ jpeg_destroy_decompress(&dropinfo);
|
||||
+ }
|
||||
+#endif
|
||||
(void) jpeg_finish_decompress(&srcinfo);
|
||||
jpeg_destroy_decompress(&srcinfo);
|
||||
|
||||
- /* Close files, if we opened them */
|
||||
- if (input_file != stdin)
|
||||
- fclose(input_file);
|
||||
- if (output_file != stdout)
|
||||
- fclose(output_file);
|
||||
+ /* Close output file, if we opened it */
|
||||
+ if (fp != stdout)
|
||||
+ fclose(fp);
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (drop_file != NULL)
|
||||
+ fclose(drop_file);
|
||||
+#endif
|
||||
|
||||
#ifdef PROGRESS_REPORT
|
||||
end_progress_monitor((j_common_ptr) &dstinfo);
|
||||
#endif
|
||||
|
||||
/* All done. */
|
||||
+#if TRANSFORMS_SUPPORTED
|
||||
+ if (dropfilename != NULL)
|
||||
+ exit(jsrcerr.num_warnings + jdroperr.num_warnings + jdsterr.num_warnings ?
|
||||
+ EXIT_WARNING : EXIT_SUCCESS);
|
||||
+#endif
|
||||
exit(jsrcerr.num_warnings + jdsterr.num_warnings ?EXIT_WARNING:EXIT_SUCCESS);
|
||||
return 0; /* suppress no-return-value warnings */
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,191 @@
|
||||
--- transupp.h.exif 1997-07-24 04:39:12.000000000 +0200
|
||||
+++ transupp.h 2003-09-25 01:05:12.000000000 +0200
|
||||
@@ -121,7 +121,8 @@
|
||||
--- transupp.h.orig Wed Jul 23 22:39:12 1997
|
||||
+++ transupp.h Fri Jun 4 15:07:31 2004
|
||||
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* transupp.h
|
||||
*
|
||||
- * Copyright (C) 1997, Thomas G. Lane.
|
||||
+ * Copyright (C) 1997-2001, Thomas G. Lane.
|
||||
* This file is part of the Independent JPEG Group's software.
|
||||
* For conditions of distribution and use, see the accompanying README file.
|
||||
*
|
||||
@@ -22,32 +22,6 @@
|
||||
#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */
|
||||
#endif
|
||||
|
||||
-/* Short forms of external names for systems with brain-damaged linkers. */
|
||||
-
|
||||
-#ifdef NEED_SHORT_EXTERNAL_NAMES
|
||||
-#define jtransform_request_workspace jTrRequest
|
||||
-#define jtransform_adjust_parameters jTrAdjust
|
||||
-#define jtransform_execute_transformation jTrExec
|
||||
-#define jcopy_markers_setup jCMrkSetup
|
||||
-#define jcopy_markers_execute jCMrkExec
|
||||
-#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
||||
-
|
||||
-
|
||||
-/*
|
||||
- * Codes for supported types of image transformations.
|
||||
- */
|
||||
-
|
||||
-typedef enum {
|
||||
- JXFORM_NONE, /* no transformation */
|
||||
- JXFORM_FLIP_H, /* horizontal flip */
|
||||
- JXFORM_FLIP_V, /* vertical flip */
|
||||
- JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */
|
||||
- JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
|
||||
- JXFORM_ROT_90, /* 90-degree clockwise rotation */
|
||||
- JXFORM_ROT_180, /* 180-degree rotation */
|
||||
- JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */
|
||||
-} JXFORM_CODE;
|
||||
-
|
||||
/*
|
||||
* Although rotating and flipping data expressed as DCT coefficients is not
|
||||
* hard, there is an asymmetry in the JPEG format specification for images
|
||||
@@ -75,6 +49,19 @@
|
||||
* (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
|
||||
* followed by -rot 180 -trim trims both edges.)
|
||||
*
|
||||
+ * We also offer a lossless-crop option, which discards data outside a given
|
||||
+ * image region but losslessly preserves what is inside. Like the rotate and
|
||||
+ * flip transforms, lossless crop is restricted by the JPEG format: the upper
|
||||
+ * left corner of the selected region must fall on an iMCU boundary. If this
|
||||
+ * does not hold for the given crop parameters, we silently move the upper left
|
||||
+ * 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.)
|
||||
+ *
|
||||
+ * 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 offer a "force to grayscale" option, which simply discards the
|
||||
* chrominance channels of a YCbCr image. This is lossless in the sense that
|
||||
* the luminance channel is preserved exactly. It's not the same kind of
|
||||
@@ -83,20 +70,96 @@
|
||||
* be aware of the option to know how many components to work on.
|
||||
*/
|
||||
|
||||
+
|
||||
+/* Short forms of external names for systems with brain-damaged linkers. */
|
||||
+
|
||||
+#ifdef NEED_SHORT_EXTERNAL_NAMES
|
||||
+#define jtransform_parse_crop_spec jTrParCrop
|
||||
+#define jtransform_request_workspace jTrRequest
|
||||
+#define jtransform_adjust_parameters jTrAdjust
|
||||
+#define jtransform_execute_transform jTrExec
|
||||
+#define jtransform_perfect_transform jTrPerfect
|
||||
+#define jcopy_markers_setup jCMrkSetup
|
||||
+#define jcopy_markers_execute jCMrkExec
|
||||
+#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * Codes for supported types of image transformations.
|
||||
+ */
|
||||
+
|
||||
+typedef enum {
|
||||
+ JXFORM_NONE, /* no transformation */
|
||||
+ JXFORM_FLIP_H, /* horizontal flip */
|
||||
+ JXFORM_FLIP_V, /* vertical flip */
|
||||
+ JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */
|
||||
+ JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */
|
||||
+ JXFORM_ROT_90, /* 90-degree clockwise rotation */
|
||||
+ JXFORM_ROT_180, /* 180-degree rotation */
|
||||
+ JXFORM_ROT_270, /* 270-degree clockwise (or 90 ccw) */
|
||||
+ JXFORM_DROP /* drop */
|
||||
+} JXFORM_CODE;
|
||||
+
|
||||
+/*
|
||||
+ * Codes for crop parameters, which can individually be unspecified,
|
||||
+ * positive, or negative. (Negative width or height makes no sense, though.)
|
||||
+ */
|
||||
+
|
||||
+typedef enum {
|
||||
+ JCROP_UNSET,
|
||||
+ JCROP_POS,
|
||||
+ JCROP_NEG
|
||||
+} JCROP_CODE;
|
||||
+
|
||||
+/*
|
||||
+ * Transform parameters struct.
|
||||
+ * NB: application must not change any elements of this struct after
|
||||
+ * calling jtransform_request_workspace.
|
||||
+ */
|
||||
+
|
||||
typedef struct {
|
||||
/* Options: set by caller */
|
||||
JXFORM_CODE transform; /* image transform operator */
|
||||
+ boolean perfect; /* if TRUE, fail if partial MCUs are requested */
|
||||
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 */
|
||||
+
|
||||
+ /* 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;
|
||||
+ JDIMENSION crop_height; /* Height of selected region */
|
||||
+ 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 */
|
||||
+ JCROP_CODE crop_yoffset_set; /* (negative measures from bottom edge) */
|
||||
+
|
||||
+ /* Drop parameters: set by caller for drop request */
|
||||
+ j_decompress_ptr drop_ptr;
|
||||
+ jvirt_barray_ptr * drop_coef_arrays;
|
||||
|
||||
/* Internal workspace: caller should not touch these */
|
||||
int num_components; /* # of components in workspace */
|
||||
jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
|
||||
+ JDIMENSION output_width; /* cropped destination dimensions */
|
||||
+ JDIMENSION output_height;
|
||||
+ JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
|
||||
+ JDIMENSION y_crop_offset;
|
||||
+ JDIMENSION drop_width; /* drop dimensions measured in iMCUs */
|
||||
+ JDIMENSION drop_height;
|
||||
+ int max_h_samp_factor; /* destination iMCU size */
|
||||
+ int max_v_samp_factor;
|
||||
} jpeg_transform_info;
|
||||
|
||||
|
||||
#if TRANSFORMS_SUPPORTED
|
||||
|
||||
+/* Parse a crop specification (written in X11 geometry style) */
|
||||
+EXTERN(boolean) jtransform_parse_crop_spec
|
||||
+ JPP((jpeg_transform_info *info, const char *spec));
|
||||
/* Request any required workspace */
|
||||
EXTERN(void) jtransform_request_workspace
|
||||
JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
|
||||
@@ -106,10 +169,24 @@
|
||||
jvirt_barray_ptr *src_coef_arrays,
|
||||
jpeg_transform_info *info));
|
||||
/* Execute the actual transformation, if any */
|
||||
-EXTERN(void) jtransform_execute_transformation
|
||||
+EXTERN(void) jtransform_execute_transform
|
||||
JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
|
||||
jvirt_barray_ptr *src_coef_arrays,
|
||||
jpeg_transform_info *info));
|
||||
+/* Determine whether lossless transformation is perfectly
|
||||
+ * possible for a specified image and transformation.
|
||||
+ */
|
||||
+EXTERN(boolean) jtransform_perfect_transform
|
||||
+ JPP((JDIMENSION image_width, JDIMENSION image_height,
|
||||
+ int MCU_width, int MCU_height,
|
||||
+ JXFORM_CODE transform));
|
||||
+
|
||||
+/* jtransform_execute_transform used to be called
|
||||
+ * jtransform_execute_transformation, but some compilers complain about
|
||||
+ * routine names that long. This macro is here to avoid breaking any
|
||||
+ * old source code that uses the original name...
|
||||
+ */
|
||||
+#define jtransform_execute_transformation jtransform_execute_transform
|
||||
|
||||
#endif /* TRANSFORMS_SUPPORTED */
|
||||
|
||||
@@ -121,7 +198,8 @@
|
||||
typedef enum {
|
||||
JCOPYOPT_NONE, /* copy no optional markers */
|
||||
JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */
|
||||
|
Loading…
Reference in New Issue
Block a user