sd/source/ui/inc/SlideshowLayerRenderer.hxx   |    8 +
 sd/source/ui/tools/SlideshowLayerRenderer.cxx |  150 ++++++++++++--------------
 2 files changed, 80 insertions(+), 78 deletions(-)

New commits:
commit b8b5da4119791c886365c250a2ae51e601fed111
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Mon Aug 19 20:51:18 2024 +0200
Commit:     Szymon Kłos <szymon.k...@collabora.com>
CommitDate: Wed Sep 4 14:34:22 2024 +0200

    intruduce RenderContext, RenderOptions to remove code duplication
    
    To remove code duplication when rendering main and master slide,
    it is needed to put them into common code, so add RenderContext
    and RenderOptions classes to put the common code into those.
    
    Change-Id: Icf4039f85e0aa5bf4d43e6fe5efb725c90504173
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172172
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Szymon Kłos <szymon.k...@collabora.com>

diff --git a/sd/source/ui/inc/SlideshowLayerRenderer.hxx 
b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
index 33c2ca69d502..2f51c6e39b76 100644
--- a/sd/source/ui/inc/SlideshowLayerRenderer.hxx
+++ b/sd/source/ui/inc/SlideshowLayerRenderer.hxx
@@ -21,6 +21,9 @@ class Size;
 
 namespace sd
 {
+struct RenderContext;
+struct RenderOptions;
+
 enum class SlideRenderStage
 {
     Master,
@@ -31,11 +34,14 @@ class SD_DLLPUBLIC SlideshowLayerRenderer
 {
     SdrPage& mrPage;
     SdrModel& mrModel;
-
     Size maSlideSize;
 
     std::deque<SlideRenderStage> maRenderStages;
 
+    void cleanupRendering(RenderContext& rRenderContext);
+    void setupRendering(unsigned char* pBuffer, RenderContext& rRenderContext);
+    void createViewAndDraw(RenderContext& rRenderContext, RenderOptions const& 
rRenderOptions);
+
 public:
     SlideshowLayerRenderer(SdrPage& rPage);
     Size calculateAndSetSizePixel(Size const& rDesiredSizePixel);
diff --git a/sd/source/ui/tools/SlideshowLayerRenderer.cxx 
b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
index 5f6fe8d7eda1..c6ad73a21e27 100644
--- a/sd/source/ui/tools/SlideshowLayerRenderer.cxx
+++ b/sd/source/ui/tools/SlideshowLayerRenderer.cxx
@@ -20,24 +20,70 @@
 #include <vcl/virdev.hxx>
 #include <tools/helpers.hxx>
 #include <tools/json_writer.hxx>
+#include <editeng/editeng.hxx>
 
 namespace sd
 {
-namespace
-{
-struct RedirectorOptions
+struct RenderOptions
 {
+    bool mbIncludeBackground = true;
     bool mbSkipMainPageObjects = false;
     bool mbSkipMasterPageObjects = false;
 };
 
+struct RenderContext
+{
+    SdrModel& mrModel;
+    SdrPage& mrPage;
+
+    EEControlBits mnSavedControlBits;
+    ScopedVclPtrInstance<VirtualDevice> maVirtualDevice;
+
+    RenderContext(unsigned char* pBuffer, SdrModel& rModel, SdrPage& rPage, 
Size const& rSlideSize)
+        : mrModel(rModel)
+        , mrPage(rPage)
+        , maVirtualDevice(DeviceFormat::WITHOUT_ALPHA)
+    {
+        // Turn of spelling
+        SdrOutliner& rOutliner = mrModel.GetDrawOutliner();
+        mnSavedControlBits = rOutliner.GetControlWord();
+        rOutliner.SetControlWord(mnSavedControlBits & 
~EEControlBits::ONLINESPELLING);
+
+        maVirtualDevice->SetBackground(Wallpaper(COL_TRANSPARENT));
+
+        maVirtualDevice->SetOutputSizePixelScaleOffsetAndLOKBuffer(rSlideSize, 
Fraction(1.0),
+                                                                   Point(), 
pBuffer);
+        Size aPageSize(mrPage.GetSize());
+
+        MapMode aMapMode(MapUnit::Map100thMM);
+        const Fraction aFracX(rSlideSize.Width(),
+                              maVirtualDevice->LogicToPixel(aPageSize, 
aMapMode).Width());
+        aMapMode.SetScaleX(aFracX);
+
+        const Fraction aFracY(rSlideSize.Height(),
+                              maVirtualDevice->LogicToPixel(aPageSize, 
aMapMode).Height());
+        aMapMode.SetScaleY(aFracY);
+
+        maVirtualDevice->SetMapMode(aMapMode);
+    }
+
+    ~RenderContext()
+    {
+        // Restore spelling
+        SdrOutliner& rOutliner = mrModel.GetDrawOutliner();
+        rOutliner.SetControlWord(mnSavedControlBits);
+    }
+};
+
+namespace
+{
 class ObjectRedirector : public sdr::contact::ViewObjectContactRedirector
 {
 protected:
-    RedirectorOptions maOptions;
+    RenderOptions maOptions;
 
 public:
-    ObjectRedirector(RedirectorOptions const& rOptions)
+    ObjectRedirector(RenderOptions const& rOptions)
         : maOptions(rOptions)
     {
     }
@@ -115,34 +161,10 @@ Size 
SlideshowLayerRenderer::calculateAndSetSizePixel(Size const& rDesiredSizePi
     return maSlideSize;
 }
 
-bool SlideshowLayerRenderer::renderMaster(unsigned char* pBuffer, OString& 
rJsonMsg)
+void SlideshowLayerRenderer::createViewAndDraw(RenderContext& rRenderContext,
+                                               RenderOptions const& 
rRenderOptions)
 {
-    SdrOutliner& rOutliner = mrModel.GetDrawOutliner();
-    const EEControlBits nOldControlBits(rOutliner.GetControlWord());
-    EEControlBits nControlBits = nOldControlBits & 
~EEControlBits::ONLINESPELLING;
-    rOutliner.SetControlWord(nControlBits);
-
-    ScopedVclPtrInstance<VirtualDevice> 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);
-
+    SdrView aView(mrModel, rRenderContext.maVirtualDevice);
     aView.SetPageVisible(false);
     aView.SetPageShadowVisible(false);
     aView.SetPageBorderVisible(false);
@@ -150,12 +172,24 @@ bool SlideshowLayerRenderer::renderMaster(unsigned char* 
pBuffer, OString& rJson
     aView.SetGridVisible(false);
     aView.SetHlplVisible(false);
     aView.SetGlueVisible(false);
-    aView.setHideBackground(false);
+    aView.setHideBackground(!rRenderOptions.mbIncludeBackground);
     aView.ShowSdrPage(&mrPage);
 
+    Size aPageSize(mrPage.GetSize());
+    Point aPoint;
+
     vcl::Region aRegion(::tools::Rectangle(aPoint, aPageSize));
-    ObjectRedirector aRedirector({ .mbSkipMainPageObjects = true });
-    aView.CompleteRedraw(pDevice, aRegion, &aRedirector);
+    ObjectRedirector aRedirector(rRenderOptions);
+    aView.CompleteRedraw(rRenderContext.maVirtualDevice, aRegion, 
&aRedirector);
+}
+
+bool SlideshowLayerRenderer::renderMaster(unsigned char* pBuffer, OString& 
rJsonMsg)
+{
+    RenderOptions aRenderOptions;
+    aRenderOptions.mbSkipMainPageObjects = true;
+
+    RenderContext aRenderContext(pBuffer, mrModel, mrPage, maSlideSize);
+    createViewAndDraw(aRenderContext, aRenderOptions);
 
     ::tools::JsonWriter aJsonWriter;
     aJsonWriter.put("group", "MasterPage");
@@ -169,52 +203,16 @@ bool SlideshowLayerRenderer::renderMaster(unsigned char* 
pBuffer, OString& rJson
     }
     rJsonMsg = aJsonWriter.finishAndGetAsOString();
 
-    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<VirtualDevice> 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);
+    RenderOptions aRenderOptions;
+    aRenderOptions.mbSkipMasterPageObjects = true;
 
-    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);
+    RenderContext aRenderContext(pBuffer, mrModel, mrPage, maSlideSize);
+    createViewAndDraw(aRenderContext, aRenderOptions);
 
     ::tools::JsonWriter aJsonWriter;
     aJsonWriter.put("group", "DrawPage");
@@ -228,8 +226,6 @@ bool SlideshowLayerRenderer::renderSlide(unsigned char* 
pBuffer, OString& rJsonM
     }
     rJsonMsg = aJsonWriter.finishAndGetAsOString();
 
-    rOutliner.SetControlWord(nOldControlBits);
-
     return true;
 }
 

Reply via email to