return SalBitmap using std::shared_ptr

since we hold it like that in Bitmap anyway

Change-Id: I6264dfaaae6210cb008df5db8a421fc80c508f5b
Reviewed-on: https://gerrit.libreoffice.org/55458
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/include/vcl/bitmap.hxx b/include/vcl/bitmap.hxx
index aa330fd..b304baa 100644
--- a/include/vcl/bitmap.hxx
+++ b/include/vcl/bitmap.hxx
@@ -28,6 +28,7 @@
#include <vcl/region.hxx>
#include <vcl/scopedbitmapaccess.hxx>
#include <o3tl/typed_flags_set.hxx>
#include <memory>

class Color;

@@ -124,7 +125,7 @@ public:
                            Bitmap();
                            Bitmap( const Bitmap& rBitmap );
                            Bitmap( const Size& rSizePixel, sal_uInt16 nBitCount, const BitmapPalette* pPal = nullptr );
    explicit                Bitmap( SalBitmap* pSalBitmap );
    explicit                Bitmap( std::shared_ptr<SalBitmap> const & xSalBitmap );
    virtual                 ~Bitmap();

    Bitmap&                 operator=( const Bitmap& rBitmap );
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 4b505042..9163d8c 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -1309,9 +1309,9 @@ void SvpSalGraphics::drawMask( const SalTwoRect& rTR,
    releaseCairoContext(cr, false, extents);
}

SalBitmap* SvpSalGraphics::getBitmap( long nX, long nY, long nWidth, long nHeight )
std::shared_ptr<SalBitmap> SvpSalGraphics::getBitmap( long nX, long nY, long nWidth, long nHeight )
{
    SvpSalBitmap* pBitmap = new SvpSalBitmap();
    std::shared_ptr<SvpSalBitmap> pBitmap = std::make_shared<SvpSalBitmap>();
    BitmapPalette aPal;
    if (GetBitCount() == 1)
    {
@@ -1323,7 +1323,6 @@ SalBitmap* SvpSalGraphics::getBitmap( long nX, long nY, long nWidth, long nHeigh
    if (!pBitmap->Create(Size(nWidth, nHeight), GetBitCount(), aPal))
    {
        SAL_WARN("vcl.gdi", "SvpSalGraphics::getBitmap, cannot create bitmap");
        delete pBitmap;
        return nullptr;
    }

diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index ad265e3..3b43c46 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -260,12 +260,12 @@ SalSystem* SvpSalInstance::CreateSalSystem()
    return new SvpSalSystem();
}

SalBitmap* SvpSalInstance::CreateSalBitmap()
std::shared_ptr<SalBitmap> SvpSalInstance::CreateSalBitmap()
{
#ifdef IOS
    return new QuartzSalBitmap();
    return std::make_shared<QuartzSalBitmap>();
#else
    return new SvpSalBitmap();
    return std::make_shared<SvpSalBitmap>();
#endif
}

diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index c77e5da..860eace 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -232,7 +232,7 @@ public:
    virtual void            drawMask( const SalTwoRect& rPosAry,
                                      const SalBitmap& rSalBitmap,
                                      Color nMaskColor ) override;
    virtual SalBitmap*      getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual Color           getPixel( long nX, long nY ) override;
    virtual void            invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags ) override;
    virtual void            invert( sal_uInt32 nPoints, const SalPoint* pPtAry, SalInvert nFlags ) override;
diff --git a/vcl/inc/headless/svpinst.hxx b/vcl/inc/headless/svpinst.hxx
index a56aa40..810374c 100644
--- a/vcl/inc/headless/svpinst.hxx
+++ b/vcl/inc/headless/svpinst.hxx
@@ -164,7 +164,7 @@ public:
    // SalSystem
    virtual SalSystem*      CreateSalSystem() override;
    // SalBitmap
    virtual SalBitmap*      CreateSalBitmap() override;
    virtual std::shared_ptr<SalBitmap> CreateSalBitmap() override;

    // wait next event and dispatch
    // must returned by UserEvent (SalFrame::PostEvent)
diff --git a/vcl/inc/openglgdiimpl.hxx b/vcl/inc/openglgdiimpl.hxx
index 251d176..af2f704 100644
--- a/vcl/inc/openglgdiimpl.hxx
+++ b/vcl/inc/openglgdiimpl.hxx
@@ -308,7 +308,7 @@ public:
                const SalBitmap& rSalBitmap,
                Color nMaskColor ) override;

    virtual SalBitmap* getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;

    virtual Color getPixel( long nX, long nY ) override;

