summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
authorRegina Henschel <rb.henschel@t-online.de>2022-11-02 22:34:16 +0100
committerRegina Henschel <rb.henschel@t-online.de>2022-11-03 16:28:31 +0100
commit933768ffcd8617942f45481de77e656ded9dcfe2 (patch)
tree1ba30b43f5bcaf92c165038e9c482817a905a35a /sd
parent2dd592f0836184e3f275e8ff3248639f08a3f647 (diff)
tdf#150966 oox export avoid bottom above top for text area
If bottom and top insets set so that the bottom edge of the resulting text area is above the top edge, then LO and MS Office behave different in how this is rendered. With commit e2169886 insets are converted on import to make rendering in LO similar to MS Office, but the implemented export has some problems, see analysis in bug report. LibreOffice normalizes the resulting text area in case bottom edge is above top edge. So this patch exports the insets so, that MS Office gets a normalized resulting text area and will not apply its special rules. A roundtrip starting with pptx will not regenerate the old values but will produce inset values, which give same rendering in MS Office than in LO. Because the method is different now, the inset values have changed and test testTextDistancesOOXML_Export is adapted. When you compare the result with the screenshot on slide 2, you see that the new method works as well. The old method did not work for exporting an odp file. That is covered by the new unit test. The docx unit test file covers the case, that the export tweak was erroneously triggered. Change-Id: I0091f284d9bdd635dd87ddb9e9b0e415cc0cc51e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142185 Tested-by: Jenkins Reviewed-by: Regina Henschel <rb.henschel@t-online.de>
Diffstat (limited to 'sd')
-rw-r--r--sd/qa/unit/ShapeImportExportTest.cxx44
-rw-r--r--sd/qa/unit/data/odp/tdf150966_hugeInset.odpbin0 -> 14837 bytes
2 files changed, 30 insertions, 14 deletions
diff --git a/sd/qa/unit/ShapeImportExportTest.cxx b/sd/qa/unit/ShapeImportExportTest.cxx
index a0e6b63b4ccb..ce972e0a38cc 100644
--- a/sd/qa/unit/ShapeImportExportTest.cxx
+++ b/sd/qa/unit/ShapeImportExportTest.cxx
@@ -30,11 +30,13 @@ public:
void testTextDistancesOOXML();
void testTextDistancesOOXML_LargerThanTextAreaSpecialCase();
void testTextDistancesOOXML_Export();
+ void testTextDistancesODP_OOXML_Export();
CPPUNIT_TEST_SUITE(ShapeImportExportTest);
CPPUNIT_TEST(testTextDistancesOOXML);
CPPUNIT_TEST(testTextDistancesOOXML_LargerThanTextAreaSpecialCase);
CPPUNIT_TEST(testTextDistancesOOXML_Export);
+ CPPUNIT_TEST(testTextDistancesODP_OOXML_Export);
CPPUNIT_TEST_SUITE_END();
virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override
@@ -267,28 +269,28 @@ void ShapeImportExportTest::testTextDistancesOOXML_Export()
//Check shape Top/Bottom - 0cm, 4cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:nvSpPr/p:cNvPr", "name", "Text_TB_0_4");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr",
- { { "tIns", "0" }, { "bIns", "1439640" } });
+ { { "tIns", "-360000" }, { "bIns", "1079640" } });
//Check shape Top/Bottom - 4cm, 0cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:nvSpPr/p:cNvPr", "name", "Text_TB_4_0");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[2]/p:txBody/a:bodyPr",
- { { "tIns", "1439640" }, { "bIns", "0" } });
+ { { "tIns", "1079640" }, { "bIns", "-360000" } });
//Check shape Top/Bottom - 0cm, 3cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:nvSpPr/p:cNvPr", "name", "Text_TB_0_3");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[3]/p:txBody/a:bodyPr",
- { { "tIns", "0" }, { "bIns", "1079640" } });
+ { { "tIns", "-180000" }, { "bIns", "899640" } });
//Check shape Top/Bottom - 2cm, 1cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:nvSpPr/p:cNvPr", "name", "Text_TB_2_1");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[4]/p:txBody/a:bodyPr",
- { { "tIns", "720000" }, { "bIns", "360000" } });
+ { { "tIns", "540000" }, { "bIns", "180000" } });
//Check shape Top/Bottom - 0cm, 2.5cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:nvSpPr/p:cNvPr", "name",
"Text_TB_0_2.5");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[5]/p:txBody/a:bodyPr",
- { { "tIns", "0" }, { "bIns", "899640" } });
+ { { "tIns", "-90000" }, { "bIns", "809640" } });
//Check shape Top/Bottom - 0cm, 2cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[6]/p:nvSpPr/p:cNvPr", "name", "Text_TB_0_2");
@@ -304,13 +306,13 @@ void ShapeImportExportTest::testTextDistancesOOXML_Export()
//Check shape Top/Bottom - 3cm, 0cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[8]/p:nvSpPr/p:cNvPr", "name", "Text_TB_3_0");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[8]/p:txBody/a:bodyPr",
- { { "tIns", "1079640" }, { "bIns", "0" } });
+ { { "tIns", "899640" }, { "bIns", "-180000" } });
//Check shape Top/Bottom - 2.5cm, 0cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[9]/p:nvSpPr/p:cNvPr", "name",
"Text_TB_2.5_0");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[9]/p:txBody/a:bodyPr",
- { { "tIns", "899640" }, { "bIns", "0" } });
+ { { "tIns", "809640" }, { "bIns", "-90000" } });
//Check shape Top/Bottom - 2cm, 0cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[10]/p:nvSpPr/p:cNvPr", "name", "Text_TB_2_0");
@@ -326,41 +328,41 @@ void ShapeImportExportTest::testTextDistancesOOXML_Export()
//Check shape Top/Bottom - 1cm, 2cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[12]/p:nvSpPr/p:cNvPr", "name", "Text_TB_1_2");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[12]/p:txBody/a:bodyPr",
- { { "tIns", "360000" }, { "bIns", "720000" } });
+ { { "tIns", "180000" }, { "bIns", "540000" } });
//Check shape Top/Bottom - 2cm, 1.5cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[13]/p:nvSpPr/p:cNvPr", "name",
"Text_TB_2_1.5");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[13]/p:txBody/a:bodyPr",
- { { "tIns", "720000" }, { "bIns", "540000" } });
+ { { "tIns", "450000" }, { "bIns", "270000" } });
//Check shape Top/Bottom - 1.5cm, 2cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[14]/p:nvSpPr/p:cNvPr", "name",
"Text_TB_1.5_2");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[14]/p:txBody/a:bodyPr",
- { { "tIns", "540000" }, { "bIns", "720000" } });
+ { { "tIns", "270000" }, { "bIns", "450000" } });
//Check shape Top/Bottom - 2cm, 1.75cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[15]/p:nvSpPr/p:cNvPr", "name",
"Text_TB_2_1.75");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[15]/p:txBody/a:bodyPr",
- { { "tIns", "720000" }, { "bIns", "630000" } });
+ { { "tIns", "405000" }, { "bIns", "315000" } });
//Check shape Top/Bottom - 1.75cm, 2cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[16]/p:nvSpPr/p:cNvPr", "name",
"Text_TB_1.75_2");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[16]/p:txBody/a:bodyPr",
- { { "tIns", "630000" }, { "bIns", "720000" } });
+ { { "tIns", "315000" }, { "bIns", "405000" } });
//Check shape Top/Bottom - 2cm, 2cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[17]/p:nvSpPr/p:cNvPr", "name", "Text_TB_2_2");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[17]/p:txBody/a:bodyPr",
- { { "tIns", "720000" }, { "bIns", "720000" } });
+ { { "tIns", "360000" }, { "bIns", "360000" } });
//Check shape Top/Bottom - 1cm, 1cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[18]/p:nvSpPr/p:cNvPr", "name", "Text_TB_1_1");
assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[18]/p:txBody/a:bodyPr",
- { { "tIns", "720000" }, { "bIns", "720000" } });
+ { { "tIns", "360000" }, { "bIns", "360000" } });
//Check shape Top/Bottom - 0.5cm, 0.5cm
assertXPath(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[19]/p:nvSpPr/p:cNvPr", "name",
@@ -369,6 +371,20 @@ void ShapeImportExportTest::testTextDistancesOOXML_Export()
{ { "tIns", "180000" }, { "bIns", "180000" } });
}
+void ShapeImportExportTest::testTextDistancesODP_OOXML_Export()
+{
+ loadFromURL(u"odp/tdf150966_hugeInset.odp");
+ utl::TempFileNamed aTempFile = save("Impress Office Open XML");
+ xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "ppt/slides/slide1.xml");
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ // The text ends 5cm below the top edge of the shape.
+ // Without the fix we exported tIns="3600000" and bIns="5400000".
+ // The text had ended about 3.3cm below the top edge in PowerPoint.
+ assertXPathAttrs(pXmlDoc, "/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr",
+ { { "tIns", "720000" }, { "bIns", "2520000" } });
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(ShapeImportExportTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sd/qa/unit/data/odp/tdf150966_hugeInset.odp b/sd/qa/unit/data/odp/tdf150966_hugeInset.odp
new file mode 100644
index 000000000000..9dcc88bef9cb
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf150966_hugeInset.odp
Binary files differ