oox/source/export/shapes.cxx                       |    3 +-
 sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt |binary
 sw/qa/extras/ooxmlexport/ooxmlexport10.cxx         |   30 +++++++++++++++++++++
 3 files changed, 32 insertions(+), 1 deletion(-)

New commits:
commit 9592da0a8e596869a1cd0859619dd28a541d7234
Author:     Attila Bakos (NISZ) <bakos.attilakar...@nisz.hu>
AuthorDate: Tue Apr 5 10:13:02 2022 +0200
Commit:     Regina Henschel <rb.hensc...@t-online.de>
CommitDate: Wed Apr 6 19:07:34 2022 +0200

    tdf#148327 docx export: fix puzzle shape
    
    There is an exporter class for preset shapes,
    namely the DMLPresetShapeExporter, which in
    its ctor calls the msfilter::GetShapeName()
    converter method where the puzzle cause
    exception. To avoid this return with false
    to export it with custgeom in time.
    
    Change-Id: I8d29bf551638a66abf381c9cb8f6a0eebc881195
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132567
    Tested-by: Jenkins
    Reviewed-by: Attila Bakos <bakos.attilakar...@nisz.hu>
    Reviewed-by: Regina Henschel <rb.hensc...@t-online.de>

diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 0405c975db0a..e4d378bd6111 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -928,7 +928,8 @@ ShapeExport& ShapeExport::WriteCustomShape( const 
Reference< XShape >& xShape )
     // as preset ones with parameters. Try that with this converter class.
     if (!sShapeType.startsWith("ooxml") && sShapeType != "non-primitive"
         && GetDocumentType() == DOCUMENT_DOCX && !mbUserShapes
-        && xShape->getShapeType() == "com.sun.star.drawing.CustomShape")
+        && xShape->getShapeType() == "com.sun.star.drawing.CustomShape"
+        && !lcl_IsOnAllowlist(sShapeType))
     {
         DMLPresetShapeExporter aCustomShapeConverter(this, xShape);
         bPresetWriteSuccessful = aCustomShapeConverter.WriteShape();
diff --git a/sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt 
b/sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt
new file mode 100644
index 000000000000..6f7a62deecd2
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/TestPuzzleExport.odt 
differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
index 21f81b619bda..9765cc62a24c 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport10.cxx
@@ -1300,6 +1300,36 @@ DECLARE_OOXMLEXPORT_TEST( testTableCellMargin, 
"table-cell-margin.docx" )
     }
 }
 
+DECLARE_OOXMLEXPORT_TEST(TestPuzzleExport, "TestPuzzleExport.odt")
+{
+    // See tdf#148342 fo details
+    // Get the doc
+    uno::Reference< text::XTextDocument > xTextDoc(mxComponent, 
uno::UNO_QUERY_THROW);
+    auto pSwDoc = dynamic_cast<SwXTextDocument*>(xTextDoc.get());
+    CPPUNIT_ASSERT(pSwDoc);
+    // Create a metafile
+    auto pMeta = pSwDoc->GetDocShell()->GetPreviewMetaFile();
+    CPPUNIT_ASSERT(pMeta);
+    MetafileXmlDump aDumper;
+    auto pMetaXml = dumpAndParse(aDumper, *pMeta);
+    CPPUNIT_ASSERT(pMetaXml);
+    // After parsing check that node...
+    auto pXNode = getXPathNode(pMetaXml, 
"/metafile/push/push/push/push[4]/push/push/polypolygon/polygon");
+    CPPUNIT_ASSERT(pXNode);
+    auto pNode = pXNode->nodesetval->nodeTab[0];
+    CPPUNIT_ASSERT(pNode);
+    auto it = pNode->children;
+    int nCount = 0;
+    // .. and count the children
+    while (it != nullptr)
+    {
+        nCount++;
+        it = it->next;
+    }
+    // In case of puzzle thre will be so many... Without the fix there was a 
rectangle with 4 points.
+    CPPUNIT_ASSERT_GREATER(300, nCount);
+}
+
 // tdf#106742 for DOCX with compatibility level <= 14 (MS Word up to and incl. 
ver.2010), we should use cell margins when calculating table left border 
position
 DECLARE_OOXMLEXPORT_TEST( testTablePosition14, "table-position-14.docx" )
 {

Reply via email to