include/vcl_canvas/canvas.hxx                        |    3 
 include/vcl_canvas/customsprite.hxx                  |    2 
 include/vcl_canvas/graphicdevice.hxx                 |    4 
 include/vcl_canvas/spritecanvas.hxx                  |    2 
 include/vcl_canvas/windowlistener.hxx                |   15 ---
 vcl/canvas_inc/base/bitmapcanvasbase.hxx             |    4 
 vcl/canvas_inc/base/bufferedgraphicdevicebase.hxx    |    8 -
 vcl/canvas_inc/base/canvasbase.hxx                   |    4 
 vcl/canvas_inc/base/canvascustomspritebase.hxx       |   43 +++++-----
 vcl/canvas_inc/base/graphicdevicebase.hxx            |    8 -
 vcl/canvas_inc/base/sprite.hxx                       |    6 -
 vcl/canvas_inc/base/spritecanvasbase.hxx             |   12 +-
 vcl/canvas_inc/cairo_canvasbitmap.hxx                |    2 
 vcl/canvas_inc/cairo_canvascustomsprite.hxx          |   48 +++++------
 vcl/canvas_inc/cairo_canvasfont.hxx                  |    4 
 vcl/canvas_inc/cairo_canvashelper.hxx                |    9 +-
 vcl/canvas_inc/cairo_spritecanvas.hxx                |   21 +++-
 vcl/canvas_inc/cairo_spritecanvashelper.hxx          |    5 -
 vcl/canvas_inc/cairo_textlayout.hxx                  |    4 
 vcl/canvas_inc/spriteredrawmanager.hxx               |    2 
 vcl/source/canvas/cairo/cairo_canvasbitmap.cxx       |    4 
 vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx |   15 ++-
 vcl/source/canvas/cairo/cairo_canvasfont.cxx         |    6 -
 vcl/source/canvas/cairo/cairo_canvashelper.cxx       |   27 +++---
 vcl/source/canvas/cairo/cairo_canvashelper_text.cxx  |    5 -
 vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx |   81 ++++++++++---------
 vcl/source/canvas/cairo/cairo_spritehelper.cxx       |    2 
 vcl/source/canvas/cairo/cairo_textlayout.cxx         |    4 
 vcl/source/canvas/tools/spriteredrawmanager.cxx      |    8 -
 vcl/source/window/window.cxx                         |    7 +
 30 files changed, 190 insertions(+), 175 deletions(-)

New commits:
commit b22d01ed3a54329cce99931cb627b31cd2eb7e0b
Author:     Shardul Vikram Singh <shardulvi...@gmail.com>
AuthorDate: Fri Jul 25 23:08:40 2025 +0530
Commit:     Shardul Vikram Singh <shardulvi...@gmail.com>
CommitDate: Fri Jul 25 23:08:40 2025 +0530

    Achieve first successful build after major refactoring

diff --git a/include/vcl_canvas/customsprite.hxx 
b/include/vcl_canvas/customsprite.hxx
index 131d5335ac84..56025a89de65 100644
--- a/include/vcl_canvas/customsprite.hxx
+++ b/include/vcl_canvas/customsprite.hxx
@@ -9,7 +9,7 @@ namespace vcl_canvas
 class CustomSprite : public SpriteBase
 {
 public:
-    virtual Canvas* getContentCanvas() = 0;
+    virtual CanvasSharedPtr getContentCanvas() = 0;
 };
 
 typedef std::shared_ptr<CustomSprite> CustomSpriteSharedPtr;
diff --git a/include/vcl_canvas/spritecanvas.hxx 
b/include/vcl_canvas/spritecanvas.hxx
index 50e4b8d328cd..5ec9e6512be6 100644
--- a/include/vcl_canvas/spritecanvas.hxx
+++ b/include/vcl_canvas/spritecanvas.hxx
@@ -11,7 +11,7 @@ namespace vcl_canvas
 class SpriteCanvas : public Canvas
 {
 public:
-    virtual CustomSprite* createCustomSprite( const 
::css::geometry::RealSize2D& spriteSize ) = 0;
+    virtual CustomSpriteSharedPtr createCustomSprite( const 
::css::geometry::RealSize2D& spriteSize ) = 0;
     // virtual SpriteSharedPtr createClonedSprite( const SpriteBase& original 
) = 0;
     virtual sal_Bool updateScreen( sal_Bool bUpdateAll ) = 0;
 };
diff --git a/vcl/canvas_inc/base/canvascustomspritebase.hxx 
b/vcl/canvas_inc/base/canvascustomspritebase.hxx
index 5c63d36495e4..6101d251da3a 100644
--- a/vcl/canvas_inc/base/canvascustomspritebase.hxx
+++ b/vcl/canvas_inc/base/canvascustomspritebase.hxx
@@ -27,6 +27,7 @@
 #include <basegfx/range/b2drange.hxx>
 #include <base/integerbitmapbase.hxx>
 #include <base/bitmapcanvasbase.hxx>
+#include <base/sprite.hxx>
 
 namespace com::sun::star::rendering { class XPolyPolygon2D; }
 
@@ -77,6 +78,7 @@ namespace vcl_canvas
     {
     public:
         typedef IntegerBitmapBase< BitmapCanvasBase2<Base, CanvasHelper, 
Mutex, UnambiguousBase> > BaseType;
+        typedef CanvasCustomSpriteBase< Base, SpriteHelper, CanvasHelper, 
Mutex, UnambiguousBase > SelfType;
 
         CanvasCustomSpriteBase() :
             maSpriteHelper()
@@ -91,15 +93,15 @@ namespace vcl_canvas
             @derive when overriding this method in derived classes,
             <em>always</em> call the base class' method!
          */
-        /* virtual void disposeThis() override
+        virtual void disposeThis() /* override */
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
             maSpriteHelper.disposing();
 
             // pass on to base class
-            BaseType::disposeThis();
-        } */
+            // BaseType::disposeThis();
+        }
 
         // XCanvas: selectively override base's methods here, for opacity 
tracking
         /* virtual void SAL_CALL clear() override
@@ -131,6 +133,8 @@ namespace vcl_canvas
                                          renderState );
         } */
 
+        virtual std::shared_ptr<SelfType> getShared() = 0;
+
         // TODO(F3): If somebody uses the XIntegerBitmap methods to
         // clear pixel (setting alpha != 1.0 there), or a compositing
         // mode results in similar alpha, maSpriteHelper might
@@ -145,7 +149,7 @@ namespace vcl_canvas
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            maSpriteHelper.setAlpha( this, alpha );
+            maSpriteHelper.setAlpha( getShared(), alpha );
         }
 
         virtual void SAL_CALL move( const css::geometry::RealPoint2D&  aNewPos,
@@ -158,7 +162,7 @@ namespace vcl_canvas
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            maSpriteHelper.move( this, aNewPos, viewState, renderState );
+            maSpriteHelper.move( getShared(), aNewPos, viewState, renderState 
);
         }
 
         virtual void SAL_CALL transform( const css::geometry::AffineMatrix2D& 
aTransformation ) override
@@ -169,7 +173,7 @@ namespace vcl_canvas
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            maSpriteHelper.transform( this, aTransformation );
+            maSpriteHelper.transform( getShared(), aTransformation );
         }
 
         virtual void SAL_CALL clip( const css::uno::Reference< 
css::rendering::XPolyPolygon2D >& aClip ) override
@@ -178,37 +182,37 @@ namespace vcl_canvas
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            maSpriteHelper.clip( this, aClip );
+            maSpriteHelper.clip( getShared(), aClip );
         }
 
         virtual void SAL_CALL setPriority( double nPriority ) override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            maSpriteHelper.setPriority( this, nPriority );
+            maSpriteHelper.setPriority( getShared(), nPriority );
         }
 
         virtual void SAL_CALL show() override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            maSpriteHelper.show( this );
+            maSpriteHelper.show( getShared() );
         }
 
         virtual void SAL_CALL hide() override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            maSpriteHelper.hide( this );
+            maSpriteHelper.hide( getShared() );
         }
 
         // XCustomSprite
-        Canvas* SAL_CALL
+        CanvasSharedPtr SAL_CALL
             getContentCanvas() override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
-            return this;
+            return getShared();
         }
 
         // Sprite
