diff options
author | Dirk Meyer <dinoex@FreeBSD.org> | 2009-07-18 11:11:29 +0000 |
---|---|---|
committer | Dirk Meyer <dinoex@FreeBSD.org> | 2009-07-18 11:11:29 +0000 |
commit | 3bbc108312c59a9d56e6bd7a9130f8572093caaf (patch) | |
tree | 8e56c67cbd222afd02e8ebaf5562ceb6431033ac /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.c | 235 |
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,©option); + /* 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); |