]> granicus.if.org Git - libjpeg-turbo/commitdiff
djpeg -crop: Exit gracefully with non-PPM formats
authorDRC <information@libjpeg-turbo.org>
Thu, 9 Nov 2017 03:01:57 +0000 (21:01 -0600)
committerDRC <information@libjpeg-turbo.org>
Thu, 9 Nov 2017 03:30:19 +0000 (21:30 -0600)
... 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

ChangeLog.md
djpeg.1
djpeg.c

index 1f9473f292b3647c33c5dc6802807238cf29ef58..8ecd04fb57d5b7f6ea37e103d4c23a8c383b27be 100644 (file)
@@ -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 b1e7f76e9620fb6df772a6e0041877a00a5273fe..b509af516b828432014e90f7f2439ead0b59b0c6 100644 (file)
--- 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 54cd525ede8a3fb19847f8eed035a5b18a97c72b..42a7f120409903651e4f9df755ca4d6ff9f486bd 100644 (file)
--- 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);