From a0fcde3af1bec22df1e6d41661d33b41cfb75967 Mon Sep 17 00:00:00 2001 From: prrace Date: Mon, 21 Jul 2025 09:50:14 -0700 Subject: [PATCH 1/2] 8362898 --- .../plugins/tiff/TIFFBaseJPEGCompressor.java | 27 ++++++++++++++----- .../plugins/tiff/TIFFJPEGDecompressor.java | 24 ++++++++++++++--- .../plugins/tiff/TIFFOldJPEGDecompressor.java | 4 --- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java index dba8d87816953..c50f4ae2c419c 100644 --- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java +++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java @@ -55,6 +55,8 @@ import javax.imageio.stream.ImageOutputStream; import javax.imageio.stream.MemoryCacheImageOutputStream; import org.w3c.dom.Node; +import sun.java2d.Disposer; +import sun.java2d.DisposerRecord; /** * Base class for all possible forms of JPEG compression in TIFF. @@ -219,12 +221,14 @@ protected void initJPEGWriter(boolean supportsStreamMetadata, if(supportsStreamMetadata) { String smName = spi.getNativeStreamMetadataFormatName(); if(smName == null || !smName.equals(STREAM_METADATA_NAME)) { + this.JPEGWriter.dispose(); this.JPEGWriter = null; } } if(this.JPEGWriter != null && supportsImageMetadata) { String imName = spi.getNativeImageMetadataFormatName(); if(imName == null || !imName.equals(IMAGE_METADATA_NAME)) { + this.JPEGWriter.dispose(); this.JPEGWriter = null; } } @@ -263,6 +267,12 @@ protected void initJPEGWriter(boolean supportsStreamMetadata, // Set the writer. this.JPEGWriter = writer; + // The JDK built-in JPEGImageWriter will self-dispose. + // So a Disposer is only needed here if it is an unknown reader. + // This is not common, so likely this will rarely be needed. + if (!(this.JPEGWriter instanceof com.sun.imageio.plugins.jpeg.JPEGImageWriter)) { + Disposer.addRecord(this, new ImageWriterDisposerRecord(this.JPEGWriter)); + } break; } @@ -435,11 +445,16 @@ public final int encode(byte[] b, int off, return compDataLength; } - @SuppressWarnings("removal") - protected void finalize() throws Throwable { - super.finalize(); - if(JPEGWriter != null) { - JPEGWriter.dispose(); - } + private static class ImageWriterDisposerRecord implements DisposerRecord { + private final ImageWriter writer; + + public ImageWriterDisposerRecord(ImageWriter writer) { + this.writer = writer; + } + + @Override + public void dispose() { + writer.dispose(); + } } } diff --git a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFJPEGDecompressor.java b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFJPEGDecompressor.java index 0b21835901b44..3c2ce90595862 100644 --- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFJPEGDecompressor.java +++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFJPEGDecompressor.java @@ -34,6 +34,8 @@ import javax.imageio.stream.ImageInputStream; import javax.imageio.plugins.tiff.BaselineTIFFTagSet; import javax.imageio.plugins.tiff.TIFFField; +import sun.java2d.Disposer; +import sun.java2d.DisposerRecord; public class TIFFJPEGDecompressor extends TIFFDecompressor { // Start of Image @@ -65,6 +67,13 @@ public void beginDecoding() { // Initialize reader to the first one. this.JPEGReader = iter.next(); + // The JDK built-in ImageReader will self-dispose. + // So a Disposer is only needed here if it is an unknown reader. + // This is not common, so likely this will rarely be needed. + if (!(this.JPEGReader instanceof com.sun.imageio.plugins.jpeg.JPEGImageReader)) { + Disposer.addRecord(this, new ImageReaderDisposerRecord(this.JPEGReader)); + } + this.JPEGParam = JPEGReader.getDefaultReadParam(); } @@ -139,9 +148,16 @@ public void decodeRaw(byte[] b, JPEGReader.read(0, JPEGParam); } - @SuppressWarnings("removal") - protected void finalize() throws Throwable { - super.finalize(); - JPEGReader.dispose(); + private static class ImageReaderDisposerRecord implements DisposerRecord { + private final ImageReader reader; + + public ImageReaderDisposerRecord(ImageReader reader) { + this.reader = reader; + } + + @Override + public void dispose() { + reader.dispose(); + } } } diff --git a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFOldJPEGDecompressor.java b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFOldJPEGDecompressor.java index bc787f9127cc7..2935ca5caf8d0 100644 --- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFOldJPEGDecompressor.java +++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFOldJPEGDecompressor.java @@ -610,8 +610,4 @@ public void decodeRaw(byte[] b, JPEGReader.read(0, JPEGParam); } - protected void finalize() throws Throwable { - super.finalize(); - JPEGReader.dispose(); - } } From be0168c65b63a17886ac80aad3e7ba40b78b5651 Mon Sep 17 00:00:00 2001 From: prrace Date: Tue, 22 Jul 2025 12:06:01 -0700 Subject: [PATCH 2/2] 8362898 --- .../sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java index c50f4ae2c419c..d5adb4e8d35c5 100644 --- a/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java +++ b/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java @@ -447,14 +447,14 @@ public final int encode(byte[] b, int off, private static class ImageWriterDisposerRecord implements DisposerRecord { private final ImageWriter writer; - + public ImageWriterDisposerRecord(ImageWriter writer) { this.writer = writer; - } - + } + @Override public void dispose() { writer.dispose(); - } + } } }