svgio/qa/cppunit/SvgImportTest.cxx | 32 ++++++++++++++++++++++++++ svgio/qa/cppunit/data/tdf97542_1.svg | 15 ++++++++++++ svgio/qa/cppunit/data/tdf97542_2.svg | 15 ++++++++++++ svgio/source/svgreader/svgstyleattributes.cxx | 15 +++++++----- test/source/primitive2dxmldump.cxx | 28 +++++++++++++++++++++- 5 files changed, 98 insertions(+), 7 deletions(-)
New commits: commit b6a62f07557fe4ae0931e0f3e0f306d2f69b116b Author: Xisco Fauli <aniste...@gmail.com> Date: Fri Feb 5 00:25:58 2016 +0100 tdf#97542: SVGIO: First check the current fill attribute Differenciate when gradient is defined in the text element or in its parents Add unit tests Change-Id: I85b09f72fbb1a3c8d2fa7350b4396b5bf924277f Reviewed-on: https://gerrit.libreoffice.org/22131 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Jochen Nitschke <j.nitschke+loger...@ok.de> Reviewed-by: Xisco Faulà <aniste...@gmail.com> diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx index 50a7ef7..9214223 100644 --- a/svgio/qa/cppunit/SvgImportTest.cxx +++ b/svgio/qa/cppunit/SvgImportTest.cxx @@ -45,6 +45,8 @@ class Test : public test::BootstrapFixture, public XmlTestTools void testTdf45771(); void testTdf85770(); void testTdf79163(); + void testTdf97542_1(); + void testTdf97542_2(); Primitive2DSequence parseSvg(const char* aSource); @@ -60,6 +62,8 @@ public: CPPUNIT_TEST(testTdf45771); CPPUNIT_TEST(testTdf85770); CPPUNIT_TEST(testTdf79163); + CPPUNIT_TEST(testTdf97542_1); + CPPUNIT_TEST(testTdf97542_2); CPPUNIT_TEST_SUITE_END(); }; @@ -237,6 +241,34 @@ void Test::testTdf79163() assertXPath(pDocument, "/primitive2D/transform/mask/unifiedtransparence", "transparence", "0"); } +void Test::testTdf97542_1() +{ + Primitive2DSequence aSequenceTdf97542_1 = parseSvg("/svgio/qa/cppunit/data/tdf97542_1.svg"); + CPPUNIT_ASSERT_EQUAL(1, (int)aSequenceTdf97542_1.getLength()); + + Primitive2dXmlDump dumper; + xmlDocPtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer<Primitive2DContainer>(aSequenceTdf97542_1)); + + CPPUNIT_ASSERT (pDocument); + + assertXPath(pDocument, "/primitive2D/transform/objectinfo/textsimpleportion", "fontcolor", "#ffff00"); +} + +void Test::testTdf97542_2() +{ + Primitive2DSequence aSequenceTdf97542_2 = parseSvg("/svgio/qa/cppunit/data/tdf97542_2.svg"); + CPPUNIT_ASSERT_EQUAL(1, (int)aSequenceTdf97542_2.getLength()); + + Primitive2dXmlDump dumper; + xmlDocPtr pDocument = dumper.dumpAndParse(comphelper::sequenceToContainer<Primitive2DContainer>(aSequenceTdf97542_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]", "radius", "3"); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); } diff --git a/svgio/qa/cppunit/data/tdf97542_1.svg b/svgio/qa/cppunit/data/tdf97542_1.svg new file mode 100644 index 0000000..328bd97 --- /dev/null +++ b/svgio/qa/cppunit/data/tdf97542_1.svg @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<svg width="200" height="50" xmlns="http://www.w3.org/2000/svg"> + <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ --> + <defs> + <radialGradient id="svg_2" cx="0.5" cy="0.5" r="0.5"> + <stop offset="0" stop-color="#ff0000"/> + <stop offset="1" stop-color="#000000"/> + </radialGradient> + </defs> + <g fill="url(#svg_2)" > + <title>Layer 1</title> + <rect id="svg_1" height="50" width="200" y="0" x="0"/> + <text x="50" y="40" id="svg_12" font-size="48" font-family="serif" fill="#ffff00">Text</text> + </g> +</svg> diff --git a/svgio/qa/cppunit/data/tdf97542_2.svg b/svgio/qa/cppunit/data/tdf97542_2.svg new file mode 100644 index 0000000..03cee96 --- /dev/null +++ b/svgio/qa/cppunit/data/tdf97542_2.svg @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<svg width="200" height="50" xmlns="http://www.w3.org/2000/svg"> + <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ --> + <defs> + <radialGradient id="svg_2" cx="1" cy="1" r="3"> + <stop offset="0" stop-color="#ff0000"/> + <stop offset="1" stop-color="#000000"/> + </radialGradient> + </defs> + <g fill="#ffff00"> + <title>Layer 1</title> + <rect id="svg_1" height="50" width="200" y="0" x="0" /> + <text x="50" y="40" id="svg_12" font-size="48" font-family="serif" fill="url(#svg_2)">Text</text> + </g> +</svg> diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx index 2ae8a06..1f592e7 100644 --- a/svgio/source/svgreader/svgstyleattributes.cxx +++ b/svgio/source/svgreader/svgstyleattributes.cxx @@ -263,6 +263,9 @@ namespace svgio // dismantle to geometry and add needed primitives const basegfx::BColor* pFill = getFill(); const SvgGradientNode* pFillGradient = getSvgGradientNodeFill(); + const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); + const SvgGradientNode* pParentFillGradient = + pSvgStyleAttributes ? pSvgStyleAttributes->getSvgGradientNodeFill() : nullptr; const SvgPatternNode* pFillPattern = getSvgPatternNodeFill(); const basegfx::BColor* pStroke = getStroke(); const SvgGradientNode* pStrokeGradient = getSvgGradientNodeStroke(); @@ -303,20 +306,20 @@ namespace svgio const bool bStrokeUsed(pStroke || pStrokeGradient || pStrokePattern); + if(pFill && (!pFillGradient || pParentFillGradient)) + { + // add the already prepared primitives for single color fill + rTarget.append(rSource); + } // add fill. Use geometry even for simple color fill when stroke // is used, else text rendering and the geometry-based stroke will // normally not really match optically due to diverse system text // renderers - if(aMergedArea.count() && (pFillGradient || pFillPattern || bStrokeUsed)) + else if(aMergedArea.count() && (pFillGradient || pFillPattern || bStrokeUsed)) { // create text fill content based on geometry add_fill(aMergedArea, rTarget, aMergedArea.getB2DRange()); } - else if(pFill) - { - // add the already prepared primitives for single color fill - rTarget.append(rSource); - } // add stroke if(aMergedArea.count() && bStrokeUsed) diff --git a/test/source/primitive2dxmldump.cxx b/test/source/primitive2dxmldump.cxx index 84cef39..dd1546f 100644 --- a/test/source/primitive2dxmldump.cxx +++ b/test/source/primitive2dxmldump.cxx @@ -24,6 +24,8 @@ #include <drawinglayer/primitive2d/textprimitive2d.hxx> #include <drawinglayer/primitive2d/maskprimitive2d.hxx> #include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx> +#include <drawinglayer/primitive2d/objectinfoprimitive2d.hxx> +#include <drawinglayer/primitive2d/svggradientprimitive2d.hxx> #include <drawinglayer/attribute/lineattribute.hxx> @@ -180,8 +182,8 @@ void Primitive2dXmlDump::decomposeAndWrite( { rWriter.attribute("height", aScale.getY()); } - rWriter.attribute("text", pTextSimplePortionPrimitive2D->getText()); + rWriter.attribute("fontcolor", convertColorToString(pTextSimplePortionPrimitive2D->getFontColor())); rWriter.endElement(); } break; @@ -207,6 +209,30 @@ void Primitive2dXmlDump::decomposeAndWrite( } break; + case PRIMITIVE2D_ID_OBJECTINFOPRIMITIVE2D: + { + const ObjectInfoPrimitive2D* pObjectInfoPrimitive2D = dynamic_cast<const ObjectInfoPrimitive2D*>(pBasePrimitive); + rWriter.startElement("objectinfo"); + + decomposeAndWrite(pObjectInfoPrimitive2D->getChildren(), rWriter); + rWriter.endElement(); + } + break; + + case PRIMITIVE2D_ID_SVGRADIALGRADIENTPRIMITIVE2D: + { + const SvgRadialGradientPrimitive2D* pSvgRadialGradientPrimitive2D = dynamic_cast<const SvgRadialGradientPrimitive2D*>(pBasePrimitive); + rWriter.startElement("svgradialgradient"); + basegfx::B2DPoint aFocusAttribute = pSvgRadialGradientPrimitive2D->getFocal(); + + rWriter.attribute("radius", pSvgRadialGradientPrimitive2D->getRadius()); + rWriter.attribute("x", aFocusAttribute.getX()); + rWriter.attribute("y", aFocusAttribute.getY()); + + rWriter.endElement(); + } + break; + default: { rWriter.element(OUStringToOString(sCurrentElementTag, RTL_TEXTENCODING_UTF8));
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits