Upgrade libjpeg 8c -> 9e

This commit is contained in:
Martin Natano
2022-05-30 23:57:33 +02:00
parent e2ee97e36d
commit 06154a0094
187 changed files with 71861 additions and 3686 deletions
+105 -11
View File
@@ -1,7 +1,7 @@
/*
* jpegtran.c
*
* Copyright (C) 1995-2010, Thomas G. Lane, Guido Vollbeding.
* Copyright (C) 1995-2019, 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.
*
@@ -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 * scaleoption; /* -scale switch */
static JCOPY_OPTION copyoption; /* -copy switch */
static jpeg_transform_info transformoption; /* image transformation options */
@@ -66,8 +67,9 @@ usage (void)
fprintf(stderr, "Switches for modifying the image:\n");
#if TRANSFORMS_SUPPORTED
fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\n");
fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
fprintf(stderr, " -drop +X+Y filename Drop another image\n");
fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\n");
fprintf(stderr, " -grayscale Reduce to grayscale (omit color data)\n");
fprintf(stderr, " -perfect Fail if there is non-transformable edge blocks\n");
fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n");
#endif
@@ -76,16 +78,18 @@ usage (void)
fprintf(stderr, " -transpose Transpose image\n");
fprintf(stderr, " -transverse Transverse transpose image\n");
fprintf(stderr, " -trim Drop non-transformable edge blocks\n");
fprintf(stderr, " with -drop: Requantize drop file to source file\n");
fprintf(stderr, " -wipe WxH+X+Y Wipe (gray out) a rectangular subarea\n");
#endif
fprintf(stderr, "Switches for advanced users:\n");
#ifdef C_ARITH_CODING_SUPPORTED
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
#endif
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
fprintf(stderr, " -outfile name Specify name for output file\n");
fprintf(stderr, " -verbose or -debug Emit debug output\n");
fprintf(stderr, "Switches for wizards:\n");
#ifdef C_ARITH_CODING_SUPPORTED
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
#endif
#ifdef C_MULTISCAN_FILES_SUPPORTED
fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n");
#endif
@@ -187,7 +191,8 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
#if TRANSFORMS_SUPPORTED
if (++argn >= argc) /* advance to next argument */
usage();
if (! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
if (transformoption.crop /* reject multiple crop/drop/wipe requests */ ||
! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
fprintf(stderr, "%s: bogus -crop argument '%s'\n",
progname, argv[argn]);
exit(EXIT_FAILURE);
@@ -196,6 +201,26 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
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/wipe 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 */
@@ -336,6 +361,21 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Trim off any partial edge MCUs that the transform can't handle. */
transformoption.trim = TRUE;
} else if (keymatch(arg, "wipe", 1)) {
#if TRANSFORMS_SUPPORTED
if (++argn >= argc) /* advance to next argument */
usage();
if (transformoption.crop /* reject multiple crop/drop/wipe requests */ ||
! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
fprintf(stderr, "%s: bogus -wipe argument '%s'\n",
progname, argv[argn]);
exit(EXIT_FAILURE);
}
select_transform(JXFORM_WIPE);
#else
select_transform(JXFORM_NONE); /* force an error */
#endif
} else {
usage(); /* bogus switch */
}
@@ -369,8 +409,14 @@ int
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
@@ -410,7 +456,7 @@ main (int argc, char **argv)
* values read here are mostly ignored; we will rescan the switches after
* opening the input file. Also note that most of the switches affect the
* destination JPEG object, so we parse into that and then copy over what
* needs to affects the source too.
* needs to affect the source too.
*/
file_index = parse_switches(&dstinfo, argc, argv, 0, FALSE);
@@ -452,6 +498,21 @@ main (int argc, char **argv)
fp = read_stdin();
}
#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 {
drop_file = NULL;
}
#endif
#ifdef PROGRESS_REPORT
start_progress_monitor((j_common_ptr) &dstinfo, &progress);
#endif
@@ -467,10 +528,21 @@ main (int argc, char **argv)
/* Adjust default decompression parameters */
if (scaleoption != NULL)
if (sscanf(scaleoption, "%d/%d",
if (sscanf(scaleoption, "%u/%u",
&srcinfo.scale_num, &srcinfo.scale_denom) < 1)
usage();
#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.
*/
@@ -486,6 +558,12 @@ main (int argc, char **argv)
/* 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);
@@ -543,18 +621,34 @@ main (int argc, char **argv)
/* 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 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. */
exit(jsrcerr.num_warnings + jdsterr.num_warnings ?EXIT_WARNING:EXIT_SUCCESS);
return 0; /* suppress no-return-value warnings */
#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 */
}