svx/qa/unit/data/tdf140321_Matte_import.ppt      |binary
 svx/qa/unit/data/tdf140321_material_specular.odp |binary
 svx/qa/unit/data/tdf140321_metal.odp             |binary
 svx/qa/unit/data/tdf140321_phong.odp             |binary
 svx/qa/unit/svdraw.cxx                           |  101 +++++++++++++++++++++++
 5 files changed, 101 insertions(+)

New commits:
commit 87e5caca7d3133a32d92503bfa8e5a1409545187
Author:     Regina Henschel <rb.hensc...@t-online.de>
AuthorDate: Wed Nov 10 22:34:07 2021 +0100
Commit:     Regina Henschel <rb.hensc...@t-online.de>
CommitDate: Fri Nov 12 15:55:52 2021 +0100

    tdf#143021 unit test enable 'matte' extrusion surface
    
    This adds the missing unit test for commmit
    70a4cb766ed356bc17433ac1673e977bb0bf3d2f.
    
    Thanks to Tomaž for extending the test framework to 3D.
    
    Change-Id: Iffaa163c3d453318bc0ed7f8703af15bd20c8966
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125013
    Tested-by: Jenkins
    Reviewed-by: Regina Henschel <rb.hensc...@t-online.de>

diff --git a/svx/qa/unit/data/tdf140321_Matte_import.ppt 
b/svx/qa/unit/data/tdf140321_Matte_import.ppt
new file mode 100644
index 000000000000..83e790fd414f
Binary files /dev/null and b/svx/qa/unit/data/tdf140321_Matte_import.ppt differ
diff --git a/svx/qa/unit/data/tdf140321_material_specular.odp 
b/svx/qa/unit/data/tdf140321_material_specular.odp
new file mode 100644
index 000000000000..03869914f54d
Binary files /dev/null and b/svx/qa/unit/data/tdf140321_material_specular.odp 
differ
diff --git a/svx/qa/unit/data/tdf140321_metal.odp 
b/svx/qa/unit/data/tdf140321_metal.odp
new file mode 100644
index 000000000000..a81ee0dfbcd1
Binary files /dev/null and b/svx/qa/unit/data/tdf140321_metal.odp differ
diff --git a/svx/qa/unit/data/tdf140321_phong.odp 
b/svx/qa/unit/data/tdf140321_phong.odp
new file mode 100644
index 000000000000..989a0848532c
Binary files /dev/null and b/svx/qa/unit/data/tdf140321_phong.odp differ
diff --git a/svx/qa/unit/svdraw.cxx b/svx/qa/unit/svdraw.cxx
index 5050136991bf..f213af12f7de 100644
--- a/svx/qa/unit/svdraw.cxx
+++ b/svx/qa/unit/svdraw.cxx
@@ -48,6 +48,7 @@ class SvdrawTest : public test::BootstrapFixture, public 
unotest::MacrosTest, pu
 {
 protected:
     uno::Reference<lang::XComponent> mxComponent;
+    SdrPage* getFirstDrawPageWithAssert();
 
 public:
     virtual void setUp() override
@@ -67,6 +68,37 @@ public:
     uno::Reference<lang::XComponent>& getComponent() { return mxComponent; }
 };
 
+SdrPage* SvdrawTest::getFirstDrawPageWithAssert()
+{
+    uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent,
+                                                                   
uno::UNO_QUERY_THROW);
+    CPPUNIT_ASSERT(xDrawPagesSupplier.is());
+    uno::Reference<drawing::XDrawPages> 
xDrawPages(xDrawPagesSupplier->getDrawPages());
+    uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->getByIndex(0), 
uno::UNO_QUERY_THROW);
+    CPPUNIT_ASSERT(xDrawPage.is());
+
+    auto pDrawPage = dynamic_cast<SvxDrawPage*>(xDrawPage.get());
+    CPPUNIT_ASSERT(pDrawPage);
+    return pDrawPage->GetSdrPage();
+}
+
+xmlDocUniquePtr lcl_dumpAndParseFirstObjectWithAssert(SdrPage* pSdrPage)
+{
+    ScopedVclPtrInstance<VirtualDevice> aVirtualDevice;
+    sdr::contact::ObjectContactOfObjListPainter aObjectContact(*aVirtualDevice,
+                                                               { 
pSdrPage->GetObj(0) }, nullptr);
+    const auto& rDrawPageVOContact
+        = pSdrPage->GetViewContact().GetViewObjectContact(aObjectContact);
+    sdr::contact::DisplayInfo aDisplayInfo;
+    drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence;
+    rDrawPageVOContact.getPrimitive2DSequenceHierarchy(aDisplayInfo, 
xPrimitiveSequence);
+
+    drawinglayer::Primitive2dXmlDump aDumper;
+    xmlDocUniquePtr pXmlDoc = aDumper.dumpAndParse(xPrimitiveSequence);
+    CPPUNIT_ASSERT(pXmlDoc);
+    return pXmlDoc;
+}
+
 CPPUNIT_TEST_FIXTURE(SvdrawTest, testSemiTransparentText)
 {
     // Create a new Draw document with a rectangle.
@@ -391,6 +423,75 @@ CPPUNIT_TEST_FIXTURE(SvdrawTest, testFontWorks)
     assertXPath(pXmlDoc, "//scene/extrude3D[1]/object3Dattributes/material", 
"specularIntensity",
                 "20");
 }