diff --git a/vcl/inc/osx/salinst.h b/vcl/inc/osx/salinst.h
index fa15a5c..13261df 100644
--- a/vcl/inc/osx/salinst.h
+++ b/vcl/inc/osx/salinst.h
@@ -112,7 +112,7 @@ public:
    virtual OUString        GetDefaultPrinter() override;
    virtual SalTimer*       CreateSalTimer() override;
    virtual SalSystem*      CreateSalSystem() override;
    virtual SalBitmap*      CreateSalBitmap() override;
    virtual std::shared_ptr<SalBitmap> CreateSalBitmap() override;
    virtual comphelper::SolarMutex* GetYieldMutex() override;
    virtual sal_uInt32      ReleaseYieldMutexAll() override;
    virtual void            AcquireYieldMutex( sal_uInt32 nCount = 1 ) override;
diff --git a/vcl/inc/quartz/salgdi.h b/vcl/inc/quartz/salgdi.h
index 325179e..a05ac07 100644
--- a/vcl/inc/quartz/salgdi.h
+++ b/vcl/inc/quartz/salgdi.h
@@ -252,7 +252,7 @@ public:
                                      const SalBitmap& rSalBitmap,
                                      Color nMaskColor ) override;

    virtual SalBitmap*      getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual Color           getPixel( long nX, long nY ) override;

    // invert --> ClipRegion (only Windows or VirDevs)
diff --git a/vcl/inc/salgdi.hxx b/vcl/inc/salgdi.hxx
index ceae6fd..cacbfc7 100644
--- a/vcl/inc/salgdi.hxx
+++ b/vcl/inc/salgdi.hxx
@@ -306,7 +306,7 @@ public:
                                    Color nMaskColor,
                                    const OutputDevice *pOutDev );

    SalBitmap*                  GetBitmap(
    std::shared_ptr<SalBitmap>  GetBitmap(
                                    long nX, long nY,
                                    long nWidth, long nHeight,
                                    const OutputDevice *pOutDev );
@@ -508,7 +508,7 @@ protected:
                                    const SalBitmap& rSalBitmap,
                                    Color nMaskColor ) = 0;

    virtual SalBitmap*          getBitmap( long nX, long nY, long nWidth, long nHeight ) = 0;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) = 0;

    virtual Color               getPixel( long nX, long nY ) = 0;

diff --git a/vcl/inc/salgdiimpl.hxx b/vcl/inc/salgdiimpl.hxx
index 89c6f4d..3fb3a0b 100644
--- a/vcl/inc/salgdiimpl.hxx
+++ b/vcl/inc/salgdiimpl.hxx
@@ -149,7 +149,7 @@ public:
                const SalBitmap& rSalBitmap,
                Color nMaskColor ) = 0;

    virtual SalBitmap* getBitmap( long nX, long nY, long nWidth, long nHeight ) = 0;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) = 0;

    virtual Color getPixel( long nX, long nY ) = 0;

diff --git a/vcl/inc/salinst.hxx b/vcl/inc/salinst.hxx
index fa4fa92..912ce9ac 100644
--- a/vcl/inc/salinst.hxx
+++ b/vcl/inc/salinst.hxx
@@ -132,7 +132,7 @@ public:
    // SalSystem
    virtual SalSystem*      CreateSalSystem() = 0;
    // SalBitmap
    virtual SalBitmap*      CreateSalBitmap() = 0;
    virtual std::shared_ptr<SalBitmap> CreateSalBitmap() = 0;

    // YieldMutex
    virtual comphelper::SolarMutex*
