summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2019-09-19 11:45:20 +0200
committerXisco FaulĂ­ <xiscofauli@libreoffice.org>2019-09-19 13:51:57 +0200
commitab1479956568b0d9a6022133cf651f846293aa46 (patch)
treefa4ab602b7d395e732d60df2ecd13eab69b827d7 /svgio
parentab825c665c1ee509769bdaf0ae95fc111a357fc6 (diff)
tdf#94765: SVGIO: Look for gradient/pattern ids once the file...
... is completely parsed it might happen the element's id the url points to hasn't been parsed yet Change-Id: Ia92c9188de5d23f2f992846aa91f3f936aeefacb Reviewed-on: https://gerrit.libreoffice.org/79118 Tested-by: Jenkins Reviewed-by: Xisco FaulĂ­ <xiscofauli@libreoffice.org>
Diffstat (limited to 'svgio')
-rw-r--r--svgio/inc/svgstyleattributes.hxx5
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx23
-rw-r--r--svgio/qa/cppunit/data/tdf94765.svg14
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx79
4 files changed, 93 insertions, 28 deletions
diff --git a/svgio/inc/svgstyleattributes.hxx b/svgio/inc/svgstyleattributes.hxx
index 91eb882135fc..5c89295dec0a 100644
--- a/svgio/inc/svgstyleattributes.hxx
+++ b/svgio/inc/svgstyleattributes.hxx
@@ -242,6 +242,10 @@ namespace svgio
// #121221# Defines if evtl. an empty array *is* set
bool mbStrokeDasharraySet : 1;
+ // tdf#94765 Check id references in gradient/pattern getters
+ OUString maNodeFillURL;
+ OUString maNodeStrokeURL;
+
/// internal helpers
void add_fillGradient(
const basegfx::B2DPolyPolygon& rPath,
@@ -276,6 +280,7 @@ namespace svgio
drawinglayer::primitive2d::Primitive2DContainer& rTarget,
const basegfx::utils::PointIndexSet* pHelpPointIndices) const;
+
public:
/// local attribute scanner
void parseStyleAttribute(SVGToken aSVGToken, const OUString& rContent,
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx
index 4fe57b9adc3d..ea510cdbe1a5 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -64,6 +64,7 @@ class Test : public test::BootstrapFixture, public XmlTestTools
void testTdf99994();
void testTdf99115();
void testTdf101237();
+ void testTdf94765();
void testBehaviourWhenWidthAndHeightIsOrIsNotSet();
Primitive2DSequence parseSvg(const OUString& aSource);
@@ -95,6 +96,7 @@ public:
CPPUNIT_TEST(testTdf99994);
CPPUNIT_TEST(testTdf99115);
CPPUNIT_TEST(testTdf101237);
+ CPPUNIT_TEST(testTdf94765);
CPPUNIT_TEST(testBehaviourWhenWidthAndHeightIsOrIsNotSet);
CPPUNIT_TEST_SUITE_END();
};
@@ -390,8 +392,8 @@ void Test::testTdf97542_2()
CPPUNIT_ASSERT (pDocument);
- assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "x", "1");
- assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "y", "1");
+ assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "focusx", "1");
+ assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "focusy", "1");
assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "radius", "3");
}
@@ -676,6 +678,23 @@ void Test::testTdf101237()
assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "width", "5");
}
+void Test::testTdf94765()
+{
+ Primitive2DSequence aSequenceTdf94765 = parseSvg("/svgio/qa/cppunit/data/tdf94765.svg");
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequenceTdf94765.getLength()));
+
+ drawinglayer::tools::Primitive2dXmlDump dumper;
+ xmlDocPtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer<Primitive2DContainer>(aSequenceTdf94765));
+
+ CPPUNIT_ASSERT (pDocument);
+
+ //Check that both rectangles use the gradient as fill
+ assertXPath(pDocument, "/primitive2D/transform/transform/svglineargradient[1]", "endx", "2");
+ assertXPath(pDocument, "/primitive2D/transform/transform/svglineargradient[1]", "endy", "1");
+ assertXPath(pDocument, "/primitive2D/transform/transform/svglineargradient[2]", "endx", "0");
+ assertXPath(pDocument, "/primitive2D/transform/transform/svglineargradient[2]", "endy", "0");
+}
+
void Test::testBehaviourWhenWidthAndHeightIsOrIsNotSet()
{
// This test checks the behaviour when width and height attributes
diff --git a/svgio/qa/cppunit/data/tdf94765.svg b/svgio/qa/cppunit/data/tdf94765.svg
new file mode 100644
index 000000000000..009bfc8ed1e4
--- /dev/null
+++ b/svgio/qa/cppunit/data/tdf94765.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="841.9px" height="595.3px" viewBox="0 0 841.9 595.3" style="enable-background:new 0 0 841.9 595.3;" xml:space="preserve"
+ >
+<style type="text/css">
+ .st1{fill:url(#SVGID_1_);stroke:#000000;stroke-miterlimit:10;}
+</style>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="432.1587" y1="340.3492" x2="770.254" y2="340.3492">
+ <stop offset="0" style="stop-color:#DBDBDB"/>
+ <stop offset="1" style="stop-color:#737373"/>
+</linearGradient>
+<rect x="70.3" y="48.3" fill="url(#SVGID_1_)" width="338.1" height="252.4"/>
+<rect x="432.2" y="214.2" class="st1" width="338.1" height="252.4"/>
+</svg>
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx
index b7f571478ee0..5cda5995e82f 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1336,19 +1336,7 @@ namespace svgio
}
else if(!aURL.isEmpty())
{
- const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(aURL);
-
- if(pNode)
- {
- if(SVGTokenLinearGradient == pNode->getType() || SVGTokenRadialGradient == pNode->getType())
- {
- mpSvgGradientNodeFill = static_cast< const SvgGradientNode* >(pNode);
- }
- else if(SVGTokenPattern == pNode->getType())
- {
- mpSvgPatternNodeFill = static_cast< const SvgPatternNode* >(pNode);
- }
- }
+ maNodeFillURL = aURL;
}
break;
}
@@ -1393,19 +1381,7 @@ namespace svgio
}
else if(!aURL.isEmpty())
{
- const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(aURL);
-
- if(pNode)
- {
- if(SVGTokenLinearGradient == pNode->getType() || SVGTokenRadialGradient == pNode->getType())
- {
- mpSvgGradientNodeStroke = static_cast< const SvgGradientNode* >(pNode);
- }
- else if(SVGTokenPattern == pNode->getType())
- {
- mpSvgPatternNodeStroke = static_cast< const SvgPatternNode* >(pNode);
- }
- }
+ maNodeStrokeURL = aURL;
}
break;
}
@@ -2112,6 +2088,18 @@ namespace svgio
}
else if (!maFill.isSet() && !mpSvgPatternNodeFill)
{
+ if (!maNodeFillURL.isEmpty())
+ {
+ const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(maNodeFillURL);
+
+ if(pNode)
+ {
+ if(SVGTokenLinearGradient == pNode->getType() || SVGTokenRadialGradient == pNode->getType())
+ {
+ return static_cast< const SvgGradientNode* >(pNode);
+ }
+ }
+ }
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
if (pSvgStyleAttributes && maResolvingParent[2] < nStyleDepthLimit)
@@ -2134,6 +2122,19 @@ namespace svgio
}
else if (!maStroke.isSet() && !mpSvgPatternNodeStroke)
{
+ if(!maNodeStrokeURL.isEmpty())
+ {
+ const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(maNodeStrokeURL);
+
+ if(pNode)
+ {
+ if(SVGTokenLinearGradient == pNode->getType() || SVGTokenRadialGradient == pNode->getType())
+ {
+ return static_cast< const SvgGradientNode* >(pNode);
+ }
+ }
+ }
+
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
if (pSvgStyleAttributes && maResolvingParent[3] < nStyleDepthLimit)
@@ -2156,6 +2157,19 @@ namespace svgio
}
else if (!maFill.isSet() && !mpSvgGradientNodeFill)
{
+ if (!maNodeFillURL.isEmpty())
+ {
+ const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(maNodeFillURL);
+
+ if(pNode)
+ {
+ if(SVGTokenPattern == pNode->getType())
+ {
+ return static_cast< const SvgPatternNode* >(pNode);
+ }
+ }
+ }
+
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
if (pSvgStyleAttributes && maResolvingParent[4] < nStyleDepthLimit)
@@ -2178,6 +2192,19 @@ namespace svgio
}
else if (!maStroke.isSet() && !mpSvgGradientNodeStroke)
{
+ if(!maNodeStrokeURL.isEmpty())
+ {
+ const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(maNodeStrokeURL);
+
+ if(pNode)
+ {
+ if(SVGTokenPattern == pNode->getType())
+ {
+ return static_cast< const SvgPatternNode* >(pNode);
+ }
+ }
+ }
+
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
if (pSvgStyleAttributes && maResolvingParent[5] < nStyleDepthLimit)