+
+CPPUNIT_TEST_FIXTURE(SvdrawTest, testSurfaceMetal)
+{
+    OUString aURL = 
m_directories.getURLFromSrc(u"svx/qa/unit/data/tdf140321_metal.odp");
+    mxComponent = loadFromDesktop(aURL, 
"com.sun.star.presentation.PresentationDocument");
+
+    SdrPage* pSdrPage = getFirstDrawPageWithAssert();
+
+    xmlDocUniquePtr pXmlDoc = lcl_dumpAndParseFirstObjectWithAssert(pSdrPage);
+
+    // ODF specifies specular color as rgb(200,200,200) and adding 15 to 
specularity for metal=true
+    // without patch the specular color was #ffffff
+    assertXPath(pXmlDoc, "(//material)[1]", "specular", "#c8c8c8");
+    // specularIntensity = 100 - (80 + 15), with nominal value 80 in the file
+    // without patch specularIntensity was 15
+    assertXPath(pXmlDoc, "(//material)[1]", "specularIntensity", "5");
+}
+
+CPPUNIT_TEST_FIXTURE(SvdrawTest, testExtrusionPhong)
+{
+    OUString aURL = 
m_directories.getURLFromSrc(u"svx/qa/unit/data/tdf140321_phong.odp");
+    mxComponent = loadFromDesktop(aURL, 
"com.sun.star.presentation.PresentationDocument");
+
+    SdrPage* pSdrPage = getFirstDrawPageWithAssert();
+
+    xmlDocUniquePtr pXmlDoc = lcl_dumpAndParseFirstObjectWithAssert(pSdrPage);
+
+    // The rendering method and normals kind were always 'Flat' without the 
patch.
+    assertXPath(pXmlDoc, "//scene", "shadeMode", "Phong");
+    assertXPath(pXmlDoc, "//object3Dattributes", "normalsKind", "Specific");
+}
+
+CPPUNIT_TEST_FIXTURE(SvdrawTest, testSurfaceMattePPT)
+{
+    OUString aURL = 
m_directories.getURLFromSrc(u"svx/qa/unit/data/tdf140321_Matte_import.ppt");
+    mxComponent = loadFromDesktop(aURL, 
"com.sun.star.presentation.PresentationDocument");
+
+    SdrPage* pSdrPage = getFirstDrawPageWithAssert();
+
+    xmlDocUniquePtr pXmlDoc = lcl_dumpAndParseFirstObjectWithAssert(pSdrPage);
+
+    // The preset 'matte' in the PPT user interface sets the specularity of 
material to 0. To get the
+    // same effect in LO, specular of the lights need to be false in addition. 
Without patch the
+    // lights 1, 2, 3 are used, with patch lights 2, 3, 4. Thereby light 4 has 
the same color and
+    // direction as light 1, but without being specular. The dump has in both 
cases three lights, but
+    // without number. So we test as ersatz, that the third of them has the 
color of light 1. Being
+    // not light 1, it is never specular in LO, so no need to test.
+    // 'color' was "#464646" without patch.
+    assertXPath(pXmlDoc, "(//light)[3]", "color", "#aaaaaa");
+    // 'specularIntensity' was "15" without patch. specularIntensity = 100 - 
specularity of material.
+    assertXPath(pXmlDoc, "(//material)[1]", "specularIntensity", "100");
+}
+
+CPPUNIT_TEST_FIXTURE(SvdrawTest, testMaterialSpecular)
+{
+    OUString aURL
+        = 
m_directories.getURLFromSrc(u"svx/qa/unit/data/tdf140321_material_specular.odp");
+    mxComponent = loadFromDesktop(aURL, 
"com.sun.star.presentation.PresentationDocument");
+
+    SdrPage* pSdrPage = getFirstDrawPageWithAssert();
+
+    xmlDocUniquePtr pXmlDoc = lcl_dumpAndParseFirstObjectWithAssert(pSdrPage);
+    CPPUNIT_ASSERT(pXmlDoc);
+
+    // The material property 'draw:extrusion-specularity' was not applied to 
the object but to the
+    // scene. Without patch the object has always a default value 15 of 
specularIntensity. The file
+    // has specularity=77%. It should be specularIntensity = 100-77=23 with 
patch.
+    assertXPath(pXmlDoc, "(//material)[1]", "specularIntensity", "23");
+}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to