summaryrefslogtreecommitdiff
path: root/graphics/jpeg/files/patch-jpegtran.c
diff options
context:
space:
mode:
authorDirk Meyer <dinoex@FreeBSD.org>2009-07-18 11:11:29 +0000
committerDirk Meyer <dinoex@FreeBSD.org>2009-07-18 11:11:29 +0000
commit3bbc108312c59a9d56e6bd7a9130f8572093caaf (patch)
tree8e56c67cbd222afd02e8ebaf5562ceb6431033ac /graphics/jpeg/files/patch-jpegtran.c
parent- Update to r154 (diff)
- update to jpeg7
Tested by: pav on pointyhat
Diffstat (limited to 'graphics/jpeg/files/patch-jpegtran.c')
-rw-r--r--graphics/jpeg/files/patch-jpegtran.c235
1 files changed, 41 insertions, 194 deletions
diff --git a/graphics/jpeg/files/patch-jpegtran.c b/graphics/jpeg/files/patch-jpegtran.c
index 34e4539d7a94..7a992e766c8e 100644
--- a/graphics/jpeg/files/patch-jpegtran.c
+++ b/graphics/jpeg/files/patch-jpegtran.c
@@ -1,19 +1,10 @@
---- 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.
- *
+--- jpegtran.c.orig 2003-09-22 00:00:52.000000000 +0200
++++ jpegtran.c 2009-06-30 13:41:20.000000000 +0200
@@ -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 char * dropfilename; /* for -drop switch */
static JCOPY_OPTION copyoption; /* -copy switch */
static jpeg_transform_info transformoption; /* image transformation options */
@@ -25,15 +16,14 @@
#ifdef ENTROPY_OPT_SUPPORTED
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n");
#endif
-@@ -64,12 +66,16 @@
- #endif
+@@ -65,13 +67,15 @@
#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, " -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, " -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");
@@ -43,10 +33,10 @@
#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
+@@ -112,6 +116,52 @@
}
+
+LOCAL(void)
+handle_exif (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
+ JCOPY_OPTION *copyoption)
@@ -91,10 +81,12 @@
+ srcinfo->marker_list = cur_marker;
+ }
+}
-
++
++
LOCAL(int)
parse_switches (j_compress_ptr cinfo, int argc, char **argv,
-@@ -130,10 +180,13 @@
+ int last_file_arg_seen, boolean for_real)
+@@ -132,6 +182,7 @@
/* Set up default JPEG parameters. */
simple_progressive = FALSE;
outfilename = NULL;
@@ -102,45 +94,19 @@
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 @@
+@@ -174,6 +225,8 @@
copyoption = JCOPYOPT_COMMENTS;
} else if (keymatch(argv[argn], "all", 1)) {
copyoption = JCOPYOPT_ALL;
+ } else if (keymatch(argv[argn], "exif", 1)) {
-+ copyoption = JCOPYOPT_EXIF;
++ copyoption = JCOPYOPT_EXIF;
} else
usage();
-+ } 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
-+
+@@ -191,6 +244,26 @@
+ select_transform(JXFORM_NONE); /* force an error */
+ #endif
+
+ } else if (keymatch(arg, "drop", 2)) {
+#if TRANSFORMS_SUPPORTED
+ if (++argn >= argc) /* advance to next argument */
@@ -161,109 +127,52 @@
+ 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 @@
+@@ -199,6 +272,7 @@
if (! printed_version) {
fprintf(stderr, "Independent JPEG Group's JPEGTRAN, version %s\n%s\n",
JVERSION, JCOPYRIGHT);
-+ fprintf(stderr, "EXIF support v 0.1 added 29-Sep-2003\n");
++ fprintf(stderr, "EXIF support v 0.1 added 29-Sep-2003\n");
printed_version = TRUE;
}
cinfo->err->trace_level++;
-@@ -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)
- {
+@@ -359,6 +433,11 @@
struct jpeg_decompress_struct srcinfo;
-+ struct jpeg_error_mgr jsrcerr;
+ struct jpeg_compress_struct dstinfo;
+ struct jpeg_error_mgr jsrcerr, jdsterr;
+#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();
+@@ -440,6 +519,21 @@
+ 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);
- }
++ 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();
++ } else {
+ 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 @@
+@@ -453,6 +547,17 @@
/* Read file header */
(void) jpeg_read_header(&srcinfo, TRUE);
@@ -281,19 +190,7 @@
/* 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
-
+@@ -472,6 +577,12 @@
/* Read source file as DCT coefficients */
src_coef_arrays = jpeg_read_coefficients(&srcinfo);
@@ -306,80 +203,30 @@
/* Initialize destination compression parameters from source values */
jpeg_copy_critical_parameters(&srcinfo, &dstinfo);
-+
- /* Adjust destination parameters if required by transform options;
- * also find out which set of coefficient arrays will hold the output.
- */
-@@ -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();
-+ }
-+
+@@ -510,6 +621,9 @@
/* Adjust default compression parameters by re-parsing the options */
-+ /* Save value of copyoption */
file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE);
+ /* If we want EXIF, make sure we do not write incompatible markers */
+ handle_exif(&srcinfo,&dstinfo,&copyoption);
+
/* Specify data destination for compression */
-- 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
+ jpeg_stdio_dest(&dstinfo, fp);
- /* Finish compression and release memory */
- jpeg_finish_compress(&dstinfo);
+@@ -531,16 +645,30 @@
jpeg_destroy_compress(&dstinfo);
+ (void) jpeg_finish_decompress(&srcinfo);
+ jpeg_destroy_decompress(&srcinfo);
+-
+#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);
+ /* Close output file, if we opened it */
+ if (fp != stdout)
+ fclose(fp);
+#if TRANSFORMS_SUPPORTED
+ if (drop_file != NULL)
+ fclose(drop_file);