oox/source/drawingml/scene3dcontext.cxx            |   24 +++++++++++++++++++++
 oox/source/drawingml/textbodypropertiescontext.cxx |   16 ++++++++++++++
 sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx       |binary
 sd/qa/unit/export-tests-ooxml1.cxx                 |   24 +++++++++++++++++++++
 4 files changed, 64 insertions(+)

New commits:
commit dbbb8cafcb801638bde3b21796eaebfc807acbdc
Author:     Regina Henschel <rb.hensc...@t-online.de>
AuthorDate: Mon Mar 8 17:28:27 2021 +0100
Commit:     Regina Henschel <rb.hensc...@t-online.de>
CommitDate: Wed Mar 10 12:33:38 2021 +0100

    tdf#140865 roundtrip pptx wordart 3D, add sp3d
    
    Change-Id: I446ae4e8c9dd5f2fbf3efe289681339f967c515a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112185
    Tested-by: Jenkins
    Reviewed-by: Regina Henschel <rb.hensc...@t-online.de>

diff --git a/oox/source/drawingml/scene3dcontext.cxx 
b/oox/source/drawingml/scene3dcontext.cxx
index 91b73f0bbd95..813f9442c901 100644
--- a/oox/source/drawingml/scene3dcontext.cxx
+++ b/oox/source/drawingml/scene3dcontext.cxx
@@ -92,6 +92,30 @@ ContextHandlerRef 
SceneText3DPropertiesContext::onCreateContext( sal_Int32 aElem
     case A_TOKEN( backdrop ):
     case A_TOKEN( extLst ):
         return nullptr; // TODO: later (backdrop is not supported by core 
anyway)
+
+    case A_TOKEN( bevelT ):
+    case A_TOKEN( bevelB ):
+    {
+        BevelProperties aProps;
+        if( rAttribs.hasAttribute( XML_w ) )
+            aProps.mnWidth = rAttribs.getInteger( XML_w, 0 );
+        if( rAttribs.hasAttribute( XML_h ) )
+            aProps.mnHeight = rAttribs.getInteger( XML_h, 0 );
+        if( rAttribs.hasAttribute( XML_prst ) )
+            aProps.mnPreset = rAttribs.getToken( XML_prst, XML_none );
+
+        if( aElementToken == A_TOKEN( bevelT ) )
+            mr3DProperties.maTopBevelProperties.set( aProps );
+        else
+            mr3DProperties.maBottomBevelProperties.set( aProps );
+        break;
+    }
+
+    case A_TOKEN( extrusionClr ):
+        return new ColorContext( *this, mr3DProperties.maExtrusionColor );
+
+    case A_TOKEN( contourClr ):
+        return new ColorContext( *this, mr3DProperties.maContourColor );
     }
     return nullptr;
 }
diff --git a/oox/source/drawingml/textbodypropertiescontext.cxx 
b/oox/source/drawingml/textbodypropertiescontext.cxx
index 5bc244b73fc2..4d94191dcfc7 100644
--- a/oox/source/drawingml/textbodypropertiescontext.cxx
+++ b/oox/source/drawingml/textbodypropertiescontext.cxx
@@ -177,6 +177,22 @@ ContextHandlerRef 
TextBodyPropertiesContext::onCreateContext( sal_Int32 aElement
 
             // EG_Text3D
             case A_TOKEN( sp3d ):           // CT_Shape3D
+            {
+                if (mpShapePtr && mpShapePtr->getServiceName() == 
"com.sun.star.drawing.CustomShape")
+                {
+                    if (rAttribs.hasAttribute(XML_extrusionH))
+                        
mpShapePtr->getTextBody()->get3DProperties().mnExtrusionH = 
rAttribs.getInteger(XML_extrusionH, 0);
+                    if (rAttribs.hasAttribute(XML_contourW))
+                        
mpShapePtr->getTextBody()->get3DProperties().mnContourW = 
rAttribs.getInteger(XML_contourW, 0);
+                    if (rAttribs.hasAttribute(XML_z))
+                        mpShapePtr->getTextBody()->get3DProperties().mnShapeZ 
= rAttribs.getInteger(XML_z, 0);
+                    if (rAttribs.hasAttribute(XML_prstMaterial))
+                        
mpShapePtr->getTextBody()->get3DProperties().mnMaterial = 
rAttribs.getToken(XML_prstMaterial, XML_none);
+                    return new SceneText3DPropertiesContext(*this, 
mpShapePtr->getTextBody()->get3DProperties());
+                }
+                break;
+            }
+
             case A_TOKEN( flatTx ):         // CT_FlatText
 
                 break;
diff --git a/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx 
b/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx
new file mode 100644
index 000000000000..e55bc43800b4
Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx differ
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx 
b/sd/qa/unit/export-tests-ooxml1.cxx
index 7c3739fa1a7d..1e5f673428c2 100644
--- a/sd/qa/unit/export-tests-ooxml1.cxx
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -109,6 +109,7 @@ public:
     void testTdf136911();
     void testArcTo();
     void testNarrationMimeType();
+    void testTdf140865Wordart3D();
 
     CPPUNIT_TEST_SUITE(SdOOXMLExportTest1);
 
@@ -160,6 +161,7 @@ public:
     CPPUNIT_TEST(testTdf136911);
     CPPUNIT_TEST(testArcTo);
     CPPUNIT_TEST(testNarrationMimeType);
+    CPPUNIT_TEST(testTdf140865Wordart3D);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -1380,6 +1382,28 @@ void SdOOXMLExportTest1::testNarrationMimeType()
     xDocShRef->DoClose();
 }
 
+void SdOOXMLExportTest1::testTdf140865Wordart3D()
+{
+    sd::DrawDocShellRef xDocShRef
+        = 
loadURL(m_directories.getURLFromSrc(u"sd/qa/unit/data/pptx/tdf140865Wordart3D.pptx"),
 PPTX);
+    utl::TempFile aTempFile;
+    xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &aTempFile);
+    xmlDocUniquePtr pXmlDoc = parseExport(aTempFile, "ppt/slides/slide1.xml");
+
+    // without the fix in place a:sp3d was lost on round trip, and so 
extrusion was lost.
+    constexpr OStringLiteral 
sPathStart("//p:sld/p:cSld/p:spTree/p:sp/p:txBody/a:bodyPr");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "extrusionH", "342900");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d", "contourW", "12700");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "w", "114300");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "h", "38100");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelT", "prst", "softRound");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:bevelB", "h", "152400");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:extrusionClr/a:srgbClr", 
"val", "990000");
+    assertXPath(pXmlDoc, sPathStart + "/a:sp3d/a:contourClr/a:srgbClr", "val", 
"009876");
+
+    xDocShRef->DoClose();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest1);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to