From: DRC Date: Thu, 9 Nov 2017 03:01:57 +0000 (-0600) Subject: djpeg -crop: Exit gracefully with non-PPM formats X-Git-Tag: 1.5.3~15 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=073b0e88a192adebbb479ee2456beb089d8b5de7;p=libjpeg-turbo djpeg -crop: Exit gracefully with non-PPM formats ... and document that only PPM/PGM output images are supported with the -crop option for the moment. I investigated the possibility of supporting -crop with -bmp, but even after resetting the buffer dimensions, I still kept getting virtual array access errors. It seems that doing this the "right way" would require creating a re-initialization function for each image format's destination manager. I'm disinclined to do that right now, given that this feature was Google's baby (developed as a prerequisite for including libjpeg-turbo in Android), and the -crop option in djpeg is intended only as an example of how to use the partial image decompression API. Real-world applications would need to handle this in their own destination managers. It would probably be possible to make this work with Targa by employing a similar hack to the one we used with PPM, but Targa isn't popular enough to bother. Fixes #185 --- diff --git a/ChangeLog.md b/ChangeLog.md index 1f9473f..8ecd04f 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -10,6 +10,10 @@ image planes and allocates memory for the image planes. 2. Fixed an issue whereby the Java version of TJUnitTest would fail when testing BufferedImage encoding/decoding on big endian systems. +3. djpeg will now exit gracefully if an output image format other than PPM/PGM +is selected along with the `-crop` option. That option does not currently work +with other output image formats. + 1.5.2 ===== diff --git a/djpeg.1 b/djpeg.1 index b1e7f76..b509af5 100644 --- a/djpeg.1 +++ b/djpeg.1 @@ -1,4 +1,4 @@ -.TH DJPEG 1 "18 March 2017" +.TH DJPEG 1 "8 November 2017" .SH NAME djpeg \- decompress a JPEG file to an image file .SH SYNOPSIS @@ -204,7 +204,8 @@ Decompress only a rectangular subregion of the image, starting at point X,Y with width W and height H. If necessary, X will be shifted left to the nearest iMCU boundary, and the width will be increased accordingly. Note that if decompression scaling is being used, then X, Y, W, and H are relative to the -scaled image dimensions. +scaled image dimensions. Currently this option only works with the +PBMPLUS (PPM/PGM) output format. .TP .B \-verbose Enable debug printout. More diff --git a/djpeg.c b/djpeg.c index 54cd525..42a7f12 100644 --- a/djpeg.c +++ b/djpeg.c @@ -5,7 +5,7 @@ * Copyright (C) 1991-1997, Thomas G. Lane. * Modified 2013 by Guido Vollbeding. * libjpeg-turbo Modifications: - * Copyright (C) 2010-2011, 2013-2016, D. R. Commander. + * Copyright (C) 2010-2011, 2013-2017, D. R. Commander. * Copyright (C) 2015, Google, Inc. * For conditions of distribution and use, see the accompanying README.ijg * file. @@ -173,6 +173,7 @@ usage (void) fprintf(stderr, " -skip Y0,Y1 Decompress all rows except those between Y0 and Y1 (inclusive)\n"); fprintf(stderr, " -crop WxH+X+Y Decompress only a rectangular subregion of the image\n"); + fprintf(stderr, " [requires PBMPLUS (PPM/PGM) output format]\n"); fprintf(stderr, " -verbose or -debug Emit debug output\n"); fprintf(stderr, " -version Print version information and exit\n"); exit(EXIT_FAILURE); @@ -713,6 +714,8 @@ main (int argc, char **argv) } jpeg_crop_scanline(&cinfo, &crop_x, &crop_width); + if (requested_fmt != FMT_PPM) + ERREXIT(&cinfo, JERR_UNSUPPORTED_FORMAT); ((ppm_dest_ptr) dest_mgr)->buffer_width = cinfo.output_width * cinfo.out_color_components * sizeof(JSAMPLE);