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();