diff --git a/vcl/canvas_inc/base/sprite.hxx b/vcl/canvas_inc/base/sprite.hxx
index 1809ba1fba34..73cbd8b30698 100644
--- a/vcl/canvas_inc/base/sprite.hxx
+++ b/vcl/canvas_inc/base/sprite.hxx
@@ -50,8 +50,10 @@ namespace vcl_canvas
     class Sprite
     {
     public:
-        typedef ::rtl::Reference< Sprite > Reference;
+        // typedef ::rtl::Reference< Sprite > Reference;
+        typedef std::shared_ptr< Sprite > Reference;
 
+        virtual void dispose() = 0;
         /** Query whether sprite update will fully cover the given area.
 
             Use this method to determine whether any background
diff --git a/vcl/canvas_inc/base/spritecanvasbase.hxx 
b/vcl/canvas_inc/base/spritecanvasbase.hxx
index a1fbd2943313..ca0f08137264 100644
--- a/vcl/canvas_inc/base/spritecanvasbase.hxx
+++ b/vcl/canvas_inc/base/spritecanvasbase.hxx
@@ -119,7 +119,7 @@ namespace vcl_canvas
             return 
BaseType::maCanvasHelper.createSpriteFromBitmaps(animationBitmaps, 
interpolationMode);
         } */
 
-        virtual CustomSprite* SAL_CALL createCustomSprite( const 
css::geometry::RealSize2D& spriteSize ) override
+        virtual CustomSpriteSharedPtr SAL_CALL createCustomSprite( const 
css::geometry::RealSize2D& spriteSize ) override
         {
             /* tools::verifySpriteSize(spriteSize,
                                     __func__,
@@ -144,7 +144,7 @@ namespace vcl_canvas
         // SpriteSurface
         virtual void showSprite( const Sprite::Reference& rSprite ) override
         {
-            OSL_ASSERT( rSprite.is() );
+            OSL_ASSERT( rSprite );
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -153,7 +153,7 @@ namespace vcl_canvas
 
         virtual void hideSprite( const Sprite::Reference& rSprite ) override
         {
-            OSL_ASSERT( rSprite.is() );
+            OSL_ASSERT( rSprite );
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -165,7 +165,7 @@ namespace vcl_canvas
                                  const ::basegfx::B2DPoint&     rNewPos,
                                  const ::basegfx::B2DVector&    rSpriteSize ) 
override
         {
-            OSL_ASSERT( rSprite.is() );
+            OSL_ASSERT( rSprite );
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -176,7 +176,7 @@ namespace vcl_canvas
                                    const ::basegfx::B2DPoint&   rPos,
                                    const ::basegfx::B2DRange&   rUpdateArea ) 
override
         {
-            OSL_ASSERT( rSprite.is() );
+            OSL_ASSERT( rSprite );
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
diff --git a/vcl/canvas_inc/cairo_canvascustomsprite.hxx 
b/vcl/canvas_inc/cairo_canvascustomsprite.hxx
index 75e6530707ef..8ab6cfb260df 100644
--- a/vcl/canvas_inc/cairo_canvascustomsprite.hxx
+++ b/vcl/canvas_inc/cairo_canvascustomsprite.hxx
@@ -90,7 +90,12 @@ namespace vcl_cairocanvas
         CanvasCustomSprite( const css::geometry::RealSize2D&   rSpriteSize,
                             const SpriteCanvasSharedPtr&       rRefDevice );
 
-        // virtual void disposeThis() override;
+        virtual void disposeThis() override;
+        virtual void dispose() override;
+        std::shared_ptr<CanvasCustomSpriteBaseT> getShared() override
+        {
+            return shared_from_this();
+        }
 
         // Forwarding the XComponent implementation to the
         // cppu::ImplHelper templated base
diff --git a/vcl/canvas_inc/cairo_canvasfont.hxx 
b/vcl/canvas_inc/cairo_canvasfont.hxx
index 65c6e168e610..61f9f1da739a 100644
--- a/vcl/canvas_inc/cairo_canvasfont.hxx
+++ b/vcl/canvas_inc/cairo_canvasfont.hxx
@@ -51,7 +51,7 @@ namespace vcl_cairocanvas
         CanvasFont( const css::rendering::FontRequest&                         
         fontRequest,
                     const css::uno::Sequence< css::beans::PropertyValue >&     
         extraFontProperties,
                     const css::geometry::Matrix2D&                             
         rFontMatrix,
-                    SurfaceProviderRef                                         
         rDevice );
+                    SurfaceProviderSharedPtr                                   
               rDevice );
 
         /// Dispose all internal references
         virtual void disposing(std::unique_lock<std::mutex>& rGuard) override;
@@ -75,7 +75,7 @@ namespace vcl_cairocanvas
     private:
         ::vcl_canvas::vcltools::VCLObject<vcl::Font> maFont;
         css::rendering::FontRequest              maFontRequest;
-        SurfaceProviderRef                       mpRefDevice;
+        SurfaceProviderSharedPtr                 mpRefDevice;
         sal_uInt32                               mnEmphasisMark;
     };
 
diff --git a/vcl/canvas_inc/cairo_canvashelper.hxx 
b/vcl/canvas_inc/cairo_canvashelper.hxx
index a439cd2fb340..5ff4c901ef63 100644
--- a/vcl/canvas_inc/cairo_canvashelper.hxx
+++ b/vcl/canvas_inc/cairo_canvashelper.hxx
@@ -24,6 +24,7 @@
 #include <com/sun/star/rendering/IntegerBitmapLayout.hpp>
 #include <com/sun/star/rendering/XCanvas.hpp>
 
+#include <memory>
 #include <vcl/vclptr.hxx>
 #include <vcl/virdev.hxx>
 
@@ -76,7 +77,7 @@ namespace vcl_cairocanvas
 
          */
         void init( const ::basegfx::B2ISize& rSizePixel,
-                   SurfaceProvider&          rSurfaceProvider,
+                   SurfaceProviderSharedPtr  rSurfaceProvider,
                    ::vcl_canvas::GraphicDevice* pDevice );
 
         void setSize( const ::basegfx::B2ISize& rSize );
@@ -232,7 +233,7 @@ namespace vcl_cairocanvas
             potential circular references for canvas. Provides us with
             our output surface and associated functionality.
          */
-        SurfaceProvider* mpSurfaceProvider;
+        std::weak_ptr< SurfaceProvider > mpSurfaceProvider;
 
         /** Phyical output device
 
@@ -264,7 +265,7 @@ namespace vcl_cairocanvas
                                       Operation aOperation,
                                       cairo_t* pCairo,
                                       const css::uno::Sequence< 
css::rendering::Texture >* pTextures,
-                                      const SurfaceProviderSharedPtr& pDevice,
+                                      SurfaceProvider* pDevice,
                                       css::rendering::FillRule eFillrule );
 }
 
diff --git a/vcl/canvas_inc/cairo_spritecanvas.hxx 
b/vcl/canvas_inc/cairo_spritecanvas.hxx
index af179adc39d6..1b8723d7b17b 100644
--- a/vcl/canvas_inc/cairo_spritecanvas.hxx
+++ b/vcl/canvas_inc/cairo_spritecanvas.hxx
@@ -82,14 +82,21 @@ namespace vcl_cairocanvas
         references, this is implemented as one single object.
      */
     class SpriteCanvas : public SpriteCanvasBaseT,
-                         public RepaintTarget
+                         public RepaintTarget,
+                         public std::enable_shared_from_this<SpriteCanvas>
     {
     public:
         SpriteCanvas( const css::uno::Sequence< css::uno::Any >&               
 aArguments,
                       const css::uno::Reference< css::uno::XComponentContext 
>& rxContext );
 
         void initialize();
-
+        virtual void SAL_CALL acquire() override{}
+        virtual void SAL_CALL release() override{}
+        virtual ::css::uno::Any SAL_CALL queryInterface( const 
::css::uno::Type& aType ) override
+        {
+            return ::css::uno::Any();
+        }
+        virtual void SAL_CALL disposing( const ::css::lang::EventObject& 
Source ) override{}
         /// Dispose all internal references
         // virtual void disposeThis() override;
 
diff --git a/vcl/canvas_inc/cairo_spritecanvashelper.hxx 
b/vcl/canvas_inc/cairo_spritecanvashelper.hxx
index 8c3205a4281c..53117c3dd03f 100644
--- a/vcl/canvas_inc/cairo_spritecanvashelper.hxx
+++ b/vcl/canvas_inc/cairo_spritecanvashelper.hxx
@@ -60,7 +60,7 @@ namespace vcl_cairocanvas
                             css::rendering::XBitmap > >& animationBitmaps,
                 sal_Int8                                              
interpolationMode );
 
-        ::vcl_canvas::CustomSprite* createCustomSprite(
+        ::vcl_canvas::CustomSpriteSharedPtr createCustomSprite(
                 const css::geometry::RealSize2D& spriteSize );
 
         css::uno::Reference< css::rendering::XSprite >                
createClonedSprite(
@@ -126,7 +126,7 @@ namespace vcl_cairocanvas
         ::vcl_canvas::SpriteRedrawManager*  mpRedrawManager;
 
         /// Set from the init method. used to generate sprites
-        SpriteCanvas*                   mpOwningSpriteCanvas;
+        std::weak_ptr<SpriteCanvas>     mpOwningSpriteCanvas;
 
         /// a surface used to composite the frontbuffer image
         ::cairo::SurfaceSharedPtr       mpCompositingSurface;
diff --git a/vcl/canvas_inc/cairo_textlayout.hxx 
b/vcl/canvas_inc/cairo_textlayout.hxx
index c1e268593e1e..019457bf3c2c 100644
--- a/vcl/canvas_inc/cairo_textlayout.hxx
+++ b/vcl/canvas_inc/cairo_textlayout.hxx
@@ -49,7 +49,7 @@ namespace vcl_cairocanvas
                     sal_Int8                                    nDirection,
                     sal_Int64                                   nRandomSeed,
                     CanvasFont::Reference                       rFont,
-                    SurfaceProviderRef                          rRefDevice );
+                    SurfaceProviderSharedPtr                    rRefDevice );
 
         /// Dispose all internal references
         virtual void disposing(std::unique_lock<std::mutex>& rGuard) override;
@@ -98,7 +98,7 @@ namespace vcl_cairocanvas
         css::uno::Sequence< double >               maLogicalAdvancements;
         css::uno::Sequence< sal_Bool >             maKashidaPositions;
         CanvasFont::Reference                      mpFont;
-        SurfaceProviderRef                         mpRefDevice;
+        SurfaceProviderSharedPtr                   mpRefDevice;
         sal_Int8                                   mnTextDirection;
     };
 
diff --git a/vcl/canvas_inc/spriteredrawmanager.hxx 
b/vcl/canvas_inc/spriteredrawmanager.hxx
index 29575ab599f1..6d4cb13db9c3 100644
--- a/vcl/canvas_inc/spriteredrawmanager.hxx
+++ b/vcl/canvas_inc/spriteredrawmanager.hxx
@@ -327,7 +327,7 @@ namespace vcl_canvas
                     for (auto const& elem : rUpdateArea.maComponentList)
                     {
                         const Sprite::Reference& rSprite( 
elem.second.getSprite() );
-                        if( rSprite.is() )
+                        if( rSprite )
                             aSortedUpdateSprites.push_back( rSprite );
                     }
 
diff --git a/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx 
b/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx
index 26e29024ffb7..b310a130ffc9 100644
--- a/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx
@@ -55,7 +55,7 @@ namespace vcl_cairocanvas
         mpBufferSurface = mpSurfaceProvider->createSurface( rSize, bHasAlpha ? 
CAIRO_CONTENT_COLOR_ALPHA : CAIRO_CONTENT_COLOR );
         mpBufferCairo = mpBufferSurface->getCairo();
 
-        maCanvasHelper.init( rSize, *mpSurfaceProvider, pDevice );
+        maCanvasHelper.init( rSize, mpSurfaceProvider, pDevice );
         maCanvasHelper.setSurface( mpBufferSurface, bHasAlpha );
 
         // clear bitmap to 100% transparent
diff --git a/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx 
b/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx
index 517e5db4f9e6..0cbf4a2e5ba2 100644
--- a/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx
@@ -50,7 +50,7 @@ namespace vcl_cairocanvas
         mpBufferSurface = mpSpriteCanvas->createSurface( maSize, 
CAIRO_CONTENT_COLOR_ALPHA );
 
         maCanvasHelper.init( maSize,
-                             *rRefDevice,
+                             rRefDevice,
                              rRefDevice.get() );
         maCanvasHelper.setSurface( mpBufferSurface, true );
 
@@ -62,7 +62,7 @@ namespace vcl_cairocanvas
         maCanvasHelper.clear();
     }
 
