diff --git a/ChangeLog.txt b/ChangeLog.txt index 326ba5d9..e366c6db 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -28,7 +28,14 @@ about every 25 million iterations. [6] Fixed a build issue on OS X PowerPC platforms (md5cmp failed to build because OS X does not provide the le32toh() and htole32() functions.) -[7] The TurboJPEG API previously generated an error ("Could not determine +[7] The close() method in the TJCompressor and TJDecompressor Java classes is +now idempotent. Previously, that method would call the native tjDestroy() +function even if the TurboJPEG instance had already been destroyed. This +caused an exception to be thrown during finalization, if the close() method had +already been called. The exception was caught, but it was still an expensive +operation. + +[8] The TurboJPEG API previously generated an error ("Could not determine subsampling type for JPEG image") when attempting to decompress grayscale JPEG images that were compressed with a sampling factor other than 1 (for instance, with 'cjpeg -grayscale -sample 2x2'). Subsampling technically has no meaning diff --git a/java/org/libjpegturbo/turbojpeg/TJCompressor.java b/java/org/libjpegturbo/turbojpeg/TJCompressor.java index 6fb653f0..29c8b2ab 100644 --- a/java/org/libjpegturbo/turbojpeg/TJCompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJCompressor.java @@ -496,7 +496,8 @@ public class TJCompressor { * Free the native structures associated with this compressor instance. */ public void close() throws Exception { - destroy(); + if (handle != 0) + destroy(); } protected void finalize() throws Throwable { diff --git a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java index ec8ab772..8b98dcfc 100644 --- a/java/org/libjpegturbo/turbojpeg/TJDecompressor.java +++ b/java/org/libjpegturbo/turbojpeg/TJDecompressor.java @@ -594,7 +594,8 @@ public class TJDecompressor { * Free the native structures associated with this decompressor instance. */ public void close() throws Exception { - destroy(); + if (handle != 0) + destroy(); } protected void finalize() throws Throwable {