sd/qa/unit/tiledrendering/data/anim.odp       |binary
 sd/qa/unit/tiledrendering/tiledrendering.cxx  |   35 ++++++++++++++++++++++++++
 sd/source/ui/inc/SlideshowLayerRenderer.hxx   |   35 +++++++++-----------------
 sd/source/ui/tools/SlideshowLayerRenderer.cxx |   18 +++++++++----
 4 files changed, 61 insertions(+), 27 deletions(-)

New commits:
commit d87e4e331b1d7a5a1b399281e74596f7ca313c4f
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Mon Sep 9 17:34:03 2024 +0200
Commit:     Marco Cecchetti <marco.cecche...@collabora.com>
CommitDate: Mon Sep 9 22:09:05 2024 +0200

    lok: slideshow: render background as separate layer
    
    we still take color from the JSON
    
    Change-Id: I6b83cc8aaaa3e9127d85ec06589bac7ed4472f71
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/173083
    Reviewed-by: Marco Cecchetti <marco.cecche...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/sd/qa/unit/tiledrendering/data/anim.odp 
b/sd/qa/unit/tiledrendering/data/anim.odp
new file mode 100644
index 000000000000..b508d48f8a43
Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/anim.odp differ
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx 
b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index e2670232b9cc..b84d0dbbf390 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -3213,6 +3213,15 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSlideshowLayeredRendering)
     CPPUNIT_ASSERT_EQUAL(1125, nViewHeight);
 
     const Color aTransparentColor(ColorAlpha, 0x00000000);