-    /* void CanvasCustomSprite::disposeThis()
+    void CanvasCustomSprite::disposeThis()
     {
         ::osl::MutexGuard aGuard( m_aMutex );
 
@@ -71,7 +71,12 @@ namespace vcl_cairocanvas
 
         // forward to parent
         CanvasCustomSpriteBaseT::disposeThis();
-    } */
+    }
+
+    void CanvasCustomSprite::dispose()
+    {
+        disposeThis();
+    }
 
     void CanvasCustomSprite::redraw( const CairoSharedPtr& pCairo,
                                      bool                  bBufferedUpdate ) 
const
diff --git a/vcl/source/canvas/cairo/cairo_canvasfont.cxx 
b/vcl/source/canvas/cairo/cairo_canvasfont.cxx
index 8c1c6ae97239..2038f0eb7205 100644
--- a/vcl/source/canvas/cairo/cairo_canvasfont.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvasfont.cxx
@@ -40,7 +40,7 @@ namespace vcl_cairocanvas
     CanvasFont::CanvasFont( const rendering::FontRequest&                   
rFontRequest,
                             const uno::Sequence< beans::PropertyValue >&    
rExtraFontProperties,
                             const geometry::Matrix2D&                       
rFontMatrix,
-                            SurfaceProviderRef                              
rDevice ) :
+                            SurfaceProviderSharedPtr                        
rDevice ) :
         maFont( vcl::Font( rFontRequest.FontDescription.FamilyName,
                       rFontRequest.FontDescription.StyleName,
                       Size( 0, ::basegfx::fround(rFontRequest.CellSize) ) ) ),
@@ -95,7 +95,7 @@ namespace vcl_cairocanvas
         rGuard.unlock();
         {
             SolarMutexGuard aGuard;
-            mpRefDevice.clear();
+            mpRefDevice.reset();
         }
         rGuard.lock();
     }
