From 981ce9b3a95d68bc88cf8c9b6fe5c9e6f17a75ef Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Fri, 15 Nov 2024 13:20:06 +0100 Subject: [PATCH] render master and slide content separately (drawinglayer render) This renders master and the main slide as 2 separate layers, which is useful because in a huge slideshow we can reuse the master slide and only render the rest of the slide, which should be more compact in size as the master slide is the one that usually contains the (complex) background. Change-Id: I5e86d718b7ab3b03bd0b6146ce4df218a4dd72d4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176622 Tested-by: Jenkins Reviewed-by: Miklos Vajna --- include/svx/svdpntv.hxx | 6 +- .../data/SlideRenderingTest.odp | Bin 29095 -> 26099 bytes sd/qa/unit/tiledrendering/tiledrendering.cxx | 66 +++++-- sd/source/ui/inc/SlideshowLayerRenderer.hxx | 21 ++- sd/source/ui/tools/SlideshowLayerRenderer.cxx | 165 +++++++++++++++--- sd/source/ui/unoidl/unomodel.cxx | 2 +- ...iewobjectcontactofmasterpagedescriptor.cxx | 7 +- svx/source/svdraw/svdpntv.cxx | 1 + 8 files changed, 219 insertions(+), 49 deletions(-) diff --git a/include/svx/svdpntv.hxx b/include/svx/svdpntv.hxx index 8665262f0508..df3c95131590 100644 --- a/include/svx/svdpntv.hxx +++ b/include/svx/svdpntv.hxx @@ -207,7 +207,8 @@ protected: bool mbHideChart : 1; bool mbHideDraw : 1; // hide draw objects other than form controls bool mbHideFormControl : 1; // hide form controls only - bool mbPaintTextEdit : 1; // if should paint currently edited text + bool mbHideBackground : 1; // don't draw the (page's or matser page's) background + bool mbPaintTextEdit : 1; // if should paint currently edited text public: // Interface for BufferedOoutputAllowed flag @@ -473,10 +474,13 @@ public: bool getHideChart() const { return mbHideChart; } bool getHideDraw() const { return mbHideDraw; } bool getHideFormControl() const { return mbHideFormControl; } + bool getHideBackground() const { return mbHideBackground; } + void setHideOle(bool bNew) { if(bNew != mbHideOle) mbHideOle = bNew; } void setHideChart(bool bNew) { if(bNew != mbHideChart) mbHideChart = bNew; } void setHideDraw(bool bNew) { if(bNew != mbHideDraw) mbHideDraw = bNew; } void setHideFormControl(bool bNew) { if(bNew != mbHideFormControl) mbHideFormControl = bNew; } + void setHideBackground(bool bNew) { mbHideBackground = bNew; } void SetGridCoarse(const Size& rSiz) { maGridBig=rSiz; } void SetGridFine(const Size& rSiz) { diff --git a/sd/qa/unit/tiledrendering/data/SlideRenderingTest.odp b/sd/qa/unit/tiledrendering/data/SlideRenderingTest.odp index 4c7d4f101e3281f06f1442b22fda1c8ad08e64ca..8ffd7d38f051d27ba46198cf7db11e644d89197e 100644 GIT binary patch literal 26099 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 K5HEdxx%VFkEs?7L literal 29095 zcmb4q1yCJLv*^Ks1$TFXYjAgWcMA}LI|MmsaMu9gpdq+RaF<}gEx08(!R4HNeE+R` z>%FS~{Z)5sx29)yd%CB4dbg*iS5pN65g!CX0fF*TUm5W-R(<0Hfk6LUFHIn42WML^ ze>YnzH#a8-8!ImdR~Jqnmv#F^T^T<_lqOYpef+_3!ApdAQoY zFzflBF-iXoJvUc3Z?}Jl{s%s({tcdkvz5KAC#ST7m$Q|d=YK%{cZ2kDb#?mRv-%H~ zo0W^L)Blp1os+ATm+gNN>Aw?<=ZoIG|1W`}prHI~KE24|e-5-4$kWT;$<~v@&)MnJ zOeJks(4+gwfJw04lWr)>oUeNI_vPT!S^EdOqK;FPrv|u`2 zdP@{k1ATx�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