diff --git a/vcl/inc/unx/genpspgraphics.h b/vcl/inc/unx/genpspgraphics.h
index 2f95f3f..a4a9885 100644
--- a/vcl/inc/unx/genpspgraphics.h
+++ b/vcl/inc/unx/genpspgraphics.h
@@ -163,7 +163,7 @@ public:
    virtual void            drawMask( const SalTwoRect& rPosAry,
                                      const SalBitmap& rSalBitmap,
                                      Color nMaskColor ) override;
    virtual SalBitmap*      getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual Color           getPixel( long nX, long nY ) override;
    virtual void            invert( long nX, long nY, long nWidth, long nHeight,
                                    SalInvert nFlags ) override;
diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx
index 5f8534a..f9369f7 100644
--- a/vcl/inc/unx/gtk/gtkinst.hxx
+++ b/vcl/inc/unx/gtk/gtkinst.hxx
@@ -207,7 +207,7 @@ public:
                                                     long &nDX, long &nDY,
                                                     DeviceFormat eFormat,
                                                     const SystemGraphicsData* = nullptr ) override;
    virtual SalBitmap*          CreateSalBitmap() override;
    virtual std::shared_ptr<SalBitmap> CreateSalBitmap() override;

    virtual bool                DoYield(bool bWait, bool bHandleAllCurrentEvents) override;
    virtual bool                AnyInput( VclInputFlags nType ) override;
diff --git a/vcl/inc/unx/salgdi.h b/vcl/inc/unx/salgdi.h
index bc09b3e..9b656ac 100644
--- a/vcl/inc/unx/salgdi.h
+++ b/vcl/inc/unx/salgdi.h
@@ -217,7 +217,7 @@ public:
                                        const SalBitmap& rSalBitmap,
                                        Color nMaskColor ) override;

    virtual SalBitmap*              getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual Color                   getPixel( long nX, long nY ) override;
    virtual void                    invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags ) override;
    virtual void                    invert( sal_uInt32 nPoints, const SalPoint* pPtAry, SalInvert nFlags ) override;
diff --git a/vcl/inc/unx/salinst.h b/vcl/inc/unx/salinst.h
index d61995f..34fe4f1 100644
--- a/vcl/inc/unx/salinst.h
+++ b/vcl/inc/unx/salinst.h
@@ -71,7 +71,7 @@ public:
    virtual SalTimer*           CreateSalTimer() override;
    virtual std::unique_ptr<SalI18NImeStatus> CreateI18NImeStatus() override;
    virtual SalSystem*          CreateSalSystem() override;
    virtual SalBitmap*          CreateSalBitmap() override;
    virtual std::shared_ptr<SalBitmap>  CreateSalBitmap() override;
    virtual std::unique_ptr<SalSession> CreateSalSession() override;
    virtual OpenGLContext*      CreateOpenGLContext() override;

diff --git a/vcl/inc/win/salgdi.h b/vcl/inc/win/salgdi.h
index 5f6dbe2..6b2e464 100644
--- a/vcl/inc/win/salgdi.h
+++ b/vcl/inc/win/salgdi.h
@@ -251,7 +251,7 @@ protected:
                                  const SalBitmap& rSalBitmap,
                                  Color nMaskColor ) override;

    virtual SalBitmap*  getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual Color       getPixel( long nX, long nY ) override;

    // invert --> ClipRegion (only Windows or VirDevs)
diff --git a/vcl/inc/win/salinst.h b/vcl/inc/win/salinst.h
index f0df234..cea4aff 100644
--- a/vcl/inc/win/salinst.h
+++ b/vcl/inc/win/salinst.h
@@ -64,7 +64,7 @@ public:
    virtual OUString            GetDefaultPrinter() override;
    virtual SalTimer*           CreateSalTimer() override;
    virtual SalSystem*          CreateSalSystem() override;
    virtual SalBitmap*          CreateSalBitmap() override;
    virtual std::shared_ptr<SalBitmap> CreateSalBitmap() override;
    virtual comphelper::SolarMutex* GetYieldMutex() override;
    virtual sal_uInt32          ReleaseYieldMutexAll() override;
    virtual void                AcquireYieldMutex( sal_uInt32 nCount = 1 ) override;