@@ -104,7 +104,7 @@ namespace vcl_cairocanvas
     {
         SolarMutexGuard aGuard;
 
-        if( !mpRefDevice.is() )
+        if( !mpRefDevice )
             return uno::Reference< rendering::XTextLayout >(); // we're 
disposed
 
         return new TextLayout( aText,
diff --git a/vcl/source/canvas/cairo/cairo_canvashelper.cxx 
b/vcl/source/canvas/cairo/cairo_canvashelper.cxx
index 2635ba542096..9af33b5adfc3 100644
--- a/vcl/source/canvas/cairo/cairo_canvashelper.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvashelper.cxx
@@ -64,7 +64,6 @@ using namespace ::com::sun::star;
 namespace vcl_cairocanvas
 {
     CanvasHelper::CanvasHelper() :
-        mpSurfaceProvider(nullptr),
         mpDevice(nullptr),
         mbHaveAlpha()
     {
@@ -76,15 +75,15 @@ namespace vcl_cairocanvas
         mpCairo.reset();
         mpVirtualDevice.disposeAndClear();
         mpDevice = nullptr;
-        mpSurfaceProvider = nullptr;
+        mpSurfaceProvider.reset() ;
     }
 
     void CanvasHelper::init( const ::basegfx::B2ISize&  rSizePixel,
-                             SurfaceProvider&           rSurfaceProvider,
+                             SurfaceProviderSharedPtr   rSurfaceProvider,
                              vcl_canvas::GraphicDevice* pDevice )
     {
         maSize = rSizePixel;
-        mpSurfaceProvider = &rSurfaceProvider;
+        mpSurfaceProvider = rSurfaceProvider;
         mpDevice = pDevice;
     }
 
@@ -848,7 +847,7 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
                         doPolyPolygonImplementation( 
basegfx::B2DPolyPolygon(aEdge),
                                                      aOperation,
                                                      pCairo, pTextures,
-                                                     mpSurfaceProvider,
+                                                     
mpSurfaceProvider.lock().get(),
                                                      
xPolyPolygon->getFillRule() );
 
                         // prepare next step
@@ -861,7 +860,7 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
         {
             doPolyPolygonImplementation( aPolyPoly, aOperation,
                                          pCairo, pTextures,
-                                         mpSurfaceProvider,
+                                         mpSurfaceProvider.lock().get(),
                                          xPolyPolygon->getFillRule() );
         }
     }
@@ -1114,7 +1113,7 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
                 aBitmapSize.Width = static_cast<sal_Int32>( dWidth );
                 aBitmapSize.Height = static_cast<sal_Int32>( dHeight );
 
-                SurfaceSharedPtr pScaledSurface = 
mpSurfaceProvider->createSurface(
+                SurfaceSharedPtr pScaledSurface = 
mpSurfaceProvider.lock()->createSurface(
                     ::basegfx::B2ISize( aBitmapSize.Width, aBitmapSize.Height 
),
                     bHasAlpha ? CAIRO_CONTENT_COLOR_ALPHA : 
CAIRO_CONTENT_COLOR );
                 CairoSharedPtr pCairo = pScaledSurface->getCairo();
@@ -1155,8 +1154,8 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
                 if( x <= 0 && y <= 0 && x + width >= maSize.getWidth() && y + 
height >= maSize.getHeight() )
                 {
                     SAL_INFO( "canvas.cairo","trying to change surface to 
rgb");
-                    if( mpSurfaceProvider ) {
-                        SurfaceSharedPtr pNewSurface = 
mpSurfaceProvider->changeSurface();
+                    if( auto pSurfaceProvider = mpSurfaceProvider.lock() ) {
+                        SurfaceSharedPtr pNewSurface = 
pSurfaceProvider->changeSurface();
 
                         if( pNewSurface )
                             setSurface( pNewSurface, false );
@@ -1223,7 +1222,7 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
         uno::Reference< rendering::XCachedPrimitive > rv;
         unsigned char* data = nullptr;
         bool bHasAlpha = false;
-        SurfaceSharedPtr pSurface = surfaceFromXBitmap( xBitmap, 
mpSurfaceProvider, data, bHasAlpha );
+        SurfaceSharedPtr pSurface = surfaceFromXBitmap( xBitmap, 
mpSurfaceProvider.lock().get(), data, bHasAlpha );
         geometry::IntegerSize2D aSize = xBitmap->getSize();
 
         if( pSurface )
@@ -1256,7 +1255,7 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
         uno::Reference< rendering::XCachedPrimitive > rv;
         unsigned char* data = nullptr;
         bool bHasAlpha = false;
-        SurfaceSharedPtr pSurface = surfaceFromXBitmap( xBitmap, 
mpSurfaceProvider, data, bHasAlpha );
+        SurfaceSharedPtr pSurface = surfaceFromXBitmap( xBitmap, 
mpSurfaceProvider.lock().get(), data, bHasAlpha );
         geometry::IntegerSize2D aSize = xBitmap->getSize();
 
         if( pSurface )
@@ -1279,7 +1278,7 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
 
     geometry::IntegerSize2D CanvasHelper::getSize() const
     {
-        if( !mpSurfaceProvider )
+        if( !mpSurfaceProvider.lock() )
             return geometry::IntegerSize2D(1, 1); // we're disposed
 
         return ::basegfx::unotools::integerSize2DFromB2ISize( maSize );
diff --git a/vcl/source/canvas/cairo/cairo_canvashelper_text.cxx 
b/vcl/source/canvas/cairo/cairo_canvashelper_text.cxx
index 3fca5978523f..7a00a59a48c8 100644
--- a/vcl/source/canvas/cairo/cairo_canvashelper_text.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvashelper_text.cxx
@@ -45,7 +45,8 @@ namespace vcl_cairocanvas
                                                                        const 
uno::Sequence< beans::PropertyValue >& extraFontProperties,
                                                                        const 
geometry::Matrix2D&                    fontMatrix )
     {
-        return uno::Reference< rendering::XCanvasFont >( new CanvasFont( 
fontRequest, extraFontProperties, fontMatrix, mpSurfaceProvider ));
+        // DONT_FORGET_TO_REMOVE_THIS_COMMENT
+        return uno::Reference< rendering::XCanvasFont >( /* new CanvasFont( 
fontRequest, extraFontProperties, fontMatrix, mpSurfaceProvider ) */);
     }
 
     uno::Sequence< rendering::FontInfo > CanvasHelper::queryAvailableFonts( 
const rendering::XCanvas*                       ,
@@ -250,7 +251,7 @@ namespace vcl_cairocanvas
             // TODO(F2): alpha
             mpVirtualDevice->SetLayoutMode( nLayoutMode );
 
-            rtl::Reference pTextLayout( new TextLayout(text, textDirection, 0, 
CanvasFont::Reference(dynamic_cast< CanvasFont* >( xFont.get() )), 
mpSurfaceProvider) );
+            rtl::Reference pTextLayout( new TextLayout(text, textDirection, 0, 
CanvasFont::Reference(dynamic_cast< CanvasFont* >( xFont.get() )), 
mpSurfaceProvider.lock()) );
             pTextLayout->draw(*mpVirtualDevice, aOutpos, viewState, 
renderState);
         }
 
diff --git a/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx 
b/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx
index ff66ff49507a..c1f63cc1d444 100644
--- a/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx
+++ b/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx
@@ -17,6 +17,7 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
+#include <memory>
 #include <sal/config.h>
 #include <sal/log.hxx>
 
@@ -91,7 +92,6 @@ namespace vcl_cairocanvas
 
     SpriteCanvasHelper::SpriteCanvasHelper() :
         mpRedrawManager( nullptr ),
-        mpOwningSpriteCanvas( nullptr ),
         mbCompositingSurfaceDirty(true)
     {
     }
@@ -101,15 +101,15 @@ namespace vcl_cairocanvas
                                    const ::basegfx::B2ISize&      rSize )
     {
         mpRedrawManager = &rManager;
-        mpOwningSpriteCanvas = &rDevice;
+        mpOwningSpriteCanvas = rDevice.shared_from_this();
 
-        CanvasHelper::init( rSize, rDevice, &rDevice );
+        CanvasHelper::init( rSize, rDevice.shared_from_this(), &rDevice );
     }
 
     void SpriteCanvasHelper::disposing()
     {
         mpCompositingSurface.reset();
-        mpOwningSpriteCanvas = nullptr;
+        mpOwningSpriteCanvas.reset();
         mpRedrawManager = nullptr;
 
         // forward to base
@@ -129,13 +129,13 @@ namespace vcl_cairocanvas
         return uno::Reference< rendering::XAnimatedSprite >();
     }
 
-    ::vcl_canvas::CustomSprite* SpriteCanvasHelper::createCustomSprite( const 
geometry::RealSize2D& spriteSize )
+    ::vcl_canvas::CustomSpriteSharedPtr 
SpriteCanvasHelper::createCustomSprite( const geometry::RealSize2D& spriteSize )
     {
-        if( !mpRedrawManager )
+        if( !mpRedrawManager || mpOwningSpriteCanvas.lock())
             return nullptr; // we're disposed
 
-        return new CanvasCustomSprite( spriteSize,
-                                    mpOwningSpriteCanvas );
+        return std::make_shared<CanvasCustomSprite>( spriteSize,
+                                    mpOwningSpriteCanvas.lock() );
     }
 
     uno::Reference< rendering::XSprite > 
SpriteCanvasHelper::createClonedSprite(
@@ -148,22 +148,23 @@ namespace vcl_cairocanvas
                                                  bool                   
bUpdateAll,
                                                  bool&                  
io_bSurfaceDirty )
     {
+        auto pOwningSpriteCanvas = mpOwningSpriteCanvas.lock();
         if( !mpRedrawManager ||
-            !mpOwningSpriteCanvas ||
-            !mpOwningSpriteCanvas->getWindowSurface() ||
-            !mpOwningSpriteCanvas->getBufferSurface() )
+            !pOwningSpriteCanvas ||
+            !pOwningSpriteCanvas->getWindowSurface() ||
+            !pOwningSpriteCanvas->getBufferSurface() )
         {
             return false; // disposed, or otherwise dysfunctional
         }
 
         SAL_INFO("canvas.cairo", "SpriteCanvasHelper::updateScreen called");
 
-        const ::basegfx::B2ISize& rSize = mpOwningSpriteCanvas->getSizePixel();
+        const ::basegfx::B2ISize& rSize = pOwningSpriteCanvas->getSizePixel();
 
         // force compositing surface to be available before using it
         // inside forEachSpriteArea
         SurfaceSharedPtr pCompositingSurface = getCompositingSurface(rSize);
-        SurfaceSharedPtr pWindowSurface = 
mpOwningSpriteCanvas->getWindowSurface();
+        SurfaceSharedPtr pWindowSurface = 
pOwningSpriteCanvas->getWindowSurface();
         CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
         CairoSharedPtr pWindowCairo = pWindowSurface->getCairo();
 
@@ -189,7 +190,7 @@ namespace vcl_cairocanvas
             cairo_clip( pCompositingCairo.get() );
             cairo_save( pCompositingCairo.get() );
             cairo_set_source_surface( pCompositingCairo.get(),
-                                      
mpOwningSpriteCanvas->getBufferSurface()->getCairoSurface().get(),
+                                      
pOwningSpriteCanvas->getBufferSurface()->getCairoSurface().get(),
                                       0, 0 );
             cairo_set_operator( pCompositingCairo.get(), CAIRO_OPERATOR_SOURCE 
);
             cairo_paint( pCompositingCairo.get() );
@@ -220,16 +221,17 @@ namespace vcl_cairocanvas
         io_bSurfaceDirty = false;
 
         // commit to screen
-        mpOwningSpriteCanvas->flush();
+        pOwningSpriteCanvas->flush();
 
         return true;
     }
 
     void SpriteCanvasHelper::backgroundPaint( const ::basegfx::B2DRange& 
rUpdateRect )
     {
-        if( mpOwningSpriteCanvas && mpCompositingSurface )
+        auto pOwningSpriteCanvas = mpOwningSpriteCanvas.lock();
+        if( pOwningSpriteCanvas && mpCompositingSurface )
             repaintBackground( mpCompositingSurface->getCairo(),
-                               mpOwningSpriteCanvas->getBufferSurface(),
+                               pOwningSpriteCanvas->getBufferSurface(),
                                rUpdateRect );
     }
 
@@ -237,19 +239,20 @@ namespace vcl_cairocanvas
                                            const ::basegfx::B2DRange&          
             rMoveEnd,
                                            const 
::vcl_canvas::SpriteRedrawManager::UpdateArea& rUpdateArea )
     {
-        ENSURE_OR_THROW( mpOwningSpriteCanvas &&
-                          mpOwningSpriteCanvas->getBufferSurface(),
+        auto pOwningSpriteCanvas = mpOwningSpriteCanvas.lock();
+        ENSURE_OR_THROW( pOwningSpriteCanvas &&
+                          pOwningSpriteCanvas->getBufferSurface(),
                           "SpriteCanvasHelper::scrollUpdate(): NULL device 
pointer " );
 
         SAL_INFO("canvas.cairo", "SpriteCanvasHelper::scrollUpdate called");
 
-        const ::basegfx::B2ISize& rSize = mpOwningSpriteCanvas->getSizePixel();
+        const ::basegfx::B2ISize& rSize = pOwningSpriteCanvas->getSizePixel();
         const ::basegfx::B2IRange  aOutputBounds( 0,0,
                                                   rSize.getWidth(),
                                                   rSize.getHeight() );
 
         SurfaceSharedPtr pCompositingSurface = getCompositingSurface(rSize);
-        SurfaceSharedPtr pWindowSurface = 
mpOwningSpriteCanvas->getWindowSurface();
+        SurfaceSharedPtr pWindowSurface = 
pOwningSpriteCanvas->getWindowSurface();
         CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
         CairoSharedPtr pWindowCairo = pWindowSurface->getCairo();
 
@@ -286,7 +289,7 @@ namespace vcl_cairocanvas
             for( const auto& rComponent : rUpdateArea.maComponentList )
             {
                 const ::vcl_canvas::Sprite::Reference& rSprite( 
rComponent.second.getSprite() );
-                if( rSprite.is() )
+                if( rSprite )
                     ::boost::polymorphic_downcast< Sprite* >( rSprite.get() 
)->redraw(
                         pCompositingCairo, true );
             }
@@ -337,7 +340,7 @@ namespace vcl_cairocanvas
                   aSecond( aFirst );
             ++aSecond;
 
-            ENSURE_OR_THROW( aFirst->second.getSprite().is(),
+            ENSURE_OR_THROW( aFirst->second.getSprite(),
                              "VCLCanvas::scrollUpdate(): no sprite" );
 
             // repaint uncovered areas from sprite. Need to actually
@@ -357,7 +360,7 @@ namespace vcl_cairocanvas
                                          ::basegfx::B2DRange( aDestRect ) );
         for( const auto& rArea : aUncoveredAreas )
             repaintBackground( pCompositingCairo,
-                               mpOwningSpriteCanvas->getBufferSurface(), rArea 
);
+                               pOwningSpriteCanvas->getBufferSurface(), rArea 
);
 
         cairo_rectangle( pWindowCairo.get(), 0, 0, rSize.getWidth(), 
rSize.getHeight() );
         cairo_clip( pWindowCairo.get() );
@@ -371,16 +374,17 @@ namespace vcl_cairocanvas
     void SpriteCanvasHelper::opaqueUpdate( const ::basegfx::B2DRange&          
                rTotalArea,
                                            const std::vector< 
::vcl_canvas::Sprite::Reference >& rSortedUpdateSprites )
     {
-        ENSURE_OR_THROW( mpOwningSpriteCanvas &&
-                          mpOwningSpriteCanvas->getBufferSurface(),
+        auto pOwningSpriteCanvas = mpOwningSpriteCanvas.lock();
+        ENSURE_OR_THROW( pOwningSpriteCanvas &&
+                          pOwningSpriteCanvas->getBufferSurface(),
                           "SpriteCanvasHelper::opaqueUpdate(): NULL device 
pointer " );
 
         SAL_INFO("canvas.cairo", "SpriteCanvasHelper::opaqueUpdate called");
 
-        const ::basegfx::B2ISize& rDeviceSize = 
mpOwningSpriteCanvas->getSizePixel();
+        const ::basegfx::B2ISize& rDeviceSize = 
pOwningSpriteCanvas->getSizePixel();
 
         SurfaceSharedPtr pCompositingSurface = 
getCompositingSurface(rDeviceSize);
-        SurfaceSharedPtr pWindowSurface = 
mpOwningSpriteCanvas->getWindowSurface();
+        SurfaceSharedPtr pWindowSurface = 
pOwningSpriteCanvas->getWindowSurface();
         CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
         CairoSharedPtr pWindowCairo = pWindowSurface->getCairo();
 
@@ -396,7 +400,7 @@ namespace vcl_cairocanvas
         // repaint all affected sprites directly to output device
         for( const auto& rSprite : rSortedUpdateSprites )
         {
-            if( rSprite.is() )
+            if( rSprite )
                 ::boost::polymorphic_downcast< Sprite* >( rSprite.get() 
)->redraw(
                     pCompositingCairo, false );
         }
@@ -416,18 +420,19 @@ namespace vcl_cairocanvas
     void SpriteCanvasHelper::genericUpdate( const ::basegfx::B2DRange&         
                 rRequestedArea,
                                             const std::vector< 
::vcl_canvas::Sprite::Reference >& rSortedUpdateSprites )
     {
+        auto pOwningSpriteCanvas = mpOwningSpriteCanvas.lock();
         // TODO
         SAL_INFO("canvas.cairo", "SpriteCanvasHelper::genericUpdate called");
 
-        ENSURE_OR_THROW( mpOwningSpriteCanvas &&
-                         mpOwningSpriteCanvas->getBufferSurface(),
+        ENSURE_OR_THROW( pOwningSpriteCanvas &&
+                         pOwningSpriteCanvas->getBufferSurface(),
                          "SpriteCanvasHelper::genericUpdate(): NULL device 
pointer " );
 
         // limit size of update VDev to target outdev's size
-        const ::basegfx::B2ISize& rSize = mpOwningSpriteCanvas->getSizePixel();
+        const ::basegfx::B2ISize& rSize = pOwningSpriteCanvas->getSizePixel();
 
         SurfaceSharedPtr pCompositingSurface = getCompositingSurface(rSize);
-        SurfaceSharedPtr pWindowSurface = 
mpOwningSpriteCanvas->getWindowSurface();
+        SurfaceSharedPtr pWindowSurface = 
pOwningSpriteCanvas->getWindowSurface();
         CairoSharedPtr pCompositingCairo = pCompositingSurface->getCairo();
         CairoSharedPtr pWindowCairo = pWindowSurface->getCairo();
 
@@ -455,7 +460,7 @@ namespace vcl_cairocanvas
         // paint background
         cairo_save( pCompositingCairo.get() );
         cairo_set_source_surface( pCompositingCairo.get(),
-                                  
mpOwningSpriteCanvas->getBufferSurface()->getCairoSurface().get(),
+                                  
pOwningSpriteCanvas->getBufferSurface()->getCairoSurface().get(),
                                   0, 0 );
         cairo_set_operator( pCompositingCairo.get(), CAIRO_OPERATOR_SOURCE );
         cairo_paint( pCompositingCairo.get() );
@@ -465,7 +470,7 @@ namespace vcl_cairocanvas
         // VDev.
         for( const auto& rSprite : rSortedUpdateSprites )
         {
-            if( rSprite.is() )
+            if( rSprite )
                 ::boost::polymorphic_downcast< Sprite* >( rSprite.get() 
)->redraw(
                     pCompositingCairo, true );
         }
@@ -509,7 +514,7 @@ namespace vcl_cairocanvas
 
     ::cairo::SurfaceSharedPtr SpriteCanvasHelper::createSurface( const 
::basegfx::B2ISize& rNeededSize ) const
     {
-        return mpOwningSpriteCanvas->getWindowSurface()->getSimilar(
+        return mpOwningSpriteCanvas.lock()->getWindowSurface()->getSimilar(
                     CAIRO_CONTENT_COLOR,
                     rNeededSize.getWidth(), rNeededSize.getHeight() );
     }
diff --git a/vcl/source/canvas/cairo/cairo_spritehelper.cxx 
b/vcl/source/canvas/cairo/cairo_spritehelper.cxx
index 8ba15bf65587..879f28708522 100644
--- a/vcl/source/canvas/cairo/cairo_spritehelper.cxx
+++ b/vcl/source/canvas/cairo/cairo_spritehelper.cxx
@@ -130,7 +130,7 @@ namespace vcl_cairocanvas
                     rClip ));
 
             doPolyPolygonImplementation( aClipPoly, Clip, pCairo.get(),
-                                         nullptr, 
SurfaceProviderSharedPtr(mpSpriteCanvas),
+                                         nullptr, mpSpriteCanvas.get(),
                                          rClip->getFillRule() );
         }
 
diff --git a/vcl/source/canvas/cairo/cairo_textlayout.cxx 
b/vcl/source/canvas/cairo/cairo_textlayout.cxx
index c9764ce97e83..d600c05670c2 100644
--- a/vcl/source/canvas/cairo/cairo_textlayout.cxx
+++ b/vcl/source/canvas/cairo/cairo_textlayout.cxx
@@ -74,7 +74,7 @@ namespace vcl_cairocanvas
                             sal_Int8                      nDirection,
                             sal_Int64                     /*nRandomSeed*/,
                             CanvasFont::Reference         rFont,
-                            SurfaceProviderRef            rRefDevice ) :
+                            SurfaceProviderSharedPtr      rRefDevice ) :
         maText(std::move( aText )),
         mpFont(std::move( rFont )),
         mpRefDevice(std::move( rRefDevice )),
@@ -89,7 +89,7 @@ namespace vcl_cairocanvas
     void TextLayout::disposing(std::unique_lock<std::mutex>& /*rGuard*/)
     {
         mpFont.clear();
-        mpRefDevice.clear();
+        mpRefDevice.reset();
     }
 
     // XTextLayout
diff --git a/vcl/source/canvas/tools/spriteredrawmanager.cxx 
b/vcl/source/canvas/tools/spriteredrawmanager.cxx
index dfaffeb18c38..9dc7e55c2294 100644
--- a/vcl/source/canvas/tools/spriteredrawmanager.cxx
+++ b/vcl/source/canvas/tools/spriteredrawmanager.cxx
@@ -246,7 +246,7 @@ namespace vcl_canvas
         for( const auto& rChangeRecord : maChangeRecords )
         {
             const Sprite::Reference& rSprite( rChangeRecord.getSprite() );
-            if( rSprite.is() )
+            if( rSprite )
                 aUpdatableSprites.push_back( rSprite );
         }
 
@@ -335,10 +335,10 @@ namespace vcl_canvas
 
         if( !aFirst->second.isPureMove() ||
             !aSecond->second.isPureMove() ||
-            !aFirst->second.getSprite().is() ||
+            !aFirst->second.getSprite() ||
             // use _true_ update area, not the rounded version
             !aFirst->second.getSprite()->isAreaUpdateOpaque( 
aFirst->second.getUpdateArea() ) ||
-            aSecond->second.getSprite().is() )
+            aSecond->second.getSprite() )
         {
             // either no move update, or incorrect sprite, or sprite
             // content not fully opaque over update region.
@@ -368,7 +368,7 @@ namespace vcl_canvas
     {
         const Sprite::Reference& pAffectedSprite( 
rComponent.second.getSprite() );
 
-        if( !pAffectedSprite.is() )
+        if( !pAffectedSprite )
             return true; // no sprite, no opaque update!
 
         return !pAffectedSprite->isAreaUpdateOpaque( rUpdateRect );
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 631b65fa6f0b..afc6f4acb6b1 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -578,7 +578,7 @@ Window::~Window()
 
 std::shared_ptr<vcl_cairocanvas::SpriteCanvas> Window::GetSpriteCanvas()
 {
-    Sequence< Any > aArg{
+    const Sequence< Any > aArg{
         Any(reinterpret_cast<sal_Int64>(GetOutDev())),
         Any(css::awt::Rectangle( 0, 0, 0, 0 )),
         Any(false),
@@ -586,7 +586,10 @@ std::shared_ptr<vcl_cairocanvas::SpriteCanvas> 
Window::GetSpriteCanvas()
         GetOutDev()->GetSystemGfxDataAny()
     };
     const Reference< XComponentContext >& xContext = 
comphelper::getProcessComponentContext();
-    auto pSpriteCanvas = std::make_shared<vcl_cairocanvas::SpriteCanvas>(aArg, 
xContext);
+    // auto pSpriteCanvas = 
std::make_shared<vcl_cairocanvas::SpriteCanvas>(aArg, xContext);
+    auto pSpriteCanvas = std::shared_ptr<vcl_cairocanvas::SpriteCanvas>(
+        new vcl_cairocanvas::SpriteCanvas(aArg, xContext)
+    );
     return pSpriteCanvas;
 }
 
commit 5c8e5d52999f319e7e6941f9a4f61e91edded68d
Author:     Shardul Vikram Singh <shardulvi...@gmail.com>
AuthorDate: Thu Jul 24 14:04:01 2025 +0530
Commit:     Shardul Vikram Singh <shardulvi...@gmail.com>
CommitDate: Thu Jul 24 14:04:01 2025 +0530

    More refactoring

diff --git a/include/vcl_canvas/canvas.hxx b/include/vcl_canvas/canvas.hxx
index 48f599891a72..9a0a1e18f49b 100644
--- a/include/vcl_canvas/canvas.hxx
+++ b/include/vcl_canvas/canvas.hxx
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <memory>
 namespace vcl_canvas
 {
 class Canvas
@@ -8,4 +9,6 @@ public:
     virtual void clear() = 0;
     // NO DRAWING FUNCTIONS NEEDED :)
 };
+
+typedef std::shared_ptr<Canvas> CanvasSharedPtr;
 }
diff --git a/include/vcl_canvas/customsprite.hxx 
b/include/vcl_canvas/customsprite.hxx
index 9d589ec47977..131d5335ac84 100644
--- a/include/vcl_canvas/customsprite.hxx
+++ b/include/vcl_canvas/customsprite.hxx
@@ -9,7 +9,7 @@ namespace vcl_canvas
 class CustomSprite : public SpriteBase
 {
 public:
-    virtual Canvas getContentCanvas() = 0;
+    virtual Canvas* getContentCanvas() = 0;
 };
 
 typedef std::shared_ptr<CustomSprite> CustomSpriteSharedPtr;
diff --git a/include/vcl_canvas/graphicdevice.hxx 
b/include/vcl_canvas/graphicdevice.hxx
index 6394895480cc..dd3519d8b200 100644
--- a/include/vcl_canvas/graphicdevice.hxx
+++ b/include/vcl_canvas/graphicdevice.hxx
@@ -15,12 +15,12 @@ public:
     virtual ::css::uno::Reference< ::css::rendering::XColorSpace > 
getDeviceColorSpace() = 0;
     virtual ::css::geometry::RealSize2D getPhysicalResolution() = 0;
     virtual ::css::geometry::RealSize2D getPhysicalSize() = 0;
-    virtual ::css::uno::Reference< ::css::rendering::XLinePolyPolygon2D > 
createCompatibleLinePolyPolygon( const ::css::uno::Sequence< 
::css::uno::Sequence< ::css::geometry::RealPoint2D > >& points ) = 0;
+    /* virtual ::css::uno::Reference< ::css::rendering::XLinePolyPolygon2D > 
createCompatibleLinePolyPolygon( const ::css::uno::Sequence< 
::css::uno::Sequence< ::css::geometry::RealPoint2D > >& points ) = 0;
     virtual ::css::uno::Reference< ::css::rendering::XBezierPolyPolygon2D > 
createCompatibleBezierPolyPolygon( const ::css::uno::Sequence< 
::css::uno::Sequence< ::css::geometry::RealBezierSegment2D > >& points ) = 0;
     virtual ::css::uno::Reference< ::css::rendering::XBitmap > 
createCompatibleBitmap( const ::css::geometry::IntegerSize2D& size ) = 0;
     virtual ::css::uno::Reference< ::css::rendering::XVolatileBitmap > 
createVolatileBitmap( const ::css::geometry::IntegerSize2D& size ) = 0;
     virtual ::css::uno::Reference< ::css::rendering::XBitmap > 
createCompatibleAlphaBitmap( const ::css::geometry::IntegerSize2D& size ) = 0;
-    virtual ::css::uno::Reference< ::css::rendering::XVolatileBitmap > 
createVolatileAlphaBitmap( const ::css::geometry::IntegerSize2D& size ) = 0;
+    virtual ::css::uno::Reference< ::css::rendering::XVolatileBitmap > 
createVolatileAlphaBitmap( const ::css::geometry::IntegerSize2D& size ) = 0; */
     virtual ::sal_Bool hasFullScreenMode() = 0;
     virtual ::sal_Bool enterFullScreenMode( ::sal_Bool bEnter ) = 0;
 };
diff --git a/include/vcl_canvas/spritecanvas.hxx 
b/include/vcl_canvas/spritecanvas.hxx
index ac0ca22e8125..50e4b8d328cd 100644
--- a/include/vcl_canvas/spritecanvas.hxx
+++ b/include/vcl_canvas/spritecanvas.hxx
@@ -11,8 +11,8 @@ namespace vcl_canvas
 class SpriteCanvas : public Canvas
 {
 public:
-    virtual CustomSpriteSharedPtr createCustomSprite( const 
::css::geometry::RealSize2D& spriteSize ) = 0;
-    virtual SpriteSharedPtr createClonedSprite( const SpriteBase& original ) = 
0;
+    virtual CustomSprite* createCustomSprite( const 
::css::geometry::RealSize2D& spriteSize ) = 0;
+    // virtual SpriteSharedPtr createClonedSprite( const SpriteBase& original 
) = 0;
     virtual sal_Bool updateScreen( sal_Bool bUpdateAll ) = 0;
 };
 
diff --git a/include/vcl_canvas/windowlistener.hxx 
b/include/vcl_canvas/windowlistener.hxx
deleted file mode 100644
index c1ad70446b02..000000000000
--- a/include/vcl_canvas/windowlistener.hxx
+++ /dev/null
@@ -1,15 +0,0 @@
-#pragma once
-
-#include <com/sun/star/awt/WindowEvent.hpp>
-
-namespace vcl_canvas
-{
-class WindowListener
-{
-public:
-    virtual void windowResized( const ::css::awt::WindowEvent& e ) = 0;
-    virtual void windowMoved( const ::css::awt::WindowEvent& e ) = 0;
-    virtual void windowShown( const ::css::lang::EventObject& e ) = 0;
-    virtual void windowHidden( const ::css::lang::EventObject& e ) = 0;
-};
-}
diff --git a/vcl/canvas_inc/base/bitmapcanvasbase.hxx 
b/vcl/canvas_inc/base/bitmapcanvasbase.hxx
index a017b1af43ad..d6e51bf7ceb2 100644
--- a/vcl/canvas_inc/base/bitmapcanvasbase.hxx
+++ b/vcl/canvas_inc/base/bitmapcanvasbase.hxx
@@ -102,7 +102,7 @@ namespace vcl_canvas
 
     public:
         // XBitmapCanvas
-        virtual void SAL_CALL copyRect( const css::uno::Reference< 
css::rendering::XBitmapCanvas >&   sourceCanvas,
+        /* virtual void SAL_CALL copyRect( const css::uno::Reference< 
css::rendering::XBitmapCanvas >&   sourceCanvas,
                                         const css::geometry::RealRectangle2D&  
                                    sourceRect,
                                         const css::rendering::ViewState&       
                                    sourceViewState,
                                         const css::rendering::RenderState&     
                                    sourceRenderState,
@@ -118,7 +118,7 @@ namespace vcl_canvas
             typename BaseType::BaseType::MutexType aGuard( BaseType::m_aMutex 
);
 
             BaseType::BaseType::mbSurfaceDirty = true;
-        }
+        } */
     };
 }
 
diff --git a/vcl/canvas_inc/base/bufferedgraphicdevicebase.hxx 
b/vcl/canvas_inc/base/bufferedgraphicdevicebase.hxx
index 635cffc513bc..dd501859262a 100644
--- a/vcl/canvas_inc/base/bufferedgraphicdevicebase.hxx
+++ b/vcl/canvas_inc/base/bufferedgraphicdevicebase.hxx
@@ -157,7 +157,7 @@ namespace vcl_canvas
             return css::uno::Any(mxWindow);
         }
 
-        virtual void disposeThis() override
+        /* virtual void disposeThis() override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -169,7 +169,7 @@ namespace vcl_canvas
 
             // pass on to base class
             BaseType::disposeThis();
-        }
+        } */
 
         css::awt::Rectangle transformBounds( const css::awt::Rectangle& 
rBounds )
         {
@@ -204,7 +204,7 @@ namespace vcl_canvas
         }
 
         // XWindowListener
-        virtual void disposeEventSource( const css::lang::EventObject& Source 
) override
+        /* virtual void disposeEventSource( const css::lang::EventObject& 
Source ) override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -212,7 +212,7 @@ namespace vcl_canvas
                 mxWindow.clear();
 
             BaseType::disposeEventSource(Source);
-        }
+        } */
 
         virtual void SAL_CALL windowResized( const css::awt::WindowEvent& e ) 
override
         {
diff --git a/vcl/canvas_inc/base/canvasbase.hxx 
b/vcl/canvas_inc/base/canvasbase.hxx
index 3521babe695e..614b9b659917 100644
--- a/vcl/canvas_inc/base/canvasbase.hxx
+++ b/vcl/canvas_inc/base/canvasbase.hxx
@@ -131,7 +131,7 @@ namespace vcl_canvas
         } */
 
         // XCanvas
-        /* virtual void SAL_CALL clear() override
+        virtual void SAL_CALL clear() override
         {
             MutexType aGuard( BaseType::m_aMutex );
 
@@ -140,7 +140,7 @@ namespace vcl_canvas
             maCanvasHelper.clear();
         }
 
-        virtual void SAL_CALL drawPoint(const css::geometry::RealPoint2D&     
aPoint,
+        /* virtual void SAL_CALL drawPoint(const css::geometry::RealPoint2D&   
  aPoint,
                                         const css::rendering::ViewState&      
viewState,
                                         const css::rendering::RenderState&    
renderState) override
         {
diff --git a/vcl/canvas_inc/base/canvascustomspritebase.hxx 
b/vcl/canvas_inc/base/canvascustomspritebase.hxx
index 11d8baa7fe57..5c63d36495e4 100644
--- a/vcl/canvas_inc/base/canvascustomspritebase.hxx
+++ b/vcl/canvas_inc/base/canvascustomspritebase.hxx
@@ -19,6 +19,7 @@
 
 #pragma once
 
+#include "vcl_canvas/canvas.hxx"
 #include <com/sun/star/rendering/XCanvas.hpp>
 
 #include <basegfx/point/b2dpoint.hxx>
@@ -90,7 +91,7 @@ namespace vcl_canvas
             @derive when overriding this method in derived classes,
             <em>always</em> call the base class' method!
          */
-        virtual void disposeThis() override
+        /* virtual void disposeThis() override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -98,10 +99,10 @@ namespace vcl_canvas
 
             // pass on to base class
             BaseType::disposeThis();
-        }
+        } */
 
         // XCanvas: selectively override base's methods here, for opacity 
tracking
-        virtual void SAL_CALL clear() override
+        /* virtual void SAL_CALL clear() override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -109,9 +110,9 @@ namespace vcl_canvas
 
             // and forward to base class, which handles the actual rendering
             return BaseType::clear();
-        }
+        } */
 
-        virtual css::uno::Reference< css::rendering::XCachedPrimitive > 
SAL_CALL
+        /* virtual css::uno::Reference< css::rendering::XCachedPrimitive > 
SAL_CALL
             drawBitmap( const css::uno::Reference< css::rendering::XBitmap >&  
            xBitmap,
                         const css::rendering::ViewState&                       
            viewState,
                         const css::rendering::RenderState&                     
            renderState ) override
@@ -128,7 +129,7 @@ namespace vcl_canvas
             return BaseType::drawBitmap( xBitmap,
                                          viewState,
                                          renderState );
-        }
+        } */
 
         // TODO(F3): If somebody uses the XIntegerBitmap methods to
         // clear pixel (setting alpha != 1.0 there), or a compositing
@@ -151,9 +152,9 @@ namespace vcl_canvas
                                     const css::rendering::ViewState&   
viewState,
                                     const css::rendering::RenderState& 
renderState ) override
         {
-            tools::verifyArgs(aNewPos, viewState, renderState,
+            /* tools::verifyArgs(aNewPos, viewState, renderState,
                               __func__,
-                              static_cast< typename 
BaseType::UnambiguousBaseType* >(this));
+                              static_cast< typename 
BaseType::UnambiguousBaseType* >(this)); */
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -162,9 +163,9 @@ namespace vcl_canvas
 
         virtual void SAL_CALL transform( const css::geometry::AffineMatrix2D& 
aTransformation ) override
         {
-            tools::verifyArgs(aTransformation,
+            /* tools::verifyArgs(aTransformation,
                               __func__,
-                              static_cast< typename 
BaseType::UnambiguousBaseType* >(this));
+                              static_cast< typename 
BaseType::UnambiguousBaseType* >(this)); */
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
@@ -202,7 +203,7 @@ namespace vcl_canvas
         }
 
         // XCustomSprite
-        virtual css::uno::Reference< css::rendering::XCanvas > SAL_CALL
+        Canvas* SAL_CALL
             getContentCanvas() override
         {
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
diff --git a/vcl/canvas_inc/base/graphicdevicebase.hxx 
b/vcl/canvas_inc/base/graphicdevicebase.hxx
index d89aaa0a6e24..077e51b08af9 100644
--- a/vcl/canvas_inc/base/graphicdevicebase.hxx
+++ b/vcl/canvas_inc/base/graphicdevicebase.hxx
@@ -131,7 +131,7 @@ namespace vcl_canvas
                           [this] (css::uno::Any const& rAny) { 
this->setDumpScreenContent(rAny); } } } } );
         }
 
-        virtual void disposeThis() override
+        /* virtual void disposeThis() override
         {
             MutexType aGuard( BaseType::m_aMutex );
 
@@ -139,7 +139,7 @@ namespace vcl_canvas
 
             // pass on to base class
             BaseType::disposeThis();
-        }
+        } */
 
         // XGraphicDevice
         /* virtual css::uno::Reference< css::rendering::XBufferController > 
SAL_CALL getBufferController(  ) override
@@ -168,7 +168,7 @@ namespace vcl_canvas
             return maDeviceHelper.getPhysicalSize();
         }
 
-        virtual css::uno::Reference< css::rendering::XLinePolyPolygon2D > 
SAL_CALL createCompatibleLinePolyPolygon( const css::uno::Sequence< 
css::uno::Sequence< css::geometry::RealPoint2D > >& points ) override
+        /* virtual css::uno::Reference< css::rendering::XLinePolyPolygon2D > 
SAL_CALL createCompatibleLinePolyPolygon( const css::uno::Sequence< 
css::uno::Sequence< css::geometry::RealPoint2D > >& points ) override
         {
             MutexType aGuard( BaseType::m_aMutex );
 
@@ -224,7 +224,7 @@ namespace vcl_canvas
             MutexType aGuard( BaseType::m_aMutex );
 
             return maDeviceHelper.createVolatileAlphaBitmap( this, size );
-        }
+        } */
 
         /* virtual css::uno::Reference< css::lang::XMultiServiceFactory > 
SAL_CALL getParametricPolyPolygonFactory(  ) override
         {
diff --git a/vcl/canvas_inc/base/sprite.hxx b/vcl/canvas_inc/base/sprite.hxx
index e01d90dc449d..1809ba1fba34 100644
--- a/vcl/canvas_inc/base/sprite.hxx
+++ b/vcl/canvas_inc/base/sprite.hxx
@@ -47,7 +47,7 @@ namespace vcl_canvas
         functionality (which, of course, is impossible here in a
         generic way)
     */
-    class Sprite : public css::lang::XComponent
+    class Sprite
     {
     public:
         typedef ::rtl::Reference< Sprite > Reference;
diff --git a/vcl/canvas_inc/base/spritecanvasbase.hxx 
b/vcl/canvas_inc/base/spritecanvasbase.hxx
index 837070f194ff..a1fbd2943313 100644
--- a/vcl/canvas_inc/base/spritecanvasbase.hxx
+++ b/vcl/canvas_inc/base/spritecanvasbase.hxx
@@ -119,11 +119,11 @@ namespace vcl_canvas
             return 
BaseType::maCanvasHelper.createSpriteFromBitmaps(animationBitmaps, 
interpolationMode);
         } */
 
-        virtual CustomSpriteSharedPtr SAL_CALL createCustomSprite( const 
css::geometry::RealSize2D& spriteSize ) override
+        virtual CustomSprite* SAL_CALL createCustomSprite( const 
css::geometry::RealSize2D& spriteSize ) override
         {
-            tools::verifySpriteSize(spriteSize,
+            /* tools::verifySpriteSize(spriteSize,
                                     __func__,
-                                    static_cast< typename 
BaseType::UnambiguousBaseType* >(this));
+                                    static_cast< typename 
BaseType::UnambiguousBaseType* >(this)); */
 
             typename BaseType::MutexType aGuard( BaseType::m_aMutex );
 
diff --git a/vcl/canvas_inc/cairo_canvasbitmap.hxx 
b/vcl/canvas_inc/cairo_canvasbitmap.hxx
index 32543c2c966f..da3c6c8c70bf 100644
--- a/vcl/canvas_inc/cairo_canvasbitmap.hxx
+++ b/vcl/canvas_inc/cairo_canvasbitmap.hxx
@@ -72,7 +72,7 @@ namespace vcl_cairocanvas
         */
         CanvasBitmap( const ::basegfx::B2ISize& rSize,
                       SurfaceProviderSharedPtr  rDevice,
-                      vcl_canvas::GraphicDeviceSharedPtr pDevice,
+                      vcl_canvas::GraphicDevice* pDevice,
                       bool                      bHasAlpha );
 
         /// Dispose all internal references
diff --git a/vcl/canvas_inc/cairo_canvascustomsprite.hxx 
b/vcl/canvas_inc/cairo_canvascustomsprite.hxx
index 83677ac7590f..75e6530707ef 100644
--- a/vcl/canvas_inc/cairo_canvascustomsprite.hxx
+++ b/vcl/canvas_inc/cairo_canvascustomsprite.hxx
@@ -32,6 +32,7 @@
 #include <base/basemutexhelper.hxx>
 #include <base/canvascustomspritebase.hxx>
 
+#include <memory>
 #include <vcl/cairo.hxx>
 
 #include "cairo_sprite.hxx"
@@ -39,35 +40,24 @@
 #include "cairo_repainttarget.hxx"
 #include "cairo_spritehelper.hxx"
 #include "cairo_spritecanvas.hxx"
+#include "vcl_canvas/canvas.hxx"
+#include "vcl_canvas/customsprite.hxx"
 
 
 namespace vcl_cairocanvas
 {
-    typedef ::cppu::WeakComponentImplHelper< css::rendering::XCustomSprite,
+    /* typedef ::cppu::WeakComponentImplHelper< css::rendering::XCustomSprite,
                                              css::rendering::XBitmapCanvas,
                                              css::rendering::XIntegerBitmap,
-                                             css::lang::XServiceInfo >  
CanvasCustomSpriteBase_Base;
-    /** Mixin Sprite
-
-        Have to mixin the Sprite interface before deriving from
-        ::canvas::CanvasCustomSpriteBase, as this template should
-        already implement some of those interface methods.
-
-        The reason why this appears kinda convoluted is the fact that
-        we cannot specify non-IDL types as WeakComponentImplHelper
-        template args, and furthermore, don't want to derive
-        ::canvas::CanvasCustomSpriteBase directly from
-        ::canvas::Sprite (because derivees of
-        ::canvas::CanvasCustomSpriteBase have to explicitly forward
-        the XInterface methods (e.g. via DECLARE_UNO3_AGG_DEFAULTS)
-        anyway). Basically, ::canvas::CanvasCustomSpriteBase should
-        remain a base class that provides implementation, not to
-        enforce any specific interface on its derivees.
-     */
-    class CanvasCustomSpriteSpriteBase_Base : public 
::vcl_canvas::BaseMutexHelper< CanvasCustomSpriteBase_Base >,
-                                                 public Sprite,
+                                             css::lang::XServiceInfo >  
CanvasCustomSpriteBase_Base; */
+
+    class CanvasCustomSpriteSpriteBase_Base : public 
::vcl_canvas::CustomSprite,
+                                              public ::vcl_canvas::Canvas,
+                                              public Sprite,
                                               public SurfaceProvider
     {
+    protected:
+        mutable osl::Mutex m_aMutex;
     };
 
     typedef ::vcl_canvas::CanvasCustomSpriteBase< 
CanvasCustomSpriteSpriteBase_Base,
@@ -79,7 +69,8 @@ namespace vcl_cairocanvas
     /* Definition of CanvasCustomSprite class */
 
     class CanvasCustomSprite : public CanvasCustomSpriteBaseT,
-                               public RepaintTarget
+                               public RepaintTarget,
+                               public 
std::enable_shared_from_this<CanvasCustomSprite>
     {
     public:
         /** Create a custom sprite
@@ -97,21 +88,21 @@ namespace vcl_cairocanvas
             Target DX device
          */
         CanvasCustomSprite( const css::geometry::RealSize2D&   rSpriteSize,
-                            const SpriteCanvasSharedPtr&                    
rRefDevice );
+                            const SpriteCanvasSharedPtr&       rRefDevice );
 
-        virtual void disposeThis() override;
+        // virtual void disposeThis() override;
 
         // Forwarding the XComponent implementation to the
         // cppu::ImplHelper templated base
         //                                    Classname           Base doing 
refcount          Base implementing the XComponent interface
         //                                          |                    |     
                    |
         //                                          V                    V     
                    V
-        DECLARE_UNO3_XCOMPONENT_AGG_DEFAULTS( CanvasCustomSprite, 
CanvasCustomSpriteBase_Base, ::cppu::WeakComponentImplHelperBase )
+        // DECLARE_UNO3_XCOMPONENT_AGG_DEFAULTS( CanvasCustomSprite, 
CanvasCustomSpriteBase_Base, ::cppu::WeakComponentImplHelperBase )
 
         // XServiceInfo
-        virtual OUString SAL_CALL getImplementationName() override;
+        /* virtual OUString SAL_CALL getImplementationName() override;
         virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName 
) override;
-        virtual css::uno::Sequence< OUString > SAL_CALL 
getSupportedServiceNames() override;
+        virtual css::uno::Sequence< OUString > SAL_CALL 
getSupportedServiceNames() override; */
 
         // Sprite
         virtual void redraw( const ::cairo::CairoSharedPtr& pCairo,
diff --git a/vcl/canvas_inc/cairo_canvashelper.hxx 
b/vcl/canvas_inc/cairo_canvashelper.hxx
index f9cd51bfd99c..a439cd2fb340 100644
--- a/vcl/canvas_inc/cairo_canvashelper.hxx
+++ b/vcl/canvas_inc/cairo_canvashelper.hxx
@@ -77,7 +77,7 @@ namespace vcl_cairocanvas
          */
         void init( const ::basegfx::B2ISize& rSizePixel,
                    SurfaceProvider&          rSurfaceProvider,
-                   ::vcl_canvas::GraphicDeviceSharedPtr pDevice );
+                   ::vcl_canvas::GraphicDevice* pDevice );
 
         void setSize( const ::basegfx::B2ISize& rSize );
         void setSurface( const ::cairo::SurfaceSharedPtr& pSurface, bool 
bHasAlpha );
diff --git a/vcl/canvas_inc/cairo_spritecanvas.hxx 
b/vcl/canvas_inc/cairo_spritecanvas.hxx
index 71eab0852aed..af179adc39d6 100644
--- a/vcl/canvas_inc/cairo_spritecanvas.hxx
+++ b/vcl/canvas_inc/cairo_spritecanvas.hxx
@@ -20,7 +20,6 @@
 #pragma once
 
 #include <memory>
-#include <vcl_canvas/windowlistener.hxx>
 #include <vcl_canvas/updatable.hxx>
 #include <vcl_canvas/spritecanvas.hxx>
 #include <vcl_canvas/graphicdevice.hxx>
@@ -39,16 +38,19 @@
 #include "cairo_repainttarget.hxx"
 #include "cairo_surfaceprovider.hxx"
 #include "cairo_spritecanvashelper.hxx"
+#include "com/sun/star/awt/XWindowListener.hdl"
 
 namespace vcl_cairocanvas
 {
     class SpriteCanvasBase_Base : public ::vcl_canvas::SpriteCanvas,
                                   public ::vcl_canvas::GraphicDevice,
-                                  public ::vcl_canvas::WindowListener,
                                   public ::vcl_canvas::Updatable,
                                   public ::vcl_canvas::SpriteSurface,
-                                  public SurfaceProvider
+                                  public SurfaceProvider,
+                                  public css::awt::XWindowListener
     {
+    protected:
+        mutable ::osl::Mutex m_aMutex;
     };
     /* typedef ::cppu::WeakComponentImplHelper< css::rendering::XSpriteCanvas,
                                              css::rendering::XIntegerBitmap,
@@ -60,7 +62,7 @@ namespace vcl_cairocanvas
                                              css::beans::XPropertySet,
                                              css::lang::XServiceName,
                                              css::lang::XServiceInfo >  
WindowGraphicDeviceBase_Base; */
-    typedef ::vcl_canvas::BufferedGraphicDeviceBase< 
::vcl_canvas::DisambiguationHelper< SpriteCanvasBase_Base >,
+    typedef ::vcl_canvas::BufferedGraphicDeviceBase< SpriteCanvasBase_Base ,
                                                  SpriteDeviceHelper,
                                                  ::osl::MutexGuard,
                                                  ::cppu::OWeakObject > 
SpriteCanvasBase_Base2;
diff --git a/vcl/canvas_inc/cairo_spritecanvashelper.hxx 
b/vcl/canvas_inc/cairo_spritecanvashelper.hxx
index 19221fc06d09..8c3205a4281c 100644
--- a/vcl/canvas_inc/cairo_spritecanvashelper.hxx
+++ b/vcl/canvas_inc/cairo_spritecanvashelper.hxx
@@ -27,6 +27,7 @@
 
 #include <vcl/cairo.hxx>
 #include "cairo_canvashelper.hxx"
+#include "vcl_canvas/customsprite.hxx"
 
 namespace basegfx
 {
@@ -59,7 +60,7 @@ namespace vcl_cairocanvas
                             css::rendering::XBitmap > >& animationBitmaps,
                 sal_Int8                                              
interpolationMode );
 
-        css::uno::Reference< css::rendering::XCustomSprite >      
createCustomSprite(
+        ::vcl_canvas::CustomSprite* createCustomSprite(
                 const css::geometry::RealSize2D& spriteSize );
 
         css::uno::Reference< css::rendering::XSprite >                
createClonedSprite(
diff --git a/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx 
b/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx
index 0efb3d41bf77..26e29024ffb7 100644
--- a/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvasbitmap.cxx
@@ -39,7 +39,7 @@ namespace vcl_cairocanvas
 {
     CanvasBitmap::CanvasBitmap( const ::basegfx::B2ISize&  rSize,
                                 SurfaceProviderSharedPtr   rSurfaceProvider,
-                                ::vcl_canvas::GraphicDeviceSharedPtr pDevice,
+                                ::vcl_canvas::GraphicDevice* pDevice,
                                 bool                       bHasAlpha ) :
         mpSurfaceProvider(std::move( rSurfaceProvider )),
         maSize(rSize),
diff --git a/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx 
b/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx
index d072fcc45223..517e5db4f9e6 100644
--- a/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvascustomsprite.cxx
@@ -37,7 +37,7 @@ using namespace ::com::sun::star;
 namespace vcl_cairocanvas
 {
     CanvasCustomSprite::CanvasCustomSprite( const css::geometry::RealSize2D&   
rSpriteSize,
-                                            const SpriteCanvasSharedPtr&       
             rRefDevice ) :
+                                            const SpriteCanvasSharedPtr&       
rRefDevice ) :
         mpSpriteCanvas( rRefDevice ),
         maSize( ::vcl_canvas::tools::roundUp( rSpriteSize.Width ),
                 ::vcl_canvas::tools::roundUp( rSpriteSize.Height ) )
@@ -51,7 +51,7 @@ namespace vcl_cairocanvas
 
         maCanvasHelper.init( maSize,
                              *rRefDevice,
-                             rRefDevice );
+                             rRefDevice.get() );
         maCanvasHelper.setSurface( mpBufferSurface, true );
 
         maSpriteHelper.init( rSpriteSize,
@@ -62,7 +62,7 @@ namespace vcl_cairocanvas
         maCanvasHelper.clear();
     }
 
-    void CanvasCustomSprite::disposeThis()
+    /* void CanvasCustomSprite::disposeThis()
     {
         ::osl::MutexGuard aGuard( m_aMutex );
 
@@ -71,7 +71,7 @@ namespace vcl_cairocanvas
 
         // forward to parent
         CanvasCustomSpriteBaseT::disposeThis();
-    }
+    } */
 
     void CanvasCustomSprite::redraw( const CairoSharedPtr& pCairo,
                                      bool                  bBufferedUpdate ) 
const
@@ -132,7 +132,7 @@ namespace vcl_cairocanvas
         return mpSpriteCanvas->getOutputDevice();
     }
 
-    OUString SAL_CALL CanvasCustomSprite::getImplementationName()
+    /* OUString SAL_CALL CanvasCustomSprite::getImplementationName()
     {
         return u"CairoCanvas.CanvasCustomSprite"_ustr;
     }
@@ -145,7 +145,7 @@ namespace vcl_cairocanvas
     uno::Sequence< OUString > SAL_CALL 
CanvasCustomSprite::getSupportedServiceNames()
     {
         return { u"com.sun.star.rendering.CanvasCustomSprite"_ustr };
-    }
+    } */
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/canvas/cairo/cairo_canvashelper.cxx 
b/vcl/source/canvas/cairo/cairo_canvashelper.cxx
index e9a66405e50c..2635ba542096 100644
--- a/vcl/source/canvas/cairo/cairo_canvashelper.cxx
+++ b/vcl/source/canvas/cairo/cairo_canvashelper.cxx
@@ -81,11 +81,11 @@ namespace vcl_cairocanvas
 
     void CanvasHelper::init( const ::basegfx::B2ISize&  rSizePixel,
                              SurfaceProvider&           rSurfaceProvider,
-                             vcl_canvas::GraphicDeviceSharedPtr pDevice )
+                             vcl_canvas::GraphicDevice* pDevice )
     {
         maSize = rSizePixel;
         mpSurfaceProvider = &rSurfaceProvider;
-        mpDevice = pDevice.get();
+        mpDevice = pDevice;
     }
 
     void CanvasHelper::setSize( const ::basegfx::B2ISize& rSize )
diff --git a/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx 
b/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx
index 440c34cd1d05..ff66ff49507a 100644
--- a/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx
+++ b/vcl/source/canvas/cairo/cairo_spritecanvashelper.cxx
@@ -30,6 +30,7 @@
 #include <cairo.h>
 
 #include "cairo_canvascustomsprite.hxx"
+#include "vcl_canvas/customsprite.hxx"
 #include "cairo_spritecanvashelper.hxx"
 
 using namespace ::cairo;
@@ -128,14 +129,13 @@ namespace vcl_cairocanvas
         return uno::Reference< rendering::XAnimatedSprite >();
     }
 
-    uno::Reference< rendering::XCustomSprite > 
SpriteCanvasHelper::createCustomSprite( const geometry::RealSize2D& spriteSize )
+    ::vcl_canvas::CustomSprite* SpriteCanvasHelper::createCustomSprite( const 
geometry::RealSize2D& spriteSize )
     {
         if( !mpRedrawManager )
-            return uno::Reference< rendering::XCustomSprite >(); // we're 
disposed
+            return nullptr; // we're disposed
 
-        return uno::Reference< rendering::XCustomSprite >(
-            new CanvasCustomSprite( spriteSize,
-                                    mpOwningSpriteCanvas ) );
+        return new CanvasCustomSprite( spriteSize,
+                                    mpOwningSpriteCanvas );
     }
 
     uno::Reference< rendering::XSprite > 
SpriteCanvasHelper::createClonedSprite(

Reply via email to