summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2022-09-21 17:25:17 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2022-09-21 21:04:40 +0200
commita42f5faac7c6d4590e632cf40e3ba9eb618e6f56 (patch)
tree6f59bb79a87930d51797101669afe9b442a86ccf /svgio
parent5468a58c3244cf98341945c17db040b067c825f7 (diff)
tdf#103888: Do not add a gap at the end of each text portion
I can't think of any situation where it's needed Change-Id: I1c2c6ec3d22eb9263f3c3c20793d9fe3926b8d78 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140351 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'svgio')
-rw-r--r--svgio/inc/svgcharacternode.hxx1
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx20
-rw-r--r--svgio/qa/cppunit/data/tdf103888.svg11
-rw-r--r--svgio/source/svgreader/svgcharacternode.cxx5
-rw-r--r--svgio/source/svgreader/svgdocumenthandler.cxx44
5 files changed, 34 insertions, 47 deletions
diff --git a/svgio/inc/svgcharacternode.hxx b/svgio/inc/svgcharacternode.hxx
index b7a0a9a254c9..9558e7b752b9 100644
--- a/svgio/inc/svgcharacternode.hxx
+++ b/svgio/inc/svgcharacternode.hxx
@@ -141,7 +141,6 @@ namespace svgio::svgreader
virtual const SvgStyleAttributes* getSvgStyleAttributes() const override;
void decomposeText(drawinglayer::primitive2d::Primitive2DContainer& rTarget, SvgTextPosition& rSvgTextPosition) const;
void whiteSpaceHandling();
- void addGap();
void concatenate(std::u16string_view rText);
/// Text content
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx
index 7db9c8335b1f..07a98f4a5a2f 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -73,6 +73,7 @@ class Test : public test::BootstrapFixture, public XmlTestTools
void test123926();
void test47446();
void test47446b();
+ void testTdf103888();
void testMaskText();
void testTdf99994();
void testTdf99115();
@@ -121,6 +122,7 @@ public:
CPPUNIT_TEST(test123926);
CPPUNIT_TEST(test47446);
CPPUNIT_TEST(test47446b);
+ CPPUNIT_TEST(testTdf103888);
CPPUNIT_TEST(testMaskText);
CPPUNIT_TEST(testTdf99994);
CPPUNIT_TEST(testTdf99115);
@@ -479,7 +481,7 @@ void Test::testTdf85770()
assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "height", "11");
assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "familyname", "Times New Roman");
assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "fontcolor", "#000000");
- assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "text", "Start ");
+ assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "text", "Start");
assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "height", "11");
assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "familyname", "Times New Roman");
assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[3]", "fontcolor", "#000000");
@@ -846,6 +848,22 @@ void Test::test47446b()
}
+void Test::testTdf103888()
+{
+ Primitive2DSequence aSequenceMaskText = parseSvg(u"/svgio/qa/cppunit/data/tdf103888.svg");
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequenceMaskText.getLength()));
+
+ drawinglayer::Primitive2dXmlDump dumper;
+ xmlDocUniquePtr pDocument = dumper.dumpAndParse(Primitive2DContainer(aSequenceMaskText));
+
+ CPPUNIT_ASSERT (pDocument);
+
+ // Without the fix in place, this test would have failed here with number of nodes is incorrect
+ assertXPath(pDocument, "/primitive2D/transform/transform/textsimpleportion[1]", "text", "Her");
+ assertXPath(pDocument, "/primitive2D/transform/transform/textsimpleportion[2]", "text", "vor");
+ assertXPath(pDocument, "/primitive2D/transform/transform/textsimpleportion[3]", "text", "hebung");
+}
+
void Test::testMaskText()
{
//Check that mask is applied on text
diff --git a/svgio/qa/cppunit/data/tdf103888.svg b/svgio/qa/cppunit/data/tdf103888.svg
new file mode 100644
index 000000000000..1663fa395e40
--- /dev/null
+++ b/svgio/qa/cppunit/data/tdf103888.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
+ width="75mm"
+ height="15mm"
+ viewBox="0 0 250 50">
+ <text
+ style="font-size:30px;font-family:sans-serif;fill:#000000;stroke:none"
+ x="20"
+ y="30">Her<tspan style="font-weight:bold">vor</tspan>hebung</text>
+</svg>
diff --git a/svgio/source/svgreader/svgcharacternode.cxx b/svgio/source/svgreader/svgcharacternode.cxx
index 0a4731b200d5..31376ee179a8 100644
--- a/svgio/source/svgreader/svgcharacternode.cxx
+++ b/svgio/source/svgreader/svgcharacternode.cxx
@@ -549,11 +549,6 @@ namespace svgio::svgreader
}
}
- void SvgCharacterNode::addGap()
- {
- maText += " ";
- }
-
void SvgCharacterNode::concatenate(std::u16string_view rText)
{
maText += rText;
diff --git a/svgio/source/svgreader/svgdocumenthandler.cxx b/svgio/source/svgreader/svgdocumenthandler.cxx
index 288b0205397d..dc2dd6fa7c6b 100644
--- a/svgio/source/svgreader/svgdocumenthandler.cxx
+++ b/svgio/source/svgreader/svgdocumenthandler.cxx
@@ -55,7 +55,7 @@ namespace svgio::svgreader
namespace
{
- svgio::svgreader::SvgCharacterNode* whiteSpaceHandling(svgio::svgreader::SvgNode const * pNode, svgio::svgreader::SvgCharacterNode* pLast)
+ void whiteSpaceHandling(svgio::svgreader::SvgNode const * pNode)
{
if(pNode)
{
@@ -75,41 +75,6 @@ namespace
// clean whitespace in text span
svgio::svgreader::SvgCharacterNode* pCharNode = static_cast< svgio::svgreader::SvgCharacterNode* >(pCandidate);
pCharNode->whiteSpaceHandling();
-
- // pCharNode may have lost all text. If that's the case, ignore
- // as invalid character node
- if(!pCharNode->getText().isEmpty())
- {
- if(pLast)
- {
- bool bAddGap(true);
- static bool bNoGapsForBaselineShift(true); // loplugin:constvars:ignore
-
- if(bNoGapsForBaselineShift)
- {
- // With this option a baseline shift between two char parts ('words')
- // will not add a space 'gap' to the end of the (non-last) word. This
- // seems to be the standard behaviour, see last bugdoc attached #122524#
- const svgio::svgreader::SvgStyleAttributes* pStyleLast = pLast->getSvgStyleAttributes();
- const svgio::svgreader::SvgStyleAttributes* pStyleCurrent = pCandidate->getSvgStyleAttributes();
-
- if(pStyleLast && pStyleCurrent && pStyleLast->getBaselineShift() != pStyleCurrent->getBaselineShift())
- {
- bAddGap = false;
- }
- }
-
- // add in-between whitespace (single space) to last
- // known character node
- if(bAddGap)
- {
- pLast->addGap();
- }
- }
-
- // remember new last corrected character node
- pLast = pCharNode;
- }
break;
}
case SVGToken::Tspan:
@@ -117,7 +82,7 @@ namespace
case SVGToken::Tref:
{
// recursively clean whitespaces in subhierarchy
- pLast = whiteSpaceHandling(pCandidate, pLast);
+ whiteSpaceHandling(pCandidate);
break;
}
default:
@@ -129,9 +94,8 @@ namespace
}
}
}
-
- return pLast;
}
+
} // end anonymous namespace
SvgDocHdl::SvgDocHdl(const OUString& aAbsolutePath)
@@ -548,7 +512,7 @@ namespace
if(pWhitespaceCheck)
{
// cleanup read strings
- whiteSpaceHandling(pWhitespaceCheck, nullptr);
+ whiteSpaceHandling(pWhitespaceCheck);
}
}