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; }