diff --git a/vcl/opengl/gdiimpl.cxx b/vcl/opengl/gdiimpl.cxx
index 6858a2a..8deae07 100644
--- a/vcl/opengl/gdiimpl.cxx
+++ b/vcl/opengl/gdiimpl.cxx
@@ -1722,20 +1722,19 @@ void OpenGLSalGraphicsImpl::drawMask(
    PostBatchDraw();
}

SalBitmap* OpenGLSalGraphicsImpl::getBitmap( long nX, long nY, long nWidth, long nHeight )
std::shared_ptr<SalBitmap> OpenGLSalGraphicsImpl::getBitmap( long nX, long nY, long nWidth, long nHeight )
{
    FlushDeferredDrawing();

    OpenGLZone aZone;

    OpenGLSalBitmap* pBitmap = new OpenGLSalBitmap;
    std::shared_ptr<OpenGLSalBitmap> pBitmap(std::make_shared<OpenGLSalBitmap>());
    VCL_GL_INFO( "::getBitmap " << nX << "," << nY <<
              " " << nWidth << "x" << nHeight );
    //TODO really needed?
    PreDraw();
    if( !pBitmap->Create( maOffscreenTex, nX, nY, nWidth, nHeight ) )
    {
        delete pBitmap;
        pBitmap = nullptr;
    }
    PostDraw();
diff --git a/vcl/osx/salinst.cxx b/vcl/osx/salinst.cxx
index 03d3f7a..972a7fa 100644
--- a/vcl/osx/salinst.cxx
+++ b/vcl/osx/salinst.cxx
@@ -960,9 +960,9 @@ SalSystem* AquaSalInstance::CreateSalSystem()
    return new AquaSalSystem();
}

SalBitmap* AquaSalInstance::CreateSalBitmap()
std::shared_ptr<SalBitmap> AquaSalInstance::CreateSalBitmap()
{
    return new QuartzSalBitmap();
    return std::make_shared<QuartzSalBitmap>();
}

