svgio/qa/cppunit/SvgImportTest.cxx          |   31 ++++++++++++++++++++++++++++
 svgio/qa/cppunit/data/tdf156577.svg         |    8 +++++++
 svgio/source/svgreader/svgcharacternode.cxx |   22 +++++++++++--------
 3 files changed, 52 insertions(+), 9 deletions(-)

New commits:
commit d3a8c3d5a6db298d427999b84a474c982c26e6dd
Author:     Xisco Fauli <xiscofa...@libreoffice.org>
AuthorDate: Wed Aug 2 11:49:56 2023 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Aug 3 18:38:12 2023 +0200

    tdf#156577: do no use parent position if x array is empty
    
    Change-Id: Id29e5a440dbc3719c53bcc9226336a3c99d469e3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155216
    Tested-by: Jenkins
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>
    (cherry picked from commit 79646e204f5d558f5519186cb62ef1c9254f857f)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155248

diff --git a/svgio/qa/cppunit/SvgImportTest.cxx 
b/svgio/qa/cppunit/SvgImportTest.cxx
index 17736515010a..ffd0f7b5c9bb 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -1427,6 +1427,37 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf156269)
     assertXPath(pDocument, "//textsimpleportion[@text='two']", "fontcolor", 
"#000000");
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testTdf156577)
+{
+    Primitive2DSequence aSequence = 
parseSvg(u"/svgio/qa/cppunit/data/tdf156577.svg");
+    CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength()));
+
+    drawinglayer::Primitive2dXmlDump dumper;
+    xmlDocUniquePtr pDocument = 
dumper.dumpAndParse(Primitive2DContainer(aSequence));
+
+    CPPUNIT_ASSERT (pDocument);
+
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", 
"width", "16");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", 
"height", "16");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "x", 
"30");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", "y", 
"20");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[1]", 
"text", "ABC");
+    assertXPathNoAttribute(pDocument, 
"/primitive2D/transform/textsimpleportion[1]", "dx0");
+
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", 
"width", "16");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", 
"height", "16");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "x", 
"30");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "y", 
"30");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", 
"text", "ABC");
+
+    // Without the fix in place, this test would have failed with
+    // - Expected: 22
+    // - Actual  : 52
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", 
"dx0", "22");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", 
"dx1", "53");
+    assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", 
"dx2", "94");
+}
+
 CPPUNIT_TEST_FIXTURE(Test, testTdf156283)
 {
     Primitive2DSequence aSequence = 
parseSvg(u"/svgio/qa/cppunit/data/tdf156283.svg");
diff --git a/svgio/qa/cppunit/data/tdf156577.svg 
b/svgio/qa/cppunit/data/tdf156577.svg
new file mode 100644
index 000000000000..de12f36667f8
--- /dev/null
+++ b/svgio/qa/cppunit/data/tdf156577.svg
@@ -0,0 +1,8 @@
+<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg";>
+       <text x="30" y="20">
+        <tspan x="30" y="20">ABC</tspan>
+        </text>
+       <text x="30" y="30">
+        <tspan x="30" y="30" dx="0 10 20 30 40">ABC</tspan>
+       </text>
+</svg>
diff --git a/svgio/source/svgreader/svgcharacternode.cxx 
b/svgio/source/svgreader/svgcharacternode.cxx
index 5fab853ed0a0..8a6610c91d25 100644
--- a/svgio/source/svgreader/svgcharacternode.cxx
+++ b/svgio/source/svgreader/svgcharacternode.cxx
@@ -263,23 +263,27 @@ namespace svgio::svgreader
 
                 // prepare TextArray
                 ::std::vector< double > aTextArray(rSvgTextPosition.getX());
-                if(aTextArray.size() < nLength)
+                ::std::vector< double > aDxArray(rSvgTextPosition.getDx());
+
+                // Do nothing when X and Dx arrays are empty
+                if((!aTextArray.empty() || !aDxArray.empty()) && 
aTextArray.size() < nLength)
                 {
                     const sal_uInt32 nArray(aTextArray.size());
 
                     double fStartX(0.0);
-
-                    if(rSvgTextPosition.getParent() && 
rSvgTextPosition.getParent()->getAbsoluteX())
-                    {
-                        fStartX = 
rSvgTextPosition.getParent()->getPosition().getX();
-                    }
-                    else if (!aTextArray.empty())
+                    if (!aTextArray.empty())
                     {
-                        fStartX = aTextArray[nArray - 1];
+                        if(rSvgTextPosition.getParent() && 
rSvgTextPosition.getParent()->getAbsoluteX())
+                        {
+                            fStartX = 
rSvgTextPosition.getParent()->getPosition().getX();
+                        }
+                        else
+                        {
+                            fStartX = aTextArray[nArray - 1];
+                        }
                     }
 
                     ::std::vector< double > 
aExtendArray(aTextLayouterDevice.getTextArray(getText(), nArray, nLength - 
nArray));
-                    ::std::vector< double > aDxArray(rSvgTextPosition.getDx());
                     double fComulativeDx(0.0);
 
                     aTextArray.reserve(nLength);

Reply via email to