tdf#105362 better support for transparency in PNG & GIF export

The granularity to decide at the SdrView what to paint was not
fine enough, so I added code to get what we need: Do avoid
page decorations (including PageBackgrund aka 'wiese'), but
do include/process MasterPage content.

Change-Id: I49df05abc89b4bcebc973c37d30be0a0c72e59ea
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154301
Tested-by: Jenkins
Reviewed-by: Armin Le Grand <Armin.Le.Grand@me.com>
diff --git a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx
index 15cac92..1cd90c0 100644
--- a/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx
+++ b/chart2/source/controller/drawinglayer/DrawViewWrapper.cxx
@@ -81,7 +81,6 @@ DrawViewWrapper::DrawViewWrapper(
{
    SetBufferedOutputAllowed(true);
    SetBufferedOverlayAllowed(true);
    SetPagePaintingAllowed(true);

    // #i12587# support for shapes in chart
    SdrOutliner* pOutliner = getOutliner();
diff --git a/include/svx/sdr/contact/displayinfo.hxx b/include/svx/sdr/contact/displayinfo.hxx
index 7075b04..b222904 100644
--- a/include/svx/sdr/contact/displayinfo.hxx
+++ b/include/svx/sdr/contact/displayinfo.hxx
@@ -46,13 +46,6 @@ namespace sdr::contact
            // painting when the control layer needs to be painted as last layer
            bool                                            mbControlLayerProcessingActive : 1;

            // Internal flag to decide if page stuff (background, border, MasterPage, grid, etc...)
            // will be processed at all. This flag is user-defined and will not be changed from the
            // processing mechanism. Default is true, thus set to false if PagePainting should be suppressed.
            // For more granular switching page stuff painting on and off, use the according flags at the
            // view (->Is*Visible())
            bool                                            mbPageProcessingActive : 1;

            // Internal flag to remember if EnteredGroupDrawMode is active. Default is true
            // since this mode starts activated and gets switched off when reaching
            // the current group level. Should only be changed by instances which do
@@ -83,10 +76,6 @@ namespace sdr::contact
            void SetControlLayerProcessingActive(bool bDoPaint);
            bool GetControlLayerProcessingActive() const { return mbControlLayerProcessingActive; }

            // Access to PageProcessingActive flag
            void SetPageProcessingActive(bool bDoPaint);
            bool GetPageProcessingActive() const { return mbPageProcessingActive; }

            // Save the original DrawMode from outdev
            void ClearGhostedDrawMode();
            void SetGhostedDrawMode();
diff --git a/include/svx/sdr/contact/objectcontact.hxx b/include/svx/sdr/contact/objectcontact.hxx
index 40d631f..f38eb76 100644
--- a/include/svx/sdr/contact/objectcontact.hxx
+++ b/include/svx/sdr/contact/objectcontact.hxx
@@ -136,6 +136,12 @@ public:
    // print? Default is false
    virtual bool isOutputToPrinter() const;

    // display page decoration? Default is true
    virtual bool isPageDecorationActive() const;

    // display mster page content (ViewContactOfMasterPage)? Default is true
    virtual bool isMasterPageActive() const;

    // recording MetaFile? Default is false
    virtual bool isOutputToRecordingMetaFile() const;

diff --git a/include/svx/sdr/contact/objectcontactofpageview.hxx b/include/svx/sdr/contact/objectcontactofpageview.hxx
index 1512542..bc99975 100644
--- a/include/svx/sdr/contact/objectcontactofpageview.hxx
+++ b/include/svx/sdr/contact/objectcontactofpageview.hxx
@@ -87,6 +87,12 @@ namespace sdr::contact
            // print? Default is false
            virtual bool isOutputToPrinter() const override;

            // display page decoration? Default is true
            virtual bool isPageDecorationActive() const override;

            // display mster page content (ViewContactOfMasterPage)? Default is true
            virtual bool isMasterPageActive() const override;

            // recording MetaFile? Default is false
            virtual bool isOutputToRecordingMetaFile() const override;

diff --git a/include/svx/svdpntv.hxx b/include/svx/svdpntv.hxx
index f6be42e..661c8e3 100644
--- a/include/svx/svdpntv.hxx
+++ b/include/svx/svdpntv.hxx
@@ -177,8 +177,27 @@ protected:
    // directly painted to OutDev. Default is sal_False.
    bool mbBufferedOverlayAllowed : 1;

    // Allow page painting at all?
    bool mbPagePaintingAllowed : 1;
    // Allow page decorations? Quick way to switch on/off all of page's decoration features,
    // in addition to the more fine-granular other view settings (see *visible bools above).
    // Default is true.
    // This controls processing of the hierarchy elements:
    // -ViewContactOfPageBackground: formally known as 'Wiese', the area behind the page
    // -ViewContactOfPageShadow: page's shadow
    // -ViewContactOfPageFill: the page's fill with PageColor/PaperColor
    //   (MasterPage content here, not affected by this flag)
    // -ViewContactOfOuterPageBorder: the border around the page
    // -ViewContactOfInnerPageBorder: The border inside the page, moved inside by PageBorder distances
    // -ViewContactOfGrid: the page's grid visualisation (background)
    // -ViewContactOfHelplines: the page's Helplines (background)
    //   (Page content here, not affected by this flag)
    // -ViewContactOfGrid: the page's grid visualisation (foreground)
    // -ViewContactOfHelplines: the page's Helplines (foreground)
    // Note: background/foreground means that one is active, grid & helplines can be displayed in
    //       front of or behind obect visualisations/page content
    bool mbPageDecorationAllowed : 1;

    // Allow MasterPage visualization, default is true
    bool mbMasterPageVisualizationAllowed : 1;

    // Is this a preview renderer?
    bool mbPreviewRenderer : 1;
@@ -191,7 +210,7 @@ protected:
    bool mbPaintTextEdit : 1;        // if should paint currently edited text

public:
    // Interface for PagePaintingAllowed flag
    // Interface for BufferedOoutputAllowed flag
    bool IsBufferedOutputAllowed() const;
    void SetBufferedOutputAllowed(bool bNew);

@@ -199,9 +218,13 @@ public:
    bool IsBufferedOverlayAllowed() const;
    void SetBufferedOverlayAllowed(bool bNew);

    // Allow page painting at all?
    bool IsPagePaintingAllowed() const { return mbPagePaintingAllowed;}
    void SetPagePaintingAllowed(bool bNew);
    // Allow page decorations? See details above at mbPageDecorationAllowed declaration
    bool IsPageDecorationAllowed() const { return mbPageDecorationAllowed;}
    void SetPageDecorationAllowed(bool bNew);

    // Allow MasterPage visualization, default is true
    bool IsMasterPageVisualizationAllowed() const { return mbMasterPageVisualizationAllowed;}
    void SetMasterPageVisualizationAllowed(bool bNew);

    virtual rtl::Reference<sdr::overlay::OverlayManager> CreateOverlayManager(OutputDevice& rDevice) const;

diff --git a/reportdesign/source/ui/report/SectionView.cxx b/reportdesign/source/ui/report/SectionView.cxx
index f3da302..e5c425a 100644
--- a/reportdesign/source/ui/report/SectionView.cxx
+++ b/reportdesign/source/ui/report/SectionView.cxx
@@ -39,7 +39,6 @@ OSectionView::OSectionView(
    ,m_pReportWindow( pEditor )
    ,m_pSectionWindow(_pSectionWindow)
{
    // SetPagePaintingAllowed(false);
    SetBufferedOutputAllowed(true);
    SetBufferedOverlayAllowed(true);
    SetPageBorderVisible(false);
diff --git a/sd/source/ui/tools/PreviewRenderer.cxx b/sd/source/ui/tools/PreviewRenderer.cxx
index 3677355..d3fc73b 100644
--- a/sd/source/ui/tools/PreviewRenderer.cxx
+++ b/sd/source/ui/tools/PreviewRenderer.cxx
@@ -399,20 +399,12 @@ void PreviewRenderer::ProvideView (DrawDocShell* pDocShell)
        mpView.reset (new DrawView (pDocShell, mpPreviewDevice.get(), nullptr));
    }
    mpView->SetPreviewRenderer(true);
#if 1
    mpView->SetPageVisible(false);
    mpView->SetPageBorderVisible();
    mpView->SetBordVisible(false);
    mpView->SetGridVisible(false);
    mpView->SetHlplVisible(false);
    mpView->SetGlueVisible(false);

#else
    // This works in the slide sorter but prevents the master page
    // background being painted in the list of current master pages in the
    // task manager.
    mpView->SetPagePaintingAllowed(false);
#endif
}

Image PreviewRenderer::ScaleBitmap (
diff --git a/svx/source/dialog/graphctl.cxx b/svx/source/dialog/graphctl.cxx
index 56c1509..cf127d6 100644
--- a/svx/source/dialog/graphctl.cxx
+++ b/svx/source/dialog/graphctl.cxx
@@ -142,7 +142,8 @@ void GraphCtrl::InitSdrModel()
    pView->SetEditMode();

    // #i72889# set needed flags
    pView->SetPagePaintingAllowed(false);
    pView->SetPageDecorationAllowed(false);
    pView->SetMasterPageVisualizationAllowed(false);
    pView->SetBufferedOutputAllowed(true);
    pView->SetBufferedOverlayAllowed(true);

diff --git a/svx/source/sdr/contact/displayinfo.cxx b/svx/source/sdr/contact/displayinfo.cxx
index 405fb41..1c76b70a 100644
--- a/svx/source/sdr/contact/displayinfo.cxx
+++ b/svx/source/sdr/contact/displayinfo.cxx
@@ -25,7 +25,6 @@ namespace sdr::contact
        DisplayInfo::DisplayInfo()
        :   maProcessLayers(true), // init layer info with all bits set to draw everything on default
            mbControlLayerProcessingActive(false),
            mbPageProcessingActive(true),
            mbGhostedDrawModeActive(false),
            mbSubContentActive(false)
        {
@@ -56,14 +55,6 @@ namespace sdr::contact
            }
        }

        void DisplayInfo::SetPageProcessingActive(bool bDoProcess)
        {
            if(mbPageProcessingActive != bDoProcess)
            {
                mbPageProcessingActive = bDoProcess;
            }
        }

        void DisplayInfo::ClearGhostedDrawMode()
        {
            mbGhostedDrawModeActive = false;
diff --git a/svx/source/sdr/contact/objectcontact.cxx b/svx/source/sdr/contact/objectcontact.cxx
index 4555068..b09966c 100644
--- a/svx/source/sdr/contact/objectcontact.cxx
+++ b/svx/source/sdr/contact/objectcontact.cxx
@@ -159,6 +159,18 @@ bool ObjectContact::isOutputToPrinter() const
    return false;
}

// display page decoration? Default is true
bool ObjectContact::isPageDecorationActive() const
{
    return true;
}

// display mster page content (ViewContactOfMasterPage)? Default is true
bool ObjectContact::isMasterPageActive() const
{
    return true;
}

// recording MetaFile? Default is false
bool ObjectContact::isOutputToRecordingMetaFile() const
{
diff --git a/svx/source/sdr/contact/objectcontactofpageview.cxx b/svx/source/sdr/contact/objectcontactofpageview.cxx
index e07cf01..1c69822 100644
--- a/svx/source/sdr/contact/objectcontactofpageview.cxx
+++ b/svx/source/sdr/contact/objectcontactofpageview.cxx
@@ -379,6 +379,18 @@ namespace sdr::contact
            return (OUTDEV_PRINTER == mrPageWindow.GetPaintWindow().GetOutputDevice().GetOutDevType());
        }

        // display page decoration? Default is true
        bool ObjectContactOfPageView::isPageDecorationActive() const
        {
            return GetPageWindow().GetPageView().GetView().IsPageDecorationAllowed();
        }

        // display mster page content (ViewContactOfMasterPage)? Default is true
        bool ObjectContactOfPageView::isMasterPageActive() const
        {
            return GetPageWindow().GetPageView().GetView().IsMasterPageVisualizationAllowed();
        }

        // recording MetaFile?
        bool ObjectContactOfPageView::isOutputToRecordingMetaFile() const
        {
diff --git a/svx/source/sdr/contact/viewcontactofsdrpage.cxx b/svx/source/sdr/contact/viewcontactofsdrpage.cxx
index 0f04045..83193c9 100644
--- a/svx/source/sdr/contact/viewcontactofsdrpage.cxx
+++ b/svx/source/sdr/contact/viewcontactofsdrpage.cxx
@@ -493,7 +493,7 @@ sal_uInt32 ViewContactOfSdrPage::GetObjectCount() const
    // or MPBGO. Also OuterPageBorder, InnerPageBorder and two pairs of Grid and Helplines
    // (for front and back) which internally are visible or not depending on the current
    // front/back setting for those.
    return 11;
    return 10;
}

ViewContact& ViewContactOfSdrPage::GetViewContact(sal_uInt32 nIndex) const
@@ -522,7 +522,7 @@ ViewContact& ViewContactOfSdrPage::GetViewContact(sal_uInt32 nIndex) const
        case 7: return const_cast<ViewContactOfHelplines&>(maViewContactOfHelplinesBack);
        case 8: return const_cast<ViewContactOfPageHierarchy&>(maViewContactOfPageHierarchy);
        case 9: return const_cast<ViewContactOfGrid&>(maViewContactOfGridFront);
        case 10: case 11: return const_cast<ViewContactOfHelplines&>(maViewContactOfHelplinesFront);
        case 10: return const_cast<ViewContactOfHelplines&>(maViewContactOfHelplinesFront);
        default: assert(false);return const_cast<ViewContactOfHelplines&>(maViewContactOfHelplinesFront);
    }
}
diff --git a/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx b/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx
index f96ed11..baa039b 100644
--- a/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofmasterpagedescriptor.cxx
@@ -46,7 +46,8 @@ namespace sdr::contact
                return false;
            }

            if(!rDisplayInfo.GetPageProcessingActive())
            // display mster page content?
            if (!GetObjectContact().isMasterPageActive())
            {
                return false;
            }