+
+    // Background Layer - TODO
+    {
+        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
+        bool bIsBitmapLayer = false;
+        OUString rJsonMsg;
+        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, rJsonMsg));
+    }
+
     {
         std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
         bool bIsBitmapLayer = false;
@@ -3283,6 +3292,15 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSlideshowLayeredRendering_WithFie
     CPPUNIT_ASSERT_EQUAL(1125, nViewHeight);
 
     const Color aTransparentColor(ColorAlpha, 0x00000000);
+
+    // Background Layer - TODO
+    {
+        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
+        bool bIsBitmapLayer = false;
+        OUString rJsonMsg;
+        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, rJsonMsg));
+    }
+
     {
         std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
         bool bIsBitmapLayer = false;
@@ -3370,6 +3388,23 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testSlideshowLayeredRendering_Animati
     CPPUNIT_ASSERT_EQUAL(2000, nViewWidth);
     CPPUNIT_ASSERT_EQUAL(1125, nViewHeight);
 
+    {
+        std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
+        bool bIsBitmapLayer = false;
+        OUString rJsonMsg;
+        
CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), 
bIsBitmapLayer, rJsonMsg));
+        CPPUNIT_ASSERT(bIsBitmapLayer);
+
+        CPPUNIT_ASSERT(rJsonMsg.indexOf(u"\"group\": \"Background\"") >= 0);
+        CPPUNIT_ASSERT(rJsonMsg.indexOf(u"\"index\": 0") >= 0);
+        CPPUNIT_ASSERT_EQUAL(-1, rJsonMsg.indexOf(u"\"hash\""));
+        CPPUNIT_ASSERT_EQUAL(-1, rJsonMsg.indexOf(u"\"initVisible\""));
+        CPPUNIT_ASSERT(rJsonMsg.indexOf(u"\"type\": \"bitmap\"") >= 0);
+        CPPUNIT_ASSERT(rJsonMsg.indexOf(u"\"content\": { \"type\": 
\"%IMAGETYPE%\", \"checksum\": \"%IMAGECHECKSUM%\"}") >= 0);
+
+        debugWriteImageToFile(0, pBuffer, nViewWidth, nViewHeight, 
rJsonMsg.toUtf8().getStr());
+    }
+
     {
         std::vector<sal_uInt8> pBuffer(nViewWidth * nViewHeight * 4);
         bool bIsBitmapLayer = false;
diff --git a/sd/source/ui/inc/SlideshowLayerRenderer.hxx 
b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
index 0ee0e3f1e147..30a8e94b262d 100644
--- a/sd/source/ui/inc/SlideshowLayerRenderer.hxx
+++ b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
@@ -28,22 +28,24 @@ struct RenderContext;
 
 enum class RenderStage
 {
+    Background,
     Master,
-    Slide
+    Slide,
+    TextFields,
+    Count
 };
 
 /** Holds rendering state, properties and switches through all rendering 
passes */
 struct RenderState
 {
-    RenderStage meStage = RenderStage::Master;
+    RenderStage meStage = RenderStage::Background;
 
-    sal_Int32 mnMasterIndex = 0;
     bool mbStopRenderingWhenField = true;
 
     std::unordered_set<SdrObject*> maObjectsDone;
     std::unordered_set<SdrObject*> maInAnimation;
     std::map<SdrObject*, bool> maInitiallyVisible;
-    sal_Int32 mnIndex = 0;
+    sal_Int32 mnIndex[static_cast<unsigned>(RenderStage::Count)] = { 0, 0, 0, 
0 };
     SdrObject* mpCurrentTarget = nullptr;
 
     bool mbFirstObjectInPass = true;
@@ -53,29 +55,22 @@ struct RenderState
     sal_Int32 mnCurrentPass = 0;
 
     /// increments index depending on the current render stage
-    void incrementIndex()
-    {
-        if (meStage == RenderStage::Master)
-            mnMasterIndex++;
-        else
-            mnIndex++;
-    }
+    void incrementIndex() { mnIndex[static_cast<unsigned>(meStage)]++; }
 
     /// returns the current stage as string
     OString stageString() const
     {
         if (meStage == RenderStage::Master)
             return "MasterPage"_ostr;
+        else if (meStage == RenderStage::Background)
+            return "Background"_ostr;
+        else if (meStage == RenderStage::TextFields)
+            return "TextFields"_ostr;
         return "DrawPage"_ostr;
     }
 
     /// returns the current index depending on the current render stage
-    sal_Int32 currentIndex() const
-    {
-        if (meStage == RenderStage::Master)
-            return mnMasterIndex;
-        return mnIndex;
-    }
+    sal_Int32 currentIndex() const { return 
mnIndex[static_cast<unsigned>(meStage)]; }
 
     /// returns the current target element for which layer is created if any
     SdrObject* currentTarget() const { return mpCurrentTarget; }
@@ -97,11 +92,7 @@ struct RenderState
     }
 
     /// should include background in rendering
-    bool includeBackground() const
-    {
-        // include background only if we are rendering the first pass
-        return mnCurrentPass == 0;
-    }
+    bool includeBackground() const { return meStage == 
RenderStage::Background; }
 
     bool isObjectAlreadyRendered(SdrObject* pObject) const
     {
diff --git a/sd/source/ui/tools/SlideshowLayerRenderer.cxx 
b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
index 3c6a175ff9c1..1305a651863a 100644
--- a/sd/source/ui/tools/SlideshowLayerRenderer.cxx
+++ b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
@@ -117,6 +117,12 @@ public:
         const sdr::contact::DisplayInfo& rDisplayInfo,
         drawinglayer::primitive2d::Primitive2DDecompositionVisitor& rVisitor) 
override
     {
+        if (mrRenderState.meStage == RenderStage::Background)
+        {
+            mrRenderState.mbSkipAllInThisPass = true;
+            return;
+        }
+
         if (mrRenderState.mbSkipAllInThisPass)
             return;
 
@@ -204,11 +210,7 @@ SlideshowLayerRenderer::SlideshowLayerRenderer(SdrPage& 
rPage)
     : mrPage(rPage)
     , mrModel(rPage.getSdrModelFromSdrPage())
 {
-    if (!hasEmptyMaster(rPage))
-        maRenderState.meStage = RenderStage::Master;
-    else
-        maRenderState.meStage = RenderStage::Slide;
-
+    maRenderState.meStage = RenderStage::Background;
     setupAnimations();
 }
 
@@ -401,6 +403,12 @@ bool SlideshowLayerRenderer::render(unsigned char* 
pBuffer, OString& rJsonMsg)
 
     maRenderState.mnCurrentPass++;
 
+    if (maRenderState.meStage == RenderStage::Background)
+        maRenderState.meStage = RenderStage::Master;
+
+    if (hasEmptyMaster(mrPage))
+        maRenderState.meStage = RenderStage::Slide;
+
     return true;
 }
 

Reply via email to