FMh_N}Pq5AN0> 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 HbM*fJ*Z{3L diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index 11b740ebdc74..0ab9ca8a3723 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -3125,8 +3125,9 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSlideshowLayeredRendering) // The document has nothing set for the background, so it should be application color = white // On the master slide there is a (blue) rectangle on the right side - top-left should be transparent // On the main slide there is a (green) rectangle on the top-left size - right side should be transparent - // enable layer output to PNG files - const bool bOutputPNG = false; + + const bool bOutputPNG = false; // Control layer output to PNG files + SdXImpressDocument* pXImpressDocument = createDoc("SlideRenderingTest.odp"); pXImpressDocument->initializeForTiledRendering(uno::Sequence()); sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); @@ -3137,16 +3138,18 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSlideshowLayeredRendering) sal_Int32 nViewHeight = 2000; CPPUNIT_ASSERT(pXImpressDocument->createSlideRenderer(0, nViewWidth, nViewHeight, true, true)); CPPUNIT_ASSERT_EQUAL(2000, nViewWidth); - CPPUNIT_ASSERT_EQUAL(1125, nViewHeight); // adjusted to the slide aspect ratio - std::vector pBuffer(nViewWidth * nViewHeight * 4); - bool bIsBitmapLayer = false; - OUString rJsonMsg; + CPPUNIT_ASSERT_EQUAL(1125, nViewHeight); - CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), bIsBitmapLayer, rJsonMsg)); - CPPUNIT_ASSERT(bIsBitmapLayer); - // TODO - check JSON content - // printf ("1 %s\n\n", rJsonMsg.toUtf8().getStr()); + const Color aTransparentColor(ColorAlpha, 0x00000000); { + std::vector pBuffer(nViewWidth * nViewHeight * 4); + bool bIsBitmapLayer = false; + OUString rJsonMsg; + CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), bIsBitmapLayer, rJsonMsg)); + CPPUNIT_ASSERT(bIsBitmapLayer); + // TODO - check JSON content + // printf ("1 %s\n\n", rJsonMsg.toUtf8().getStr()); + BitmapEx aBitmapEx = vcl::bitmap::CreateFromData(pBuffer.data(), nViewWidth, nViewHeight, nViewWidth * 4, /*nBitsPerPixel*/32, true, true); if (bOutputPNG) { @@ -3155,14 +3158,49 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSlideshowLayeredRendering) aPNGWriter.write(aBitmapEx); } + // top-left corner + CPPUNIT_ASSERT_EQUAL(aTransparentColor, aBitmapEx.GetPixelColor(20, 20)); + // bottom-left corner - CPPUNIT_ASSERT_EQUAL(Color(ColorAlpha, 0x00000000), aBitmapEx.GetPixelColor(20, nViewHeight - 20)); + CPPUNIT_ASSERT_EQUAL(aTransparentColor, aBitmapEx.GetPixelColor(20, nViewHeight - 20)); // bottom-right corner - CPPUNIT_ASSERT_EQUAL(Color(0xff, 0xd5, 0x46), aBitmapEx.GetPixelColor(nViewWidth - 20, nViewHeight - 20)); + CPPUNIT_ASSERT_EQUAL(Color(0xff, 0xd0, 0x40), aBitmapEx.GetPixelColor(nViewWidth - 20, nViewHeight - 20)); + } + + { + std::vector pBuffer(nViewWidth * nViewHeight * 4); + bool bIsBitmapLayer = false; + OUString rJsonMsg; + CPPUNIT_ASSERT(!pXImpressDocument->renderNextSlideLayer(pBuffer.data(), bIsBitmapLayer, rJsonMsg)); + CPPUNIT_ASSERT(bIsBitmapLayer); + // TODO - check JSON content + // printf ("2 %s\n\n", rJsonMsg.toUtf8().getStr()); + + BitmapEx aBitmapEx = vcl::bitmap::CreateFromData(pBuffer.data(), nViewWidth, nViewHeight, nViewWidth * 4, /*nBitsPerPixel*/32, true, true); + if (bOutputPNG) + { + SvFileStream aStream("/home/quikee/XXX_02.png", StreamMode::WRITE | StreamMode::TRUNC); + vcl::PngImageWriter aPNGWriter(aStream); + aPNGWriter.write(aBitmapEx); + } + + // top-left corner + CPPUNIT_ASSERT_EQUAL(Color(0x00, 0x50, 0x90), aBitmapEx.GetPixelColor(20, 20)); + + // bottom-left corner + CPPUNIT_ASSERT_EQUAL(aTransparentColor, aBitmapEx.GetPixelColor(20, nViewHeight - 20)); + + // bottom-right corner + CPPUNIT_ASSERT_EQUAL(aTransparentColor, aBitmapEx.GetPixelColor(nViewWidth - 20, nViewHeight - 20)); + } + + { + std::vector pBuffer(nViewWidth * nViewHeight * 4); + bool bIsBitmapLayer = false; + OUString rJsonMsg; + CPPUNIT_ASSERT(pXImpressDocument->renderNextSlideLayer(pBuffer.data(), bIsBitmapLayer, rJsonMsg)); } - // should return true - no more content - CPPUNIT_ASSERT(pXImpressDocument->renderNextSlideLayer(pBuffer.data(), bIsBitmapLayer, rJsonMsg)); pXImpressDocument->postSlideshowCleanup(); } diff --git a/sd/source/ui/inc/SlideshowLayerRenderer.hxx b/sd/source/ui/inc/SlideshowLayerRenderer.hxx index 28525839d579..33c2ca69d502 100644 --- a/sd/source/ui/inc/SlideshowLayerRenderer.hxx +++ b/sd/source/ui/inc/SlideshowLayerRenderer.hxx @@ -12,23 +12,36 @@ #include #include #include +#include class SdrPage; -class BitmapEx; +class SdrModel; + class Size; namespace sd { +enum class SlideRenderStage +{ + Master, + Slide +}; + class SD_DLLPUBLIC SlideshowLayerRenderer { - SdrPage* mpPage; + SdrPage& mrPage; + SdrModel& mrModel; + Size maSlideSize; - bool bRenderDone = false; + + std::deque maRenderStages; public: - SlideshowLayerRenderer(SdrPage* pPage); + SlideshowLayerRenderer(SdrPage& rPage); Size calculateAndSetSizePixel(Size const& rDesiredSizePixel); bool render(unsigned char* pBuffer, OString& rJsonMsg); + bool renderMaster(unsigned char* pBuffer, OString& rJsonMsg); + bool renderSlide(unsigned char* pBuffer, OString& rJsonMsg); }; } // end of namespace sd diff --git a/sd/source/ui/tools/SlideshowLayerRenderer.cxx b/sd/source/ui/tools/SlideshowLayerRenderer.cxx index 4bcdc25b9190..ec238d3a139f 100644 --- a/sd/source/ui/tools/SlideshowLayerRenderer.cxx +++ b/sd/source/ui/tools/SlideshowLayerRenderer.cxx @@ -14,7 +14,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -23,9 +25,23 @@ namespace sd { namespace { -class SelectObjectRedirector : public sdr::contact::ViewObjectContactRedirector +struct RedirectorOptions { + bool mbSkipMainPageObjects = false; + bool mbSkipMasterPageObjects = false; +}; + +class ObjectRedirector : public sdr::contact::ViewObjectContactRedirector +{ +protected: + RedirectorOptions maOptions; + public: + ObjectRedirector(RedirectorOptions const& rOptions) + : maOptions(rOptions) + { + } + virtual void createRedirectedPrimitive2DSequence( const sdr::contact::ViewObjectContact& rOriginal, const sdr::contact::DisplayInfo& rDisplayInfo, @@ -37,12 +53,15 @@ public: if (pObject == nullptr || pPage == nullptr) { // Not a SdrObject or a object not connected to a page (object with no page) - - //sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence( - // rOriginal, rDisplayInfo, rVisitor); return; } + if (maOptions.mbSkipMasterPageObjects && pPage->IsMasterPage()) + return; + + if (maOptions.mbSkipMainPageObjects && !pPage->IsMasterPage()) + return; + const bool bDoCreateGeometry( pObject->getSdrPageFromSdrObject()->checkVisibility(rOriginal, rDisplayInfo, true)); @@ -60,43 +79,57 @@ public: rOriginal, rDisplayInfo, rVisitor); } }; + +bool hasEmptyMaster(SdrPage const& rPage) +{ + if (!rPage.TRG_HasMasterPage()) + return true; + + SdrPage& rMaster = rPage.TRG_GetMasterPage(); + for (size_t i = 0; i < rMaster.GetObjCount(); i++) + { + auto pObject = rMaster.GetObj(i); + if (!pObject->IsEmptyPresObj()) + return false; + } + return true; } -SlideshowLayerRenderer::SlideshowLayerRenderer(SdrPage* pPage) - : mpPage(pPage) +} // end anonymous namespace + +SlideshowLayerRenderer::SlideshowLayerRenderer(SdrPage& rPage) + : mrPage(rPage) + , mrModel(rPage.getSdrModelFromSdrPage()) { + if (!hasEmptyMaster(rPage)) + maRenderStages.emplace_back(SlideRenderStage::Master); + maRenderStages.emplace_back(SlideRenderStage::Slide); } Size SlideshowLayerRenderer::calculateAndSetSizePixel(Size const& rDesiredSizePixel) { - if (!mpPage) - return Size(); - - double fRatio = double(mpPage->GetHeight()) / mpPage->GetWidth(); + double fRatio = double(mrPage.GetHeight()) / mrPage.GetWidth(); Size aSize(rDesiredSizePixel.Width(), ::tools::Long(rDesiredSizePixel.Width() * fRatio)); maSlideSize = aSize; return maSlideSize; } -bool SlideshowLayerRenderer::render(unsigned char* pBuffer, OString& rJsonMsg) +bool SlideshowLayerRenderer::renderMaster(unsigned char* pBuffer, OString& rJsonMsg) { - if (bRenderDone) - return false; - - if (!mpPage) - return false; - - SdrModel& rModel = mpPage->getSdrModelFromSdrPage(); + SdrOutliner& rOutliner = mrModel.GetDrawOutliner(); + const EEControlBits nOldControlBits(rOutliner.GetControlWord()); + EEControlBits nControlBits = nOldControlBits & ~EEControlBits::ONLINESPELLING; + rOutliner.SetControlWord(nControlBits); ScopedVclPtrInstance pDevice(DeviceFormat::WITHOUT_ALPHA); pDevice->SetBackground(Wallpaper(COL_TRANSPARENT)); - pDevice->SetOutputSizePixelScaleOffsetAndLOKBuffer(maSlideSize, Fraction(2.0), Point(), + pDevice->SetOutputSizePixelScaleOffsetAndLOKBuffer(maSlideSize, Fraction(1.0), Point(), pBuffer); Point aPoint; - Size aPageSize(mpPage->GetSize()); + Size aPageSize(mrPage.GetSize()); MapMode aMapMode(MapUnit::Map100thMM); const Fraction aFracX(maSlideSize.Width(), pDevice->LogicToPixel(aPageSize, aMapMode).Width()); @@ -108,7 +141,7 @@ bool SlideshowLayerRenderer::render(unsigned char* pBuffer, OString& rJsonMsg) pDevice->SetMapMode(aMapMode); - SdrView aView(rModel, pDevice); + SdrView aView(mrModel, pDevice); aView.SetPageVisible(false); aView.SetPageShadowVisible(false); @@ -117,16 +150,16 @@ bool SlideshowLayerRenderer::render(unsigned char* pBuffer, OString& rJsonMsg) aView.SetGridVisible(false); aView.SetHlplVisible(false); aView.SetGlueVisible(false); - - aView.ShowSdrPage(mpPage); + aView.setHideBackground(false); + aView.ShowSdrPage(&mrPage); vcl::Region aRegion(::tools::Rectangle(aPoint, aPageSize)); - SelectObjectRedirector aRedirector; + ObjectRedirector aRedirector({ .mbSkipMainPageObjects = true }); aView.CompleteRedraw(pDevice, aRegion, &aRedirector); ::tools::JsonWriter aJsonWriter; - aJsonWriter.put("group", "DrawPage"); - aJsonWriter.put("slideHash", GetInterfaceHash(GetXDrawPageForSdrPage(mpPage))); + aJsonWriter.put("group", "MasterPage"); + aJsonWriter.put("slideHash", GetInterfaceHash(GetXDrawPageForSdrPage(&mrPage))); aJsonWriter.put("index", 0); aJsonWriter.put("type", "bitmap"); { @@ -136,7 +169,85 @@ bool SlideshowLayerRenderer::render(unsigned char* pBuffer, OString& rJsonMsg) } rJsonMsg = aJsonWriter.finishAndGetAsOString(); - bRenderDone = true; + rOutliner.SetControlWord(nOldControlBits); + + return true; +} + +bool SlideshowLayerRenderer::renderSlide(unsigned char* pBuffer, OString& rJsonMsg) +{ + SdrOutliner& rOutliner = mrModel.GetDrawOutliner(); + const EEControlBits nOldControlBits(rOutliner.GetControlWord()); + EEControlBits nControlBits = nOldControlBits & ~EEControlBits::ONLINESPELLING; + rOutliner.SetControlWord(nControlBits); + + ScopedVclPtrInstance pDevice(DeviceFormat::WITHOUT_ALPHA); + pDevice->SetBackground(Wallpaper(COL_TRANSPARENT)); + + pDevice->SetOutputSizePixelScaleOffsetAndLOKBuffer(maSlideSize, Fraction(1.0), Point(), + pBuffer); + + Point aPoint; + Size aPageSize(mrPage.GetSize()); + + MapMode aMapMode(MapUnit::Map100thMM); + const Fraction aFracX(maSlideSize.Width(), pDevice->LogicToPixel(aPageSize, aMapMode).Width()); + aMapMode.SetScaleX(aFracX); + + const Fraction aFracY(maSlideSize.Height(), + pDevice->LogicToPixel(aPageSize, aMapMode).Height()); + aMapMode.SetScaleY(aFracY); + + pDevice->SetMapMode(aMapMode); + + SdrView aView(mrModel, pDevice); + + aView.SetPageVisible(false); + aView.SetPageShadowVisible(false); + aView.SetPageBorderVisible(false); + aView.SetBordVisible(false); + aView.SetGridVisible(false); + aView.SetHlplVisible(false); + aView.SetGlueVisible(false); + aView.setHideBackground(true); + aView.ShowSdrPage(&mrPage); + + vcl::Region aRegion(::tools::Rectangle(aPoint, aPageSize)); + ObjectRedirector aRedirector({ .mbSkipMasterPageObjects = true }); + aView.CompleteRedraw(pDevice, aRegion, &aRedirector); + + ::tools::JsonWriter aJsonWriter; + aJsonWriter.put("group", "DrawPage"); + aJsonWriter.put("slideHash", GetInterfaceHash(GetXDrawPageForSdrPage(&mrPage))); + aJsonWriter.put("index", 0); + aJsonWriter.put("type", "bitmap"); + { + auto aContentNode = aJsonWriter.startNode("content"); + aJsonWriter.put("type", "%IMAGETYPE%"); + aJsonWriter.put("checksum", "%IMAGECHECKSUM%"); + } + rJsonMsg = aJsonWriter.finishAndGetAsOString(); + + rOutliner.SetControlWord(nOldControlBits); + + return true; +} + +bool SlideshowLayerRenderer::render(unsigned char* pBuffer, OString& rJsonMsg) +{ + if (maRenderStages.empty()) + return false; + + auto eRenderStage = maRenderStages.front(); + maRenderStages.pop_front(); + + switch (eRenderStage) + { + case SlideRenderStage::Master: + return renderMaster(pBuffer, rJsonMsg); + case SlideRenderStage::Slide: + return renderSlide(pBuffer, rJsonMsg); + }; return true; } diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx index 845ee623e4af..347fc52f1e1f 100644 --- a/sd/source/ui/unoidl/unomodel.cxx +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -4457,7 +4457,7 @@ bool SdXImpressDocument::createSlideRenderer( if (!pPage) return false; - mpSlideshowLayerRenderer.reset(new SlideshowLayerRenderer(pPage)); + mpSlideshowLayerRenderer.reset(new SlideshowLayerRenderer(*pPage)); Size aDesiredSize(nViewWidth, nViewHeight); Size aCalculatedSize = mpSlideshowLayerRenderer->calculateAndSetSizePixel(aDesiredSize); nViewWidth = aCalculatedSize.Width(); diff --git a/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx b/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx index baa039b1bb0f..2cd4b64c2fe8 100644 --- a/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx +++ b/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -78,12 +80,13 @@ namespace sdr::contact aPreprocessedLayers &= rDescriptor.GetVisibleLayers(); rDisplayInfo.SetProcessLayers(aPreprocessedLayers); rDisplayInfo.SetSubContentActive(true); - + const SdrPageView* pSdrPageView = GetObjectContact().TryToGetSdrPageView(); + bool bHideBackground = pSdrPageView ? pSdrPageView->GetView().getHideBackground() : false; // check layer visibility (traditionally was member of layer 1) if(aPreprocessedLayers.IsSet(SdrLayerID(1))) { // hide PageBackground for special DrawModes; historical reasons - if(!GetObjectContact().isDrawModeGray() && !GetObjectContact().isDrawModeHighContrast()) + if (!bHideBackground && !GetObjectContact().isDrawModeGray() && !GetObjectContact().isDrawModeHighContrast()) { // if visible, create the default background primitive sequence static_cast< ViewContactOfMasterPageDescriptor& >(GetViewContact()).getViewIndependentPrimitive2DContainer(rVisitor); diff --git a/svx/source/svdraw/svdpntv.cxx b/svx/source/svdraw/svdpntv.cxx index 5874acb1c63d..de1e42a5e6cb 100644 --- a/svx/source/svdraw/svdpntv.cxx +++ b/svx/source/svdraw/svdpntv.cxx @@ -165,6 +165,7 @@ SdrPaintView::SdrPaintView(SdrModel& rSdrModel, OutputDevice* pOut) , mbHideChart(false) , mbHideDraw(false) , mbHideFormControl(false) + , mbHideBackground(false) , mbPaintTextEdit(true) , maGridColor(COL_BLACK) {