diff --git a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
index d66d385..9430ac5 100644
--- a/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofpageobj.cxx
@@ -65,6 +65,8 @@ public:

    // forward access to SdrPageView of ViewObjectContactOfPageObj
    virtual bool isOutputToPrinter() const override;
    virtual bool isPageDecorationActive() const override;
    virtual bool isMasterPageActive() const override;
    virtual bool isOutputToRecordingMetaFile() const override;
    virtual bool isOutputToPDFFile() const override;
    virtual bool isExportTaggedPDF() const override;
@@ -177,6 +179,8 @@ void PagePrimitiveExtractor::InvalidatePartOfView(const basegfx::B2DRange& rRang

// forward access to SdrPageView to VOCOfPageObj
bool PagePrimitiveExtractor::isOutputToPrinter() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToPrinter(); }
bool PagePrimitiveExtractor::isPageDecorationActive() const { return mrViewObjectContactOfPageObj.GetObjectContact().isPageDecorationActive(); }
bool PagePrimitiveExtractor::isMasterPageActive() const { return mrViewObjectContactOfPageObj.GetObjectContact().isMasterPageActive(); }
bool PagePrimitiveExtractor::isOutputToRecordingMetaFile() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToRecordingMetaFile(); }
bool PagePrimitiveExtractor::isOutputToPDFFile() const { return mrViewObjectContactOfPageObj.GetObjectContact().isOutputToPDFFile(); }
bool PagePrimitiveExtractor::isExportTaggedPDF() const { return mrViewObjectContactOfPageObj.GetObjectContact().isExportTaggedPDF(); }
diff --git a/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx b/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx
index fe9855f..3cc2710 100644
--- a/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofsdrpage.cxx
@@ -63,7 +63,7 @@ bool ViewObjectContactOfPageSubObject::isPrimitiveVisible(const DisplayInfo& rDi
        return false;
    }

    if(!rDisplayInfo.GetPageProcessingActive())
    if(!GetObjectContact().isPageDecorationActive())
    {
        return false;
    }