OUString AquaSalInstance::getOSVersion()
diff --git a/vcl/qt5/Qt5Graphics_GDI.cxx b/vcl/qt5/Qt5Graphics_GDI.cxx
index 43e54b8..b58f18e 100644
--- a/vcl/qt5/Qt5Graphics_GDI.cxx
+++ b/vcl/qt5/Qt5Graphics_GDI.cxx
@@ -435,9 +435,9 @@ void Qt5Graphics::drawMask(const SalTwoRect& rPosAry, const SalBitmap& /*rSalBit
    assert(rPosAry.mnSrcHeight == rPosAry.mnDestHeight);
}

SalBitmap* Qt5Graphics::getBitmap(long nX, long nY, long nWidth, long nHeight)
std::shared_ptr<SalBitmap> Qt5Graphics::getBitmap(long nX, long nY, long nWidth, long nHeight)
{
    return new Qt5Bitmap(m_pQImage->copy(nX, nY, nWidth, nHeight));
    return std::make_shared<Qt5Bitmap>(m_pQImage->copy(nX, nY, nWidth, nHeight));
}

Color Qt5Graphics::getPixel(long nX, long nY) { return m_pQImage->pixel(nX, nY); }
diff --git a/vcl/quartz/salgdicommon.cxx b/vcl/quartz/salgdicommon.cxx
index e0dfdd7..82dfe89 100644
--- a/vcl/quartz/salgdicommon.cxx
+++ b/vcl/quartz/salgdicommon.cxx
@@ -426,7 +426,7 @@ void AquaSalGraphics::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSrcGrap
    }
    else
    {
        SalBitmap* pBitmap = pSrc->getBitmap( rPosAry.mnSrcX, rPosAry.mnSrcY,
        std::shared_ptr<SalBitmap> pBitmap = pSrc->getBitmap( rPosAry.mnSrcX, rPosAry.mnSrcY,
                                              rPosAry.mnSrcWidth, rPosAry.mnSrcHeight );
        if( pBitmap )
        {
@@ -434,7 +434,6 @@ void AquaSalGraphics::copyBits( const SalTwoRect& rPosAry, SalGraphics *pSrcGrap
            aPosAry.mnSrcX = 0;
            aPosAry.mnSrcY = 0;
            drawBitmap( aPosAry, *pBitmap );
            delete pBitmap;
        }
    }
}
@@ -1440,16 +1439,15 @@ sal_uInt16 AquaSalGraphics::GetBitCount() const
    return nBits;
}

SalBitmap* AquaSalGraphics::getBitmap( long  nX, long  nY, long  nDX, long  nDY )
std::shared_ptr<SalBitmap> AquaSalGraphics::getBitmap( long  nX, long  nY, long  nDX, long  nDY )
{
    SAL_WARN_IF( !mxLayer, "vcl.quartz", "AquaSalGraphics::getBitmap() with no layer this=" << this );

    ApplyXorContext();

    QuartzSalBitmap* pBitmap = new QuartzSalBitmap;
    std::shared_ptr<QuartzSalBitmap> pBitmap = std::make_shared<QuartzSalBitmap>();
    if( !pBitmap->Create( mxLayer, mnBitmapDepth, nX, nY, nDX, nDY, IsFlipped()) )
    {
        delete pBitmap;
        pBitmap = nullptr;
    }
    return pBitmap;
diff --git a/vcl/source/bitmap/bitmap.cxx b/vcl/source/bitmap/bitmap.cxx
index 23477b6..2de0da7 100644
--- a/vcl/source/bitmap/bitmap.cxx
+++ b/vcl/source/bitmap/bitmap.cxx
@@ -41,7 +41,7 @@ Bitmap::Bitmap(const Bitmap& rBitmap)
{
}

Bitmap::Bitmap(SalBitmap* pSalBitmap)
Bitmap::Bitmap(std::shared_ptr<SalBitmap> const & pSalBitmap)
    : mxSalBmp(pSalBitmap)
    , maPrefMapMode(MapMode(MapUnit::MapPixel))
    , maPrefSize(mxSalBmp->GetSize())
@@ -104,7 +104,7 @@ Bitmap::Bitmap( const Size& rSizePixel, sal_uInt16 nBitCount, const BitmapPalett
                pRealPal = const_cast<BitmapPalette*>(pPal);
        }

        mxSalBmp.reset(ImplGetSVData()->mpDefInst->CreateSalBitmap());
        mxSalBmp = ImplGetSVData()->mpDefInst->CreateSalBitmap();
        mxSalBmp->Create( rSizePixel, nBitCount, pRealPal ? *pRealPal : aPal );
    }
}
@@ -311,7 +311,7 @@ void Bitmap::ImplMakeUnique()
    if (mxSalBmp && mxSalBmp.use_count() > 1)
    {
        std::shared_ptr<SalBitmap> xOldImpBmp = mxSalBmp;
        mxSalBmp.reset(ImplGetSVData()->mpDefInst->CreateSalBitmap());
        mxSalBmp = ImplGetSVData()->mpDefInst->CreateSalBitmap();
        mxSalBmp->Create(*xOldImpBmp);
    }
}
diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx
index a369efe..4f3ac4f 100644
--- a/vcl/source/gdi/bitmapex.cxx
+++ b/vcl/source/gdi/bitmapex.cxx
@@ -776,8 +776,8 @@ bool BitmapEx::Create( const css::uno::Reference< css::rendering::XBitmapCanvas 
        }
    }

    SalBitmap* pSalBmp = nullptr;
    SalBitmap* pSalMask = nullptr;
    std::shared_ptr<SalBitmap> pSalBmp;
    std::shared_ptr<SalBitmap> pSalMask;

    pSalBmp = ImplGetSVData()->mpDefInst->CreateSalBitmap();

@@ -792,15 +792,11 @@ bool BitmapEx::Create( const css::uno::Reference< css::rendering::XBitmapCanvas 
        }
        else
        {
            delete pSalMask;
            *this = BitmapEx(Bitmap(pSalBmp));
            return true;
        }
    }

    delete pSalBmp;
    delete pSalMask;

    return false;
}

diff --git a/vcl/source/gdi/salgdilayout.cxx b/vcl/source/gdi/salgdilayout.cxx
index 49cc105..47b2f75 100644
--- a/vcl/source/gdi/salgdilayout.cxx
+++ b/vcl/source/gdi/salgdilayout.cxx
@@ -606,7 +606,7 @@ void SalGraphics::DrawMask( const SalTwoRect& rPosAry,
        drawMask( rPosAry, rSalBitmap, nMaskColor );
}

SalBitmap* SalGraphics::GetBitmap( long nX, long nY, long nWidth, long nHeight, const OutputDevice *pOutDev )
std::shared_ptr<SalBitmap> SalGraphics::GetBitmap( long nX, long nY, long nWidth, long nHeight, const OutputDevice *pOutDev )
{
    if( (m_nLayout & SalLayoutFlags::BiDiRtl) || (pOutDev && pOutDev->IsRTLEnabled()) )
        mirror( nX, nWidth, pOutDev );
diff --git a/vcl/source/outdev/bitmap.cxx b/vcl/source/outdev/bitmap.cxx
index 4108bc6..0ab77a8 100644
--- a/vcl/source/outdev/bitmap.cxx
+++ b/vcl/source/outdev/bitmap.cxx
@@ -465,12 +465,11 @@ Bitmap OutputDevice::GetBitmap( const Point& rSrcPt, const Size& rSize ) const

            if ( !bClipped )
            {
                SalBitmap* pSalBmp = mpGraphics->GetBitmap( nX, nY, nWidth, nHeight, this );
                std::shared_ptr<SalBitmap> pSalBmp = mpGraphics->GetBitmap( nX, nY, nWidth, nHeight, this );

                if( pSalBmp )
                {
                    std::shared_ptr<SalBitmap> xImpBmp(pSalBmp);
                    aBmp.ImplSetSalBitmap(xImpBmp);
                    aBmp.ImplSetSalBitmap(pSalBmp);
                }
            }
        }
diff --git a/vcl/unx/generic/gdi/gdiimpl.cxx b/vcl/unx/generic/gdi/gdiimpl.cxx
index b815992..1fd3d61 100644
--- a/vcl/unx/generic/gdi/gdiimpl.cxx
+++ b/vcl/unx/generic/gdi/gdiimpl.cxx
@@ -586,7 +586,7 @@ void X11SalGraphicsImpl::copyBits( const SalTwoRect& rPosAry,
        // #i60699# No chance to handle graphics exposures - we copy
        // to a temp bitmap first, into which no repaints are
        // technically possible.
        std::unique_ptr<SalBitmap> xDDB(pSrcGraphics->getBitmap( rPosAry.mnSrcX,
        std::shared_ptr<SalBitmap> xDDB(pSrcGraphics->getBitmap( rPosAry.mnSrcX,
                                                                   rPosAry.mnSrcY,
                                                                   rPosAry.mnSrcWidth,
                                                                   rPosAry.mnSrcHeight ));
@@ -1684,7 +1684,7 @@ Color X11SalGraphicsImpl::getPixel( long nX, long nY )
    return mrParent.GetColormap().GetColor( aXColor.pixel );
}

SalBitmap *X11SalGraphicsImpl::getBitmap( long nX, long nY, long nDX, long nDY )
std::shared_ptr<SalBitmap> X11SalGraphicsImpl::getBitmap( long nX, long nY, long nDX, long nDY )
{
    bool bFakeWindowBG = false;

@@ -1737,7 +1737,7 @@ SalBitmap *X11SalGraphicsImpl::getBitmap( long nX, long nY, long nDX, long nDY )
        }
    }

    X11SalBitmap* pSalBitmap = new X11SalBitmap;
    std::shared_ptr<X11SalBitmap> pSalBitmap = std::make_shared<X11SalBitmap>();
    sal_uInt16 nBitCount = GetBitCount();

    if( &mrParent.GetDisplay()->GetColormap( mrParent.m_nXScreen ) != &mrParent.GetColormap() )
diff --git a/vcl/unx/generic/gdi/gdiimpl.hxx b/vcl/unx/generic/gdi/gdiimpl.hxx
index 1b71c47..156700f 100644
--- a/vcl/unx/generic/gdi/gdiimpl.hxx
+++ b/vcl/unx/generic/gdi/gdiimpl.hxx
@@ -206,7 +206,7 @@ public:
                const SalBitmap& rSalBitmap,
                Color nMaskColor ) override;

    virtual SalBitmap* getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;

    virtual Color getPixel( long nX, long nY ) override;

diff --git a/vcl/unx/generic/gdi/salbmp.cxx b/vcl/unx/generic/gdi/salbmp.cxx
index d50c92f..a8b5f36 100644
--- a/vcl/unx/generic/gdi/salbmp.cxx
+++ b/vcl/unx/generic/gdi/salbmp.cxx
@@ -52,12 +52,12 @@
#include <memory>


SalBitmap* X11SalInstance::CreateSalBitmap()
std::shared_ptr<SalBitmap> X11SalInstance::CreateSalBitmap()
{
    if (OpenGLHelper::isVCLOpenGLEnabled())
        return new OpenGLSalBitmap();
        return std::make_shared<OpenGLSalBitmap>();
    else
        return new X11SalBitmap();
        return std::make_shared<X11SalBitmap>();
}

ImplSalBitmapCache* X11SalBitmap::mpCache = nullptr;
diff --git a/vcl/unx/generic/gdi/salgdi2.cxx b/vcl/unx/generic/gdi/salgdi2.cxx
index 3903960..33ab849 100644
--- a/vcl/unx/generic/gdi/salgdi2.cxx
+++ b/vcl/unx/generic/gdi/salgdi2.cxx
@@ -233,7 +233,7 @@ void X11SalGraphics::drawMask( const SalTwoRect& rPosAry,
    mxImpl->drawMask( rPosAry, rSalBitmap, nMaskColor );
}

SalBitmap *X11SalGraphics::getBitmap( long nX, long nY, long nDX, long nDY )
std::shared_ptr<SalBitmap> X11SalGraphics::getBitmap( long nX, long nY, long nDX, long nDY )
{
    return mxImpl->getBitmap( nX, nY, nDX, nDY );
}
diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx
index a16bf10..4bcc0a2 100644
--- a/vcl/unx/generic/print/genpspgraphics.cxx
+++ b/vcl/unx/generic/print/genpspgraphics.cxx
@@ -495,7 +495,7 @@ void GenPspGraphics::drawMask( const SalTwoRect&,
    OSL_FAIL("Error: PrinterGfx::DrawMask() not implemented");
}

SalBitmap* GenPspGraphics::getBitmap( long, long, long, long )
std::shared_ptr<SalBitmap> GenPspGraphics::getBitmap( long, long, long, long )
{
    SAL_INFO("vcl", "Warning: PrinterGfx::GetBitmap() not implemented");
    return nullptr;
diff --git a/vcl/unx/gtk/gtkinst.cxx b/vcl/unx/gtk/gtkinst.cxx
index 4cf31b8..20fc1a4 100644
--- a/vcl/unx/gtk/gtkinst.cxx
+++ b/vcl/unx/gtk/gtkinst.cxx
@@ -345,7 +345,7 @@ std::unique_ptr<SalVirtualDevice> GtkInstance::CreateVirtualDevice( SalGraphics 
#endif
}

SalBitmap* GtkInstance::CreateSalBitmap()
std::shared_ptr<SalBitmap> GtkInstance::CreateSalBitmap()
{
    EnsureInit();
#if GTK_CHECK_VERSION(3,0,0)
diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx
index 652e476..cfdc68b4 100644
--- a/vcl/win/app/salinst.cxx
+++ b/vcl/win/app/salinst.cxx
@@ -986,12 +986,12 @@ SalTimer* WinSalInstance::CreateSalTimer()
    return new WinSalTimer();
}

SalBitmap* WinSalInstance::CreateSalBitmap()
std::shared_ptr<SalBitmap> WinSalInstance::CreateSalBitmap()
{
    if (OpenGLHelper::isVCLOpenGLEnabled())
        return new OpenGLSalBitmap();
        return std::make_shared<OpenGLSalBitmap>();
    else
        return new WinSalBitmap();
        return std::make_shared<WinSalBitmap>();
}

const OUString& SalGetDesktopEnvironment()
diff --git a/vcl/win/gdi/gdiimpl.cxx b/vcl/win/gdi/gdiimpl.cxx
index f18fbcf..5b7f225 100644
--- a/vcl/win/gdi/gdiimpl.cxx
+++ b/vcl/win/gdi/gdiimpl.cxx
@@ -851,11 +851,11 @@ void WinSalGraphicsImpl::drawMask( const SalTwoRect& rPosAry,
    DeleteBrush( hMaskBrush );
}

SalBitmap* WinSalGraphicsImpl::getBitmap( long nX, long nY, long nDX, long nDY )
std::shared_ptr<SalBitmap> WinSalGraphicsImpl::getBitmap( long nX, long nY, long nDX, long nDY )
{
    SAL_WARN_IF( mrParent.isPrinter(), "vcl", "No ::GetBitmap() from printer possible!" );

    WinSalBitmap* pSalBitmap = nullptr;
    std::shared_ptr<WinSalBitmap> pSalBitmap;

    nDX = labs( nDX );
    nDY = labs( nDY );
@@ -870,12 +870,11 @@ SalBitmap* WinSalGraphicsImpl::getBitmap( long nX, long nY, long nDX, long nDY )

    if( bRet )
    {
        pSalBitmap = new WinSalBitmap;
        pSalBitmap = std::make_shared<WinSalBitmap>();

        if( !pSalBitmap->Create( hBmpBitmap, FALSE, FALSE ) )
        {
            delete pSalBitmap;
            pSalBitmap = nullptr;
            pSalBitmap.reset();
        }
    }
    else
diff --git a/vcl/win/gdi/gdiimpl.hxx b/vcl/win/gdi/gdiimpl.hxx
index f4810c1..3bd3966 100644
--- a/vcl/win/gdi/gdiimpl.hxx
+++ b/vcl/win/gdi/gdiimpl.hxx
@@ -154,7 +154,7 @@ public:
                const SalBitmap& rSalBitmap,
                Color nMaskColor ) override;

    virtual SalBitmap* getBitmap( long nX, long nY, long nWidth, long nHeight ) override;
    virtual std::shared_ptr<SalBitmap> getBitmap( long nX, long nY, long nWidth, long nHeight ) override;

    virtual Color getPixel( long nX, long nY ) override;

diff --git a/vcl/win/gdi/salgdi2.cxx b/vcl/win/gdi/salgdi2.cxx
index c34a215..2e2d346 100644
--- a/vcl/win/gdi/salgdi2.cxx
+++ b/vcl/win/gdi/salgdi2.cxx
@@ -215,7 +215,7 @@ void WinSalGraphics::drawMask( const SalTwoRect& rPosAry,
    mpImpl->drawMask( rPosAry, rSSalBitmap, nMaskColor );
}

SalBitmap* WinSalGraphics::getBitmap( long nX, long nY, long nDX, long nDY )
std::shared_ptr<SalBitmap> WinSalGraphics::getBitmap( long nX, long nY, long nDX, long nDY )
{
    return mpImpl->getBitmap( nX, nY, nDX, nDY );
}