XGC-112: TIFF resolution wrong on Java 10
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/commons/trunk@1833700 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java b/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java
index e800f47..801ab61 100644
--- a/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java
+++ b/src/main/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriter.java
@@ -46,8 +46,12 @@
private static final String SUN_TIFF_NATIVE_FORMAT
= "com_sun_media_imageio_plugins_tiff_image_1.0";
+ private static final String JAVA_TIFF_NATIVE_FORMAT
+ = "javax_imageio_tiff_image_1.0";
private static final String SUN_TIFF_NATIVE_STREAM_FORMAT
= "com_sun_media_imageio_plugins_tiff_stream_1.0";
+ private static final String JAVA_TIFF_NATIVE_STREAM_FORMAT
+ = "javax_imageio_tiff_stream_1.0";
/**
* Main constructor.
@@ -65,14 +69,12 @@
//it doesn't work properly through the standard metadata. Haven't figured out why
//that happens.
if (params.getResolution() != null) {
- if (SUN_TIFF_NATIVE_FORMAT.equals(meta.getNativeMetadataFormatName())) {
- //IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(SUN_TIFF_NATIVE_FORMAT);
- IIOMetadataNode root = new IIOMetadataNode(SUN_TIFF_NATIVE_FORMAT);
+ if (SUN_TIFF_NATIVE_FORMAT.equals(meta.getNativeMetadataFormatName())
+ || JAVA_TIFF_NATIVE_FORMAT.equals(meta.getNativeMetadataFormatName())) {
+ IIOMetadataNode root = new IIOMetadataNode(meta.getNativeMetadataFormatName());
IIOMetadataNode ifd = getChildNode(root, "TIFFIFD");
if (ifd == null) {
ifd = new IIOMetadataNode("TIFFIFD");
- ifd.setAttribute("tagSets",
- "com.sun.media.imageio.plugins.tiff.BaselineTIFFTagSet");
root.appendChild(ifd);
}
ifd.appendChild(createResolutionUnitField(params));
@@ -85,7 +87,7 @@
"RowsPerStrip", Integer.toString(rows)));
try {
- meta.mergeTree(SUN_TIFF_NATIVE_FORMAT, root);
+ meta.mergeTree(meta.getNativeMetadataFormatName(), root);
} catch (IIOInvalidTreeException e) {
throw new RuntimeException("Cannot update image metadata: "
+ e.getMessage(), e);
@@ -221,20 +223,27 @@
//Try changing the Byte Order
IIOMetadata streamMetadata = writer.getDefaultStreamMetadata(writeParam);
- Set<String> names = new java.util.HashSet<String>(
- Arrays.asList(streamMetadata.getMetadataFormatNames()));
- if (names.contains(SUN_TIFF_NATIVE_STREAM_FORMAT)) {
- Node root = streamMetadata.getAsTree(SUN_TIFF_NATIVE_STREAM_FORMAT);
+ if (streamMetadata != null) {
+ Set<String> names = new java.util.HashSet<String>(
+ Arrays.asList(streamMetadata.getMetadataFormatNames()));
+ setFromTree(names, streamMetadata, endian, SUN_TIFF_NATIVE_STREAM_FORMAT);
+ setFromTree(names, streamMetadata, endian, JAVA_TIFF_NATIVE_STREAM_FORMAT);
+ }
+ return streamMetadata;
+ }
+
+ private void setFromTree(Set<String> names, IIOMetadata streamMetadata, Endianness endian, String format) {
+ if (names.contains(format)) {
+ Node root = streamMetadata.getAsTree(format);
root.getFirstChild().getAttributes().item(0).setNodeValue(endian.toString());
try {
- streamMetadata.setFromTree(SUN_TIFF_NATIVE_STREAM_FORMAT, root);
+ streamMetadata.setFromTree(format, root);
} catch (IIOInvalidTreeException e) {
//This should not happen since we check if the format is supported.
throw new IllegalStateException(
"Could not replace TIFF stream metadata: " + e.getMessage(), e);
}
}
- return streamMetadata;
}
}
diff --git a/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java b/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java
index a825988..95287d4 100644
--- a/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java
+++ b/src/test/java/org/apache/xmlgraphics/image/writer/imageio/ImageIOTIFFImageWriterTestCase.java
@@ -27,9 +27,14 @@
import java.awt.image.BufferedImage;
import java.io.IOException;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.metadata.IIOMetadataNode;
+
import org.junit.Assert;
import org.junit.Test;
+import org.w3c.dom.Node;
+
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.xmlgraphics.image.loader.ImageSize;
@@ -126,7 +131,7 @@
ByteArrayOutputStream getByteArrayOutput();
}
- private class TestImageWriter implements ImageWriterHelper {
+ private static class TestImageWriter implements ImageWriterHelper {
private ImageWriter writer;
private ByteArrayOutputStream baout;
@@ -149,7 +154,7 @@
}
}
- private class TestMultiImageWriter implements ImageWriterHelper {
+ private static class TestMultiImageWriter implements ImageWriterHelper {
private MultiImageWriter writer;
private ByteArrayOutputStream baout;
@@ -176,4 +181,32 @@
}
}
+ @Test
+ public void testNewMetadataFormat() {
+ ImageWriterParams params = new ImageWriterParams();
+ params.setResolution(92);
+ MyIIOMetadata metadata = new MyIIOMetadata();
+ new ImageIOTIFFImageWriter().updateMetadata(null, metadata, params);
+ Assert.assertEquals(metadata.mergeNode, "javax_imageio_tiff_image_1.0");
+ }
+
+ static class MyIIOMetadata extends IIOMetadata {
+ String mergeNode;
+ MyIIOMetadata() {
+ super(true, "javax_imageio_tiff_image_1.0", null, null, null);
+ }
+ public boolean isReadOnly() {
+ return false;
+ }
+ public Node getAsTree(String formatName) {
+ IIOMetadataNode node = new IIOMetadataNode();
+ node.appendChild(new IIOMetadataNode("Dimension"));
+ return node;
+ }
+ public void mergeTree(String formatName, Node root) {
+ mergeNode = root.getNodeName();
+ }
+ public void reset() {
+ }
+ };
}