summaryrefslogtreecommitdiff
path: root/svgio/qa
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2018-05-13 20:21:17 +0900
committerTomaž Vajngerl <quikee@gmail.com>2018-05-13 15:28:27 +0200
commit7e6dac4edce063a766497ecb498e293bf4e16e66 (patch)
treeffbe7d1dd9f689877e3668c4015838bde8446e4a /svgio/qa
parent32cad25f949eabea52e1cf7962ba18a3edd1c647 (diff)
svgio: fix rendering when the width/height isn't present in SVG
The general size of the image should be the same when width/height attributes are present. It is very wrong to assume the size of the image is the area covered by all the primitives in the image. Change-Id: I56f241e84dee37796f9804ce2569c4eb416e83a0 Reviewed-on: https://gerrit.libreoffice.org/54191 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'svgio/qa')
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx66
-rw-r--r--svgio/qa/cppunit/data/Drawing_NoWidthHeight.svg12
-rw-r--r--svgio/qa/cppunit/data/Drawing_WithWidthHeight.svg14
3 files changed, 91 insertions, 1 deletions
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx
index a83ec4aae189..6b71a0dfeb7a 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -27,11 +27,13 @@
namespace
{
+using namespace css;
using namespace css::uno;
using namespace css::io;
using namespace css::graphic;
using drawinglayer::primitive2d::Primitive2DSequence;
using drawinglayer::primitive2d::Primitive2DContainer;
+using drawinglayer::primitive2d::Primitive2DReference;
class Test : public test::BootstrapFixture, public XmlTestTools
{
@@ -61,6 +63,7 @@ class Test : public test::BootstrapFixture, public XmlTestTools
void testMaskText();
void testTdf99994();
void testTdf101237();
+ void testBehaviourWhenWidthAndHeightIsOrIsNotSet();
Primitive2DSequence parseSvg(const OUString& aSource);
@@ -90,6 +93,7 @@ public:
CPPUNIT_TEST(testMaskText);
CPPUNIT_TEST(testTdf99994);
CPPUNIT_TEST(testTdf101237);
+ CPPUNIT_TEST(testBehaviourWhenWidthAndHeightIsOrIsNotSet);
CPPUNIT_TEST_SUITE_END();
};
@@ -132,7 +136,6 @@ void Test::checkRectPrimitive(Primitive2DSequence const & rPrimitive)
}
-
bool arePrimitive2DSequencesEqual(const Primitive2DSequence& rA, const Primitive2DSequence& rB)
{
const sal_Int32 nCount(rA.getLength());
@@ -629,7 +632,68 @@ void Test::testTdf101237()
assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "color", "#ff0000");
assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "color", "#000000");
assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "width", "5");
+}
+
+void Test::testBehaviourWhenWidthAndHeightIsOrIsNotSet()
+{
+ // This test checks the behaviour when width and height attributes
+ // are and are not set. In both cases the result must be the same,
+ // however if the width / height are set, then the size of the image
+ // is enforced, but this isn't really possible in LibreOffice (or
+ // maybe we could lock the size in this case).
+ // The behaviour in browsers is that when a SVG image has width / height
+ // attributes set, then the image is shown with that size, but if it
+ // isn't set then it is shown as scalable image which is the size of
+ // the container.
+
+ {
+ Primitive2DSequence aSequence = parseSvg("svgio/qa/cppunit/data/Drawing_WithWidthHeight.svg");
+ CPPUNIT_ASSERT(aSequence.hasElements());
+
+ geometry::RealRectangle2D aRealRect;
+ basegfx::B2DRange aRange;
+ uno::Sequence<beans::PropertyValue> aViewParameters;
+
+ for (Primitive2DReference const & xReference : aSequence)
+ {
+ if (xReference.is())
+ {
+ aRealRect = xReference->getRange(aViewParameters);
+ aRange.expand(basegfx::B2DRange(aRealRect.X1, aRealRect.Y1, aRealRect.X2, aRealRect.Y2));
+ }
+ }
+
+ double fWidth = (aRange.getWidth() / 2540.0) * 96.0;
+ double fHeight = (aRange.getHeight() / 2540.0) * 96.0;
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(11.0, fWidth, 1E-12);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(11.0, fHeight, 1E-12);
+ }
+
+ {
+ Primitive2DSequence aSequence = parseSvg("svgio/qa/cppunit/data/Drawing_NoWidthHeight.svg");
+ CPPUNIT_ASSERT(aSequence.hasElements());
+
+ geometry::RealRectangle2D aRealRect;
+ basegfx::B2DRange aRange;
+ uno::Sequence<beans::PropertyValue> aViewParameters;
+
+ for (Primitive2DReference const & xReference : aSequence)
+ {
+ if (xReference.is())
+ {
+ aRealRect = xReference->getRange(aViewParameters);
+ aRange.expand(basegfx::B2DRange(aRealRect.X1, aRealRect.Y1, aRealRect.X2, aRealRect.Y2));
+ }
+ }
+
+ double fWidth = (aRange.getWidth() / 2540.0) * 96.0;
+ double fHeight = (aRange.getHeight() / 2540.0) * 96.0;
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(11.0, fWidth, 1E-12);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(11.0, fHeight, 1E-12);
+ }
}
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
diff --git a/svgio/qa/cppunit/data/Drawing_NoWidthHeight.svg b/svgio/qa/cppunit/data/Drawing_NoWidthHeight.svg
new file mode 100644
index 000000000000..59520d6ab9bc
--- /dev/null
+++ b/svgio/qa/cppunit/data/Drawing_NoWidthHeight.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ viewBox="0 0 10 10">
+ <rect
+ width="3"
+ height="3"
+ x="6"
+ y="6"
+ style="fill:#008000;stroke-width:0.15288568" />
+</svg>
diff --git a/svgio/qa/cppunit/data/Drawing_WithWidthHeight.svg b/svgio/qa/cppunit/data/Drawing_WithWidthHeight.svg
new file mode 100644
index 000000000000..bc5afb553e43
--- /dev/null
+++ b/svgio/qa/cppunit/data/Drawing_WithWidthHeight.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns="http://www.w3.org/2000/svg"
+ version="1.1"
+ viewBox="0 0 10 10"
+ height="10"
+ width="10">
+ <rect
+ width="3"
+ height="3"
+ x="6"
+ y="6"
+ style="fill:#008000;stroke-width:0.15288568" />
+</svg>