diff --git a/svx/source/svdraw/sdrpagewindow.cxx b/svx/source/svdraw/sdrpagewindow.cxx
index 123d1d2..e975b20 100644
--- a/svx/source/svdraw/sdrpagewindow.cxx
+++ b/svx/source/svdraw/sdrpagewindow.cxx
@@ -350,9 +350,6 @@ void SdrPageWindow::RedrawAll( sdr::contact::ViewObjectContactRedirector* pRedir
        // Set region as redraw area
        aDisplayInfo.SetRedrawArea(rRegion);

        // Draw/Impress
        aDisplayInfo.SetPageProcessingActive(rView.IsPagePaintingAllowed()); // #i72889#

        // paint page
        GetObjectContact().ProcessDisplay(aDisplayInfo);
    }
@@ -411,8 +408,11 @@ void SdrPageWindow::RedrawLayer(const SdrLayerID* pId,
        aDisplayInfo.SetRedrawArea(rRegion);

        // Writer or calc, coming from original RedrawOneLayer.
        // #i72889# no page painting for layer painting
        aDisplayInfo.SetPageProcessingActive(false);
        // #i72889# no page painting or MasterPage painting for layer painting
        const bool bOldPageDecorationAllowed(GetPageView().GetView().IsPageDecorationAllowed());
        const bool bOldMasterPageVisualizationAllowed(GetPageView().GetView().IsMasterPageVisualizationAllowed());
        GetPageView().GetView().SetPageDecorationAllowed(false);
        GetPageView().GetView().SetMasterPageVisualizationAllowed(false);

        if (pPageFrame) // Writer page frame for anchor based clipping
        {
@@ -421,6 +421,10 @@ void SdrPageWindow::RedrawLayer(const SdrLayerID* pId,

        // paint page
        GetObjectContact().ProcessDisplay(aDisplayInfo);

        // reset temporarily changed flags
        GetPageView().GetView().SetPageDecorationAllowed(bOldPageDecorationAllowed);
        GetPageView().GetView().SetMasterPageVisualizationAllowed(bOldMasterPageVisualizationAllowed);
    }

    // reset redirector
diff --git a/svx/source/svdraw/svdpntv.cxx b/svx/source/svdraw/svdpntv.cxx
index ca4fee0..da46896 100644
--- a/svx/source/svdraw/svdpntv.cxx
+++ b/svx/source/svdraw/svdpntv.cxx
@@ -158,7 +158,8 @@ SdrPaintView::SdrPaintView(SdrModel& rSdrModel, OutputDevice* pOut)
    , mbAnimationPause(false)
    , mbBufferedOutputAllowed(false)
    , mbBufferedOverlayAllowed(false)
    , mbPagePaintingAllowed(true)
    , mbPageDecorationAllowed(true)
    , mbMasterPageVisualizationAllowed(true)
    , mbPreviewRenderer(false)
    , mbHideOle(false)
    , mbHideChart(false)
@@ -1182,11 +1183,19 @@ void SdrPaintView::SetBufferedOverlayAllowed(bool bNew)
}


void SdrPaintView::SetPagePaintingAllowed(bool bNew)
void SdrPaintView::SetPageDecorationAllowed(bool bNew)
{
    if(bNew != mbPagePaintingAllowed)
    if(bNew != mbPageDecorationAllowed)
    {
        mbPagePaintingAllowed = bNew;
        mbPageDecorationAllowed = bNew;
    }
}

void SdrPaintView::SetMasterPageVisualizationAllowed(bool bNew)
{
    if(bNew != mbMasterPageVisualizationAllowed)
    {
        mbMasterPageVisualizationAllowed = bNew;
    }
}

diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx b/svx/source/unodraw/UnoGraphicExporter.cxx
index 6698dd0e..2e8a776 100644
--- a/svx/source/unodraw/UnoGraphicExporter.cxx
+++ b/svx/source/unodraw/UnoGraphicExporter.cxx
@@ -719,9 +719,10 @@ bool GraphicExporter::GetGraphic( ExportSettings const & rSettings, Graphic& aGr
                pView->SetPageVisible( false );
                pView->ShowSdrPage( pPage );

                // tdf#96922 completely deactivate EditView PageVisualization, including
                // PageBackground (formerly 'wiese').
                pView->SetPagePaintingAllowed(false);
                // tdf#96922 deactivate EditView PageVisualization, including PageBackground
                // (formerly 'wiese'). Do *not* switch off MasterPageVisualizationAllowed, we
                // want MasterPage content if a whole SdrPage is exported
                pView->SetPageDecorationAllowed(false);

                const Point aNewOrg( pPage->GetLeftBorder(), pPage->GetUpperBorder() );
                aNewSize = Size( aSize.Width() - pPage->GetLeftBorder() - pPage->GetRightBorder(),