sd/qa/unit/tiledrendering/tiledrendering.cxx  |  392 +++++++++++++-------------
 sd/source/ui/inc/SlideshowLayerRenderer.hxx   |    4 
 sd/source/ui/tools/SlideshowLayerRenderer.cxx |   51 ++-
 sd/source/ui/unoidl/unomodel.cxx              |    4 
 4 files changed, 250 insertions(+), 201 deletions(-)

New commits:
commit e2cab7cacbe47684725a58f922c7721c4e6a4410
Author:     Marco Cecchetti <marco.cecche...@collabora.com>
AuthorDate: Mon Nov 11 12:39:05 2024 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Wed Mar 26 11:24:37 2025 +0100

    lok: slideshow: support for skipping background and masterpage rendering
    
    Change-Id: Id72a0a6aac819dad2d6e3cef2f1434c84693e560
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183331
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx 
b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index e8b6e4c497eb..3688cff58100 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -2824,6 +2824,162 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testPresentationInfo)
     }
 }
 
+namespace
+{
+class SlideRendererChecker
+{
+private:
+    SdXImpressDocument* mpXImpressDocument;
+    sal_Int32 mnViewWidth;
+    sal_Int32 mnViewHeight;
+    sal_Int32 mnSlideNumber;
+    int mnImageFileStep;
+
+public:
+    SlideRendererChecker(SdXImpressDocument* pXImpressDocument,
+                         sal_Int32 nSlideNumber, sal_Int32 nViewWidth, 
sal_Int32 nViewHeight,
+                         bool bRenderBackground = true, bool bRenderMasterPage 
= true)
+        : mpXImpressDocument(pXImpressDocument)
+        , mnViewWidth(nViewWidth)
+        , mnViewHeight(nViewHeight)
+        , mnSlideNumber(nSlideNumber)
+        , mnImageFileStep(0)
+    {
+        CPPUNIT_ASSERT(mpXImpressDocument);
+        SdDrawDocument* pDoc = mpXImpressDocument->GetDoc();
+        CPPUNIT_ASSERT(pDoc);
+        SdPage* pPage = pDoc->GetSdPage(sal_uInt16(mnSlideNumber), 
PageKind::Standard);
+        CPPUNIT_ASSERT(pPage);
+
+        std::string sHash = GetInterfaceHash(GetXDrawPageForSdrPage(pPage));
+        CPPUNIT_ASSERT(mpXImpressDocument->createSlideRenderer(
+            sHash.c_str(), mnSlideNumber, mnViewWidth, mnViewHeight, 
bRenderBackground,
+            bRenderMasterPage));
+    }
+
+    void checkSlideSize(sal_Int32 nViewWidth, sal_Int32 nViewHeight) const
+    {
+        CPPUNIT_ASSERT_EQUAL(nViewWidth, mnViewWidth);
+        CPPUNIT_ASSERT_EQUAL(nViewHeight, mnViewHeight);
+    }
+
+    void checkBackgroundLayer()
+    {
+        std::vector<sal_uInt8> pBuffer(mnViewWidth * mnViewHeight * 4);
+        bool bIsBitmapLayer = false;
+        double dScale = 1.0;
+        OUString aJson;
+        CPPUNIT_ASSERT(
+            !mpXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
+        debugWriteImageToFile(mnImageFileStep++, pBuffer, mnViewWidth, 
mnViewHeight,
+                              aJson.toUtf8().getStr());
+
+        boost::property_tree::ptree aTree;
+        readJSON(aTree, aJson);
+
+        CPPUNIT_ASSERT_EQUAL(std::string("Background"),
+                             
aTree.get_child("group").get_value<std::string>());
+        CPPUNIT_ASSERT_EQUAL(0, aTree.get_child("index").get_value<int>());
+        CPPUNIT_ASSERT_EQUAL(std::string("bitmap"),
+                             aTree.get_child("type").get_value<std::string>());
+        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
+    }
+
+    void checkTextFieldLayer(int nIndex, const std::string& rTextFieldType)
+    {
+        std::vector<sal_uInt8> pBuffer(mnViewWidth * mnViewHeight * 4);
+        bool bIsBitmapLayer = false;
+        double dScale = 1.0;
+        OUString aJson;
+        CPPUNIT_ASSERT(
+            !mpXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
+        CPPUNIT_ASSERT(bIsBitmapLayer);
+
+        debugWriteImageToFile(mnImageFileStep++, pBuffer, mnViewWidth, 
mnViewHeight,
+                              aJson.toUtf8().getStr());
+
+        boost::property_tree::ptree aTree;
+        readJSON(aTree, aJson);
+
+        CPPUNIT_ASSERT_EQUAL(std::string("TextFields"),
+                             
aTree.get_child("group").get_value<std::string>());
+        CPPUNIT_ASSERT_EQUAL(nIndex, 
aTree.get_child("index").get_value<int>());
+        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
+        {
+            auto aContentChild = aTree.get_child("content");
+            CPPUNIT_ASSERT_EQUAL(rTextFieldType,
+                                 
aContentChild.get_child("type").get_value<std::string>());
+            CPPUNIT_ASSERT_EQUAL(true, has_child(aContentChild, "content"));
+            auto aContentChildChild = aContentChild.get_child("content");
+            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGETYPE%"),
+                                 
aContentChildChild.get_child("type").get_value<std::string>());
+            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGECHECKSUM%"),
+                                 
aContentChildChild.get_child("checksum").get_value<std::string>());
+        }
+    }
+
+    void checkPlaceholderLayer(int index, const std::string& rTextFieldType)
+    {
+        std::vector<sal_uInt8> pBuffer(mnViewWidth * mnViewHeight * 4);
+        bool bIsBitmapLayer = true;
+        double dScale = 1.0;
+        OUString aJson;
+        CPPUNIT_ASSERT(
+            !mpXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
+        CPPUNIT_ASSERT(!bIsBitmapLayer);
+
+        boost::property_tree::ptree aTree;
+        readJSON(aTree, aJson);
+
+        CPPUNIT_ASSERT_EQUAL(std::string("MasterPage"),
+                             
aTree.get_child("group").get_value<std::string>());
+        CPPUNIT_ASSERT_EQUAL(index, aTree.get_child("index").get_value<int>());
+        CPPUNIT_ASSERT_EQUAL(std::string("placeholder"),
+                             aTree.get_child("type").get_value<std::string>());
+        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
+        {
+            auto aContentChild = aTree.get_child("content");
+            CPPUNIT_ASSERT_EQUAL(rTextFieldType,
+                                 
aContentChild.get_child("type").get_value<std::string>());
+        }
+    }
+
+    void checkPageLayer(int nIndex, const std::string& rGroup)
+    {
+        std::vector<sal_uInt8> pBuffer(mnViewWidth * mnViewHeight * 4);
+        bool bIsBitmapLayer = false;
+        double dScale = 1.0;
+        OUString aJson;
+        CPPUNIT_ASSERT(
+            !mpXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
+        CPPUNIT_ASSERT(bIsBitmapLayer);
+
+        debugWriteImageToFile(mnImageFileStep++, pBuffer, mnViewWidth, 
mnViewHeight,
+                              aJson.toUtf8().getStr());
+
+        boost::property_tree::ptree aTree;
+        readJSON(aTree, aJson);
+
+        CPPUNIT_ASSERT_EQUAL(rGroup, 
aTree.get_child("group").get_value<std::string>());
+        CPPUNIT_ASSERT_EQUAL(nIndex, 
aTree.get_child("index").get_value<int>());
+        CPPUNIT_ASSERT_EQUAL(std::string("bitmap"),
+                             aTree.get_child("type").get_value<std::string>());
+        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
+    }
+
+    void checkFinalEmptyLayer()
+    {
+        std::vector<sal_uInt8> pBuffer(mnViewWidth * mnViewHeight * 4);
+        bool bIsBitmapLayer = false;
+        double dScale = 1.0;
+        OUString aJson;
+        CPPUNIT_ASSERT(
+            mpXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
+        CPPUNIT_ASSERT(aJson.isEmpty());
+    }
+};
+} // end anonymous ns
+
 CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSlideshowLayeredRendering)
 {
     // Check rendering of slideshow layers (as in the document):
@@ -3159,210 +3315,82 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSlideshowLayeredRendering_SlideNu
 {
     SdXImpressDocument* pXImpressDocument = 
createDoc("SlideRenderingTest_SlideNumber_Header_DateTime.odp");
     
pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
-    sd::ViewShell* pViewShell = 
pXImpressDocument->GetDocShell()->GetViewShell();
-    CPPUNIT_ASSERT(pViewShell);
-    SdPage* pPage = pViewShell->GetActualPage();
-
-    CPPUNIT_ASSERT(pPage);
-    std::string sHash = GetInterfaceHash(GetXDrawPageForSdrPage(pPage));
-    sal_Int32 nViewWidth = 2000;
-    sal_Int32 nViewHeight = 2000;
-    CPPUNIT_ASSERT(pXImpressDocument->createSlideRenderer(sHash.c_str(), 0, 
nViewWidth, nViewHeight, true, true));
-    CPPUNIT_ASSERT_EQUAL(2000, nViewWidth);
-    CPPUNIT_ASSERT_EQUAL(1125, nViewHeight);
-
-    // Background Layer
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = false;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        debugWriteImageToFile(0, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
-
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
-
-        CPPUNIT_ASSERT_EQUAL(std::string("Background"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(0, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(std::string("bitmap"), 
aTree.get_child("type").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-    }
-
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = false;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(bIsBitmapLayer);
-
-        debugWriteImageToFile(1, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
-
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
-
-        CPPUNIT_ASSERT_EQUAL(std::string("TextFields"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(0, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-        {
-            auto aContentChild = aTree.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("SlideNumber"), 
aContentChild.get_child("type").get_value<std::string>());
-            CPPUNIT_ASSERT_EQUAL(true, has_child(aContentChild, "content"));
-            auto aContentChildChild = aContentChild.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGETYPE%"), 
aContentChildChild.get_child("type").get_value<std::string>());
-            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGECHECKSUM%"), 
aContentChildChild.get_child("checksum").get_value<std::string>());
-        }
-    }
+    SlideRendererChecker aSlideRendererChecker(pXImpressDocument, 0, 2000, 
2000);
+    aSlideRendererChecker.checkSlideSize(2000, 1125);
 
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = false;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(bIsBitmapLayer);
+    aSlideRendererChecker.checkBackgroundLayer();
 
-        debugWriteImageToFile(2, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
+    aSlideRendererChecker.checkTextFieldLayer(0, "SlideNumber");
+    aSlideRendererChecker.checkTextFieldLayer(1, "Footer");
+    aSlideRendererChecker.checkTextFieldLayer(2, "DateTime");
 
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
+    aSlideRendererChecker.checkPlaceholderLayer(0, "DateTime");
+    aSlideRendererChecker.checkPlaceholderLayer(1, "Footer");
+    aSlideRendererChecker.checkPlaceholderLayer(2, "SlideNumber");
 
-        CPPUNIT_ASSERT_EQUAL(std::string("TextFields"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(1, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-        {
-            auto aContentChild = aTree.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("Footer"), 
aContentChild.get_child("type").get_value<std::string>());
-            CPPUNIT_ASSERT_EQUAL(true, has_child(aContentChild, "content"));
-            auto aContentChildChild = aContentChild.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGETYPE%"), 
aContentChildChild.get_child("type").get_value<std::string>());
-            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGECHECKSUM%"), 
aContentChildChild.get_child("checksum").get_value<std::string>());
-        }
-    }
-
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = false;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(bIsBitmapLayer);
+    aSlideRendererChecker.checkPageLayer(0, "DrawPage");
 
-        debugWriteImageToFile(3, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
+    aSlideRendererChecker.checkFinalEmptyLayer();
 
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
+    pXImpressDocument->postSlideshowCleanup();
+}
 
-        CPPUNIT_ASSERT_EQUAL(std::string("TextFields"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(2, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-        {
-            auto aContentChild = aTree.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("DateTime"), 
aContentChild.get_child("type").get_value<std::string>());
-            CPPUNIT_ASSERT_EQUAL(true, has_child(aContentChild, "content"));
-            auto aContentChildChild = aContentChild.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGETYPE%"), 
aContentChildChild.get_child("type").get_value<std::string>());
-            CPPUNIT_ASSERT_EQUAL(std::string("%IMAGECHECKSUM%"), 
aContentChildChild.get_child("checksum").get_value<std::string>());
-        }
-    }
+CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSlideshowLayeredRendering_Skip_Background)
+{
+    SdXImpressDocument* pXImpressDocument = 
createDoc("SlideRenderingTest_SlideNumber_Header_DateTime.odp");
+    
pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+    SlideRendererChecker aSlideRendererChecker(pXImpressDocument, 0, 2000, 
2000, false, true);
+    aSlideRendererChecker.checkSlideSize(2000, 1125);
 
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = true;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(!bIsBitmapLayer);
+    aSlideRendererChecker.checkTextFieldLayer(0, "SlideNumber");
+    aSlideRendererChecker.checkTextFieldLayer(1, "Footer");
+    aSlideRendererChecker.checkTextFieldLayer(2, "DateTime");
 
-        debugWriteImageToFile(4, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
+    aSlideRendererChecker.checkPlaceholderLayer(0, "DateTime");
+    aSlideRendererChecker.checkPlaceholderLayer(1, "Footer");
+    aSlideRendererChecker.checkPlaceholderLayer(2, "SlideNumber");
 
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
+    aSlideRendererChecker.checkPageLayer(0, "DrawPage");
 
-        CPPUNIT_ASSERT_EQUAL(std::string("MasterPage"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(0, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(std::string("placeholder"), 
aTree.get_child("type").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-        {
-            auto aContentChild = aTree.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("DateTime"), 
aContentChild.get_child("type").get_value<std::string>());
-        }
-    }
+    aSlideRendererChecker.checkFinalEmptyLayer();
 
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = true;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(!bIsBitmapLayer);
+    pXImpressDocument->postSlideshowCleanup();
+}
 
-        debugWriteImageToFile(5, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
+CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSlideshowLayeredRendering_Skip_MasterPage)
+{
+    SdXImpressDocument* pXImpressDocument = 
createDoc("SlideRenderingTest_SlideNumber_Header_DateTime.odp");
+    
pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+    SlideRendererChecker aSlideRendererChecker(pXImpressDocument, 0, 2000, 
2000, true, false);
+    aSlideRendererChecker.checkSlideSize(2000, 1125);
 
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
+    aSlideRendererChecker.checkBackgroundLayer();
 
-        CPPUNIT_ASSERT_EQUAL(std::string("MasterPage"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(1, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(std::string("placeholder"), 
aTree.get_child("type").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-        {
-            auto aContentChild = aTree.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("Footer"), 
aContentChild.get_child("type").get_value<std::string>());
-       }
-    }
-
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = true;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(!bIsBitmapLayer);
+    aSlideRendererChecker.checkTextFieldLayer(0, "SlideNumber");
+    aSlideRendererChecker.checkTextFieldLayer(1, "Footer");
+    aSlideRendererChecker.checkTextFieldLayer(2, "DateTime");
 
-        debugWriteImageToFile(6, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
+    aSlideRendererChecker.checkPageLayer(0, "DrawPage");
 
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
+    aSlideRendererChecker.checkFinalEmptyLayer();
 
-        CPPUNIT_ASSERT_EQUAL(std::string("MasterPage"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(2, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(std::string("placeholder"), 
aTree.get_child("type").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-        {
-            auto aContentChild = aTree.get_child("content");
-            CPPUNIT_ASSERT_EQUAL(std::string("SlideNumber"), 
aContentChild.get_child("type").get_value<std::string>());
-        }
-    }
-
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = false;
-        OUString aJson;
-        double dScale = 1.0;
-        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(bIsBitmapLayer);
+    pXImpressDocument->postSlideshowCleanup();
+}
 
-        debugWriteImageToFile(7, pBuffer, nViewWidth, nViewHeight, 
aJson.toUtf8().getStr());
+CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSlideshowLayeredRendering_Skip_Background_And_MasterPage)
+{
+    SdXImpressDocument* pXImpressDocument = 
createDoc("SlideRenderingTest_SlideNumber_Header_DateTime.odp");
+    
pXImpressDocument->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+    SlideRendererChecker aSlideRendererChecker(pXImpressDocument, 0, 2000, 
2000, false, false);
+    aSlideRendererChecker.checkSlideSize(2000, 1125);
 
-        boost::property_tree::ptree aTree;
-        readJSON(aTree, aJson);
+    aSlideRendererChecker.checkTextFieldLayer(0, "SlideNumber");
+    aSlideRendererChecker.checkTextFieldLayer(1, "Footer");
+    aSlideRendererChecker.checkTextFieldLayer(2, "DateTime");
 
-        CPPUNIT_ASSERT_EQUAL(std::string("DrawPage"), 
aTree.get_child("group").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(0, aTree.get_child("index").get_value<int>());
-        CPPUNIT_ASSERT_EQUAL(std::string("bitmap"), 
aTree.get_child("type").get_value<std::string>());
-        CPPUNIT_ASSERT_EQUAL(true, has_child(aTree, "content"));
-    }
+    aSlideRendererChecker.checkPageLayer(0, "DrawPage");
 
-    {
-        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
-        bool bIsBitmapLayer = false;
-        OUString aJson;
-        double dScale = 1.0;
-        CPPUNIT_ASSERT(pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, dScale, aJson));
-        CPPUNIT_ASSERT(aJson.isEmpty());
-    }
+    aSlideRendererChecker.checkFinalEmptyLayer();
 
     pXImpressDocument->postSlideshowCleanup();
 }
diff --git a/sd/source/ui/inc/SlideshowLayerRenderer.hxx 
b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
index 0c3ee8a025d8..42794e0e6c6f 100644
--- a/sd/source/ui/inc/SlideshowLayerRenderer.hxx
+++ b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
@@ -130,6 +130,8 @@ private:
     SdrModel& mrModel;
     Size maSlideSize;
     RenderState maRenderState;
+    bool mbRenderBackground;
+    bool mbRenderMasterPage;
 
     void createViewAndDraw(const RenderContext& rRenderContext,
                            sdr::contact::ViewObjectContactRedirector* 
pRedirector);
@@ -141,7 +143,7 @@ private:
     void resolveEffect(CustomAnimationEffectPtr const& rEffect);
 
 public:
-    SlideshowLayerRenderer(SdrPage& rPage);
+    SlideshowLayerRenderer(SdrPage& rPage, bool bRenderBackground, bool 
bRenderMasterPage);
 
     /** Calculate and set the slide size depending on input desired size (in 
pixels)
      *
diff --git a/sd/source/ui/tools/SlideshowLayerRenderer.cxx 
b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
index 2a3462f2dd79..bae2821fbefe 100644
--- a/sd/source/ui/tools/SlideshowLayerRenderer.cxx
+++ b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
@@ -270,6 +270,7 @@ class AnalyzeRenderingRedirector : public 
sdr::contact::ViewObjectContactRedirec
 {
 private:
     RenderState& mrRenderState;
+    bool mbRenderMasterPage;
 
     RenderPass* mpCurrentRenderPass;
     RenderStage mePreviousStage = RenderStage::Master;
@@ -298,8 +299,9 @@ private:
     }
 
 public:
-    AnalyzeRenderingRedirector(RenderState& rRenderState)
+    AnalyzeRenderingRedirector(RenderState& rRenderState, bool 
bRenderMasterPage)
         : mrRenderState(rRenderState)
+        , mbRenderMasterPage(bRenderMasterPage)
         , mpCurrentRenderPass(newRenderPass())
     {
     }
@@ -362,15 +364,18 @@ public:
             // A placeholder always needs to be exported even if the content 
is hidden
             // since it could be visible on another slide and master page 
layers should be cached
             // on the client
-            closeRenderPass();
-
-            mpCurrentRenderPass->maObjectsAndParagraphs.emplace(pObject, 
std::deque<sal_Int32>());
-            mpCurrentRenderPass->meStage = eCurrentStage;
-            mpCurrentRenderPass->mbPlaceholder = true;
-            mpCurrentRenderPass->maFieldType = sTextFieldType;
-            mpCurrentRenderPass->mpObject = pObject;
-            closeRenderPass();
+            if (mbRenderMasterPage)
+            {
+                closeRenderPass();
 
+                mpCurrentRenderPass->maObjectsAndParagraphs.emplace(pObject,
+                                                                    
std::deque<sal_Int32>());
+                mpCurrentRenderPass->meStage = eCurrentStage;
+                mpCurrentRenderPass->mbPlaceholder = true;
+                mpCurrentRenderPass->maFieldType = sTextFieldType;
+                mpCurrentRenderPass->mpObject = pObject;
+                closeRenderPass();
+            }
             // Collect text field content if it's visible
             // Both checks are needed!
             if (bVisible && bIsTextFieldVisible)
@@ -386,6 +391,9 @@ public:
             return;
         }
 
+        if (!mbRenderMasterPage && eCurrentStage == RenderStage::Master)
+            return;
+
         if (!bVisible)
             return;
 
@@ -519,9 +527,12 @@ SdrObject* 
getObjectForShape(uno::Reference<drawing::XShape> const& xShape)
 
 } // end anonymous namespace
 
-SlideshowLayerRenderer::SlideshowLayerRenderer(SdrPage& rPage)
+SlideshowLayerRenderer::SlideshowLayerRenderer(SdrPage& rPage, bool 
bRenderBackground,
+                                               bool bRenderMasterPage)
     : mrPage(rPage)
     , mrModel(rPage.getSdrModelFromSdrPage())
+    , mbRenderBackground(bRenderBackground)
+    , mbRenderMasterPage(bRenderMasterPage)
 {
     maRenderState.meStage = RenderStage::Background;
     setupAnimations();
@@ -678,7 +689,7 @@ void SlideshowLayerRenderer::createViewAndDraw(
     aView.SetGridVisible(false);
     aView.SetHlplVisible(false);
     aView.SetGlueVisible(false);
-    aView.setHideBackground(!maRenderState.includeBackground());
+    aView.setHideBackground(!(mbRenderBackground && 
maRenderState.includeBackground()));
     aView.ShowSdrPage(&mrPage);
 
     Size aPageSize(mrPage.GetSize());
@@ -885,16 +896,24 @@ bool SlideshowLayerRenderer::render(unsigned char* 
pBuffer, bool& bIsBitmapLayer
     if (maRenderState.meStage == RenderStage::Background)
     {
         // Render no objects, just the background, but analyze and create 
rendering passes
-        AnalyzeRenderingRedirector aRedirector(maRenderState);
+        AnalyzeRenderingRedirector aRedirector(maRenderState, 
mbRenderMasterPage);
         createViewAndDraw(aRenderContext, &aRedirector);
         aRedirector.finalizeRenderPasses();
 
-        bIsBitmapLayer = true;
+        if (mbRenderBackground)
+        {
+            bIsBitmapLayer = true;
+
+            // Write JSON for the Background layer
+            writeBackgroundJSON(rJsonMsg);
+        }
 
-        // Write JSON for the Background layer
-        writeBackgroundJSON(rJsonMsg);
+        maRenderState.meStage = mbRenderMasterPage ? RenderStage::Master : 
RenderStage::Slide;
 
-        maRenderState.meStage = RenderStage::Master;
+        // We need to return a valid layer, so if background has to be skipped
+        // render the next layer
+        if (!mbRenderBackground)
+            render(pBuffer, bIsBitmapLayer, rScale, rJsonMsg);
     }
     else
     {
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 13044d967437..1fc8039f06fa 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -4755,7 +4755,7 @@ bool isRequestedSlideValid(SdDrawDocument* mpDoc, 
sal_Int32 nSlideNumber, const
 bool SdXImpressDocument::createSlideRenderer(
     const OString& rSlideHash,
     sal_Int32 nSlideNumber, sal_Int32& nViewWidth, sal_Int32& nViewHeight,
-    bool /*bRenderBackground*/, bool /*bRenderMasterPage*/)
+    bool bRenderBackground, bool bRenderMasterPage)
 {
     std::string sSlideHash(rSlideHash);
     if (!isRequestedSlideValid(mpDoc, nSlideNumber, sSlideHash))
@@ -4765,7 +4765,7 @@ bool SdXImpressDocument::createSlideRenderer(
     if (!pPage)
         return false;
 
-    mpSlideshowLayerRenderer.reset(new SlideshowLayerRenderer(*pPage));
+    mpSlideshowLayerRenderer.reset(new SlideshowLayerRenderer(*pPage, 
bRenderBackground, bRenderMasterPage));
     Size aDesiredSize(nViewWidth, nViewHeight);
     Size aCalculatedSize = 
mpSlideshowLayerRenderer->calculateAndSetSizePixel(aDesiredSize);
     nViewWidth = aCalculatedSize.Width();

Reply via email to