From e956176872325a02bbda4869f28db485285ff51c Mon Sep 17 00:00:00 2001 From: Oliver Schmidtmer Date: Thu, 30 Jan 2020 18:38:10 +0100 Subject: [PATCH] #518 Fallbacks for aspect ratio, if only one dimension is given --- .../imageio/plugins/svg/SVGImageReader.java | 41 +++++++++++++++---- .../plugins/svg/SVGImageReaderTest.java | 6 ++- .../src/test/resources/svg/sizes/h50_1to2.svg | 7 ++++ .../src/test/resources/svg/sizes/w50_1to2.svg | 7 ++++ .../src/test/resources/svg/sizes/w50h50.svg | 7 ++++ .../test/resources/svg/sizes/w50noview.svg | 7 ++++ 6 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 imageio/imageio-batik/src/test/resources/svg/sizes/h50_1to2.svg create mode 100644 imageio/imageio-batik/src/test/resources/svg/sizes/w50_1to2.svg create mode 100644 imageio/imageio-batik/src/test/resources/svg/sizes/w50h50.svg create mode 100644 imageio/imageio-batik/src/test/resources/svg/sizes/w50noview.svg diff --git a/imageio/imageio-batik/src/main/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReader.java b/imageio/imageio-batik/src/main/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReader.java index 9f13179e..c55012de 100755 --- a/imageio/imageio-batik/src/main/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReader.java +++ b/imageio/imageio-batik/src/main/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReader.java @@ -330,25 +330,50 @@ public class SVGImageReader extends ImageReaderBase { SVGSVGElement rootElement = svgDoc.getRootElement(); // get the 'width' and 'height' attributes of the SVG document + UnitProcessor.Context uctx + = UnitProcessor.createContext(ctx, rootElement); String widthStr = rootElement.getAttributeNS(null, SVGConstants.SVG_WIDTH_ATTRIBUTE); String heightStr = rootElement.getAttributeNS(null, SVGConstants.SVG_HEIGHT_ATTRIBUTE); - if (!StringUtil.isEmpty(widthStr) && !StringUtil.isEmpty(heightStr)) { - UnitProcessor.Context uctx - = UnitProcessor.createContext(ctx, rootElement); + if (!StringUtil.isEmpty(widthStr)) { defaultWidth = UnitProcessor.svgToUserSpace(widthStr, SVGConstants.SVG_WIDTH_ATTRIBUTE, UnitProcessor.HORIZONTAL_LENGTH, uctx); + } + if(!StringUtil.isEmpty(heightStr)){ defaultHeight = UnitProcessor.svgToUserSpace(heightStr, SVGConstants.SVG_HEIGHT_ATTRIBUTE, UnitProcessor.VERTICAL_LENGTH, uctx); } - else { + + boolean hasWidth = defaultWidth > 0.0; + boolean hasHeight = defaultHeight > 0.0; + + if (!hasWidth || !hasHeight) { String viewBoxStr = rootElement.getAttributeNS (null, SVGConstants.SVG_VIEW_BOX_ATTRIBUTE); if (viewBoxStr.length() != 0) { float[] rect = ViewBox.parseViewBoxAttribute(rootElement, viewBoxStr, null); - defaultWidth = rect[2]; - defaultHeight = rect[3]; + // if one dimension is given, calculate other by aspect ratio in viewBox + // or use viewBox if no dimension is given + if (hasWidth) { + defaultHeight = defaultWidth * rect[3] / rect[2]; + } + else if (hasHeight) { + defaultWidth = defaultHeight * rect[2] / rect[3]; + } + else { + defaultWidth = rect[2]; + defaultHeight = rect[3]; + } } else { - defaultWidth = 200; - defaultHeight = 200; + if (hasHeight) { + defaultWidth = defaultHeight; + } + else if (hasWidth) { + defaultHeight = defaultWidth; + } + else { + // fallback to batik default sizes + defaultWidth = 400; + defaultHeight = 400; + } } } diff --git a/imageio/imageio-batik/src/test/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReaderTest.java b/imageio/imageio-batik/src/test/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReaderTest.java index 4860bd0f..21c30f3b 100755 --- a/imageio/imageio-batik/src/test/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReaderTest.java +++ b/imageio/imageio-batik/src/test/java/com/twelvemonkeys/imageio/plugins/svg/SVGImageReaderTest.java @@ -74,7 +74,11 @@ public class SVGImageReaderTest extends ImageReaderAbstractTest new TestData(getClassLoaderResource("/svg/batikLogo.svg"), new Dimension(450, 500)), new TestData(getClassLoaderResource("/svg/red-square.svg"), new Dimension(100, 100)), new TestData(getClassLoaderResource("/svg/blue-square.svg"), new Dimension(100, 100)), - new TestData(getClassLoaderResource("/svg/Android_robot.svg"), new Dimension(294, 345)) + new TestData(getClassLoaderResource("/svg/Android_robot.svg"), new Dimension(294, 345)), + new TestData(getClassLoaderResource("/svg/sizes/w50h50.svg"), new Dimension(50, 50)), + new TestData(getClassLoaderResource("/svg/sizes/w50_1to2.svg"), new Dimension(25, 50)), + new TestData(getClassLoaderResource("/svg/sizes/h50_1to2.svg"), new Dimension(50, 100)), + new TestData(getClassLoaderResource("/svg/sizes/w50noview.svg"), new Dimension(50, 50)) ); } diff --git a/imageio/imageio-batik/src/test/resources/svg/sizes/h50_1to2.svg b/imageio/imageio-batik/src/test/resources/svg/sizes/h50_1to2.svg new file mode 100644 index 00000000..2f29bfb1 --- /dev/null +++ b/imageio/imageio-batik/src/test/resources/svg/sizes/h50_1to2.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/imageio/imageio-batik/src/test/resources/svg/sizes/w50_1to2.svg b/imageio/imageio-batik/src/test/resources/svg/sizes/w50_1to2.svg new file mode 100644 index 00000000..0b99c157 --- /dev/null +++ b/imageio/imageio-batik/src/test/resources/svg/sizes/w50_1to2.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/imageio/imageio-batik/src/test/resources/svg/sizes/w50h50.svg b/imageio/imageio-batik/src/test/resources/svg/sizes/w50h50.svg new file mode 100644 index 00000000..bb34679d --- /dev/null +++ b/imageio/imageio-batik/src/test/resources/svg/sizes/w50h50.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/imageio/imageio-batik/src/test/resources/svg/sizes/w50noview.svg b/imageio/imageio-batik/src/test/resources/svg/sizes/w50noview.svg new file mode 100644 index 00000000..888927a4 --- /dev/null +++ b/imageio/imageio-batik/src/test/resources/svg/sizes/w50noview.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file