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>
This commit is contained in:
@@ -303,8 +303,21 @@ void Primitive2dXmlDump::decomposeAndWrite(
|
|||||||
basegfx::B2DPoint aFocusAttribute = rSvgRadialGradientPrimitive2D.getFocal();
|
basegfx::B2DPoint aFocusAttribute = rSvgRadialGradientPrimitive2D.getFocal();
|
||||||
|
|
||||||
rWriter.attribute("radius", OString::number(rSvgRadialGradientPrimitive2D.getRadius()));
|
rWriter.attribute("radius", OString::number(rSvgRadialGradientPrimitive2D.getRadius()));
|
||||||
rWriter.attribute("x", aFocusAttribute.getX());
|
rWriter.attribute("focusx", aFocusAttribute.getX());
|
||||||
rWriter.attribute("y", aFocusAttribute.getY());
|
rWriter.attribute("focusy", aFocusAttribute.getY());
|
||||||
|
|
||||||
|
rWriter.endElement();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PRIMITIVE2D_ID_SVGLINEARGRADIENTPRIMITIVE2D:
|
||||||
|
{
|
||||||
|
const SvgLinearGradientPrimitive2D& rSvgLinearGradientPrimitive2D = dynamic_cast<const SvgLinearGradientPrimitive2D&>(*pBasePrimitive);
|
||||||
|
rWriter.startElement("svglineargradient");
|
||||||
|
basegfx::B2DPoint aEndAttribute = rSvgLinearGradientPrimitive2D.getEnd();
|
||||||
|
|
||||||
|
rWriter.attribute("endx", aEndAttribute.getX());
|
||||||
|
rWriter.attribute("endy", aEndAttribute.getY());
|
||||||
|
|
||||||
rWriter.endElement();
|
rWriter.endElement();
|
||||||
}
|
}
|
||||||
|
@@ -242,6 +242,10 @@ namespace svgio
|
|||||||
// #121221# Defines if evtl. an empty array *is* set
|
// #121221# Defines if evtl. an empty array *is* set
|
||||||
bool mbStrokeDasharraySet : 1;
|
bool mbStrokeDasharraySet : 1;
|
||||||
|
|
||||||
|
// tdf#94765 Check id references in gradient/pattern getters
|
||||||
|
OUString maNodeFillURL;
|
||||||
|
OUString maNodeStrokeURL;
|
||||||
|
|
||||||
/// internal helpers
|
/// internal helpers
|
||||||
void add_fillGradient(
|
void add_fillGradient(
|
||||||
const basegfx::B2DPolyPolygon& rPath,
|
const basegfx::B2DPolyPolygon& rPath,
|
||||||
@@ -276,6 +280,7 @@ namespace svgio
|
|||||||
drawinglayer::primitive2d::Primitive2DContainer& rTarget,
|
drawinglayer::primitive2d::Primitive2DContainer& rTarget,
|
||||||
const basegfx::utils::PointIndexSet* pHelpPointIndices) const;
|
const basegfx::utils::PointIndexSet* pHelpPointIndices) const;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// local attribute scanner
|
/// local attribute scanner
|
||||||
void parseStyleAttribute(SVGToken aSVGToken, const OUString& rContent,
|
void parseStyleAttribute(SVGToken aSVGToken, const OUString& rContent,
|
||||||
|
@@ -64,6 +64,7 @@ class Test : public test::BootstrapFixture, public XmlTestTools
|
|||||||
void testTdf99994();
|
void testTdf99994();
|
||||||
void testTdf99115();
|
void testTdf99115();
|
||||||
void testTdf101237();
|
void testTdf101237();
|
||||||
|
void testTdf94765();
|
||||||
void testBehaviourWhenWidthAndHeightIsOrIsNotSet();
|
void testBehaviourWhenWidthAndHeightIsOrIsNotSet();
|
||||||
|
|
||||||
Primitive2DSequence parseSvg(const OUString& aSource);
|
Primitive2DSequence parseSvg(const OUString& aSource);
|
||||||
@@ -95,6 +96,7 @@ public:
|
|||||||
CPPUNIT_TEST(testTdf99994);
|
CPPUNIT_TEST(testTdf99994);
|
||||||
CPPUNIT_TEST(testTdf99115);
|
CPPUNIT_TEST(testTdf99115);
|
||||||
CPPUNIT_TEST(testTdf101237);
|
CPPUNIT_TEST(testTdf101237);
|
||||||
|
CPPUNIT_TEST(testTdf94765);
|
||||||
CPPUNIT_TEST(testBehaviourWhenWidthAndHeightIsOrIsNotSet);
|
CPPUNIT_TEST(testBehaviourWhenWidthAndHeightIsOrIsNotSet);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
};
|
};
|
||||||
@@ -390,8 +392,8 @@ void Test::testTdf97542_2()
|
|||||||
|
|
||||||
CPPUNIT_ASSERT (pDocument);
|
CPPUNIT_ASSERT (pDocument);
|
||||||
|
|
||||||
assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "x", "1");
|
assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "focusx", "1");
|
||||||
assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "y", "1");
|
assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "focusy", "1");
|
||||||
assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "radius", "3");
|
assertXPath(pDocument, "/primitive2D/transform/objectinfo/svgradialgradient[1]", "radius", "3");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,6 +678,23 @@ void Test::testTdf101237()
|
|||||||
assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "width", "5");
|
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()
|
void Test::testBehaviourWhenWidthAndHeightIsOrIsNotSet()
|
||||||
{
|
{
|
||||||
// This test checks the behaviour when width and height attributes
|
// This test checks the behaviour when width and height attributes
|
||||||
|
14
svgio/qa/cppunit/data/tdf94765.svg
Normal file
14
svgio/qa/cppunit/data/tdf94765.svg
Normal file
@@ -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>
|
After Width: | Height: | Size: 792 B |
@@ -1336,19 +1336,7 @@ namespace svgio
|
|||||||
}
|
}
|
||||||
else if(!aURL.isEmpty())
|
else if(!aURL.isEmpty())
|
||||||
{
|
{
|
||||||
const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(aURL);
|
maNodeFillURL = 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1393,19 +1381,7 @@ namespace svgio
|
|||||||
}
|
}
|
||||||
else if(!aURL.isEmpty())
|
else if(!aURL.isEmpty())
|
||||||
{
|
{
|
||||||
const SvgNode* pNode = mrOwner.getDocument().findSvgNodeById(aURL);
|
maNodeStrokeURL = 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2112,6 +2088,18 @@ namespace svgio
|
|||||||
}
|
}
|
||||||
else if (!maFill.isSet() && !mpSvgPatternNodeFill)
|
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();
|
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
|
||||||
|
|
||||||
if (pSvgStyleAttributes && maResolvingParent[2] < nStyleDepthLimit)
|
if (pSvgStyleAttributes && maResolvingParent[2] < nStyleDepthLimit)
|
||||||
@@ -2134,6 +2122,19 @@ namespace svgio
|
|||||||
}
|
}
|
||||||
else if (!maStroke.isSet() && !mpSvgPatternNodeStroke)
|
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();
|
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
|
||||||
|
|
||||||
if (pSvgStyleAttributes && maResolvingParent[3] < nStyleDepthLimit)
|
if (pSvgStyleAttributes && maResolvingParent[3] < nStyleDepthLimit)
|
||||||
@@ -2156,6 +2157,19 @@ namespace svgio
|
|||||||
}
|
}
|
||||||
else if (!maFill.isSet() && !mpSvgGradientNodeFill)
|
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();
|
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
|
||||||
|
|
||||||
if (pSvgStyleAttributes && maResolvingParent[4] < nStyleDepthLimit)
|
if (pSvgStyleAttributes && maResolvingParent[4] < nStyleDepthLimit)
|
||||||
@@ -2178,6 +2192,19 @@ namespace svgio
|
|||||||
}
|
}
|
||||||
else if (!maStroke.isSet() && !mpSvgGradientNodeStroke)
|
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();
|
const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle();
|
||||||
|
|
||||||
if (pSvgStyleAttributes && maResolvingParent[5] < nStyleDepthLimit)
|
if (pSvgStyleAttributes && maResolvingParent[5] < nStyleDepthLimit)
|
||||||
|
Reference in New Issue
Block a user