summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--canvas/CppunitTest_canvas_test.mk46
-rw-r--r--canvas/Module_canvas.mk4
-rw-r--r--canvas/qa/cppunit/README11
-rw-r--r--canvas/qa/cppunit/canvastest.cxx109
-rw-r--r--canvas/source/vcl/canvas.cxx27
-rw-r--r--canvas/source/vcl/outdevholder.hxx51
-rw-r--r--canvas/source/vcl/spritecanvas.cxx21
-rw-r--r--include/vcl/outdev.hxx16
-rw-r--r--include/vcl/window.hxx12
-rw-r--r--vcl/inc/window.h8
-rw-r--r--vcl/source/outdev/outdev.cxx80
-rw-r--r--vcl/source/window/window.cxx29
-rw-r--r--vcl/source/window/wrkwin.cxx8
13 files changed, 343 insertions, 79 deletions
diff --git a/canvas/CppunitTest_canvas_test.mk b/canvas/CppunitTest_canvas_test.mk
new file mode 100644
index 000000000000..740e7e11db48
--- /dev/null
+++ b/canvas/CppunitTest_canvas_test.mk
@@ -0,0 +1,46 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#*************************************************************************
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+#*************************************************************************
+
+$(eval $(call gb_CppunitTest_CppunitTest,canvas_test))
+
+$(eval $(call gb_CppunitTest_add_exception_objects,canvas_test, \
+ canvas/qa/cppunit/canvastest \
+))
+
+$(eval $(call gb_CppunitTest_use_external,canvas_test,boost_headers))
+
+$(eval $(call gb_CppunitTest_use_libraries,canvas_test, \
+ basegfx \
+ comphelper \
+ cppu \
+ cppuhelper \
+ sal \
+ test \
+ tl \
+ unotest \
+ vcl \
+))
+
+$(eval $(call gb_CppunitTest_use_sdk_api,canvas_test))
+
+$(eval $(call gb_CppunitTest_use_ure,canvas_test))
+$(eval $(call gb_CppunitTest_use_vcl,canvas_test))
+
+$(eval $(call gb_CppunitTest_use_components,canvas_test,\
+ canvas/source/vcl/vclcanvas \
+ canvas/source/factory/canvasfactory \
+ configmgr/source/configmgr \
+ i18npool/util/i18npool \
+))
+
+$(eval $(call gb_CppunitTest_use_configuration,canvas_test))
+
+# vim: set noet sw=4 ts=4:
diff --git a/canvas/Module_canvas.mk b/canvas/Module_canvas.mk
index f62d7ef46299..0ca3c4c9bfe0 100644
--- a/canvas/Module_canvas.mk
+++ b/canvas/Module_canvas.mk
@@ -49,4 +49,8 @@ $(eval $(call gb_Module_add_targets,canvas,\
))
endif
+$(eval $(call gb_Module_add_check_targets,canvas,\
+ CppunitTest_canvas_test \
+))
+
# vim: set noet sw=4 ts=4:
diff --git a/canvas/qa/cppunit/README b/canvas/qa/cppunit/README
new file mode 100644
index 000000000000..f4fc2f2e0467
--- /dev/null
+++ b/canvas/qa/cppunit/README
@@ -0,0 +1,11 @@
+How to write a canvas test:
+===========================
+
+The easiest (relatively speaking) way is to copy&paste from somewhere. Use existing tests
+as the base, or canvas/workben/canvasdemo.cxx should be a good source too. If that doesn't
+help, then you'll need to find the right UNO interfaces (see canvas/README). Have "fun".
+
+
+Currently only the vclcanvas implementation is tested, because it's the only one
+capable of working with offscreen surfaces. Other implementations would need to
+be fixed, and then added to the gb_CppunitTest_use_components list in the makefile.
diff --git a/canvas/qa/cppunit/canvastest.cxx b/canvas/qa/cppunit/canvastest.cxx
new file mode 100644
index 000000000000..414b85b2f51c
--- /dev/null
+++ b/canvas/qa/cppunit/canvastest.cxx
@@ -0,0 +1,109 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#include <test/bootstrapfixture.hxx>
+
+#include <vcl/virdev.hxx>
+#include <vcl/BitmapReadAccess.hxx>
+#include <vcl/canvastools.hxx>
+#include <vcl/graphicfilter.hxx>
+#include <tools/stream.hxx>
+
+#include <com/sun/star/rendering/XBitmap.hpp>
+#include <com/sun/star/rendering/XCanvas.hpp>
+#include <com/sun/star/rendering/XBitmapCanvas.hpp>
+#include <com/sun/star/rendering/CompositeOperation.hpp>
+
+using namespace ::com::sun::star;
+
+class CanvasTest : public test::BootstrapFixture
+{
+ VclPtr<VirtualDevice> mVclDevice;
+ uno::Reference<rendering::XCanvas> mCanvas;
+ rendering::ViewState mViewState;
+ rendering::RenderState mRenderState;
+ uno::Sequence<double> mColorBlack;
+
+ // if enabled - check the result images with:
+ // "xdg-open ./workdir/CppunitTest/canvas_test.test.core/"
+ static constexpr const bool mbExportBitmap = false;
+
+ void exportDevice(const OUString& filename, const VclPtr<VirtualDevice>& device)
+ {
+ if (mbExportBitmap)
+ {
+ BitmapEx aBitmapEx(device->GetBitmapEx(Point(0, 0), device->GetOutputSizePixel()));
+ SvFileStream aStream(filename, StreamMode::WRITE | StreamMode::TRUNC);
+ GraphicFilter::GetGraphicFilter().compressAsPNG(aBitmapEx, aStream);
+ }
+ }
+
+public:
+ CanvasTest()
+ : BootstrapFixture(true, false)
+ {
+ }
+
+ virtual void setUp() override
+ {
+ BootstrapFixture::setUp();
+ mColorBlack = vcl::unotools::colorToStdColorSpaceSequence(COL_BLACK);
+ // Geometry init
+ geometry::AffineMatrix2D aUnit(1, 0, 0, 0, 1, 0);
+ mViewState.AffineTransform = aUnit;
+ mRenderState.AffineTransform = aUnit;
+ mRenderState.DeviceColor = mColorBlack;
+ mRenderState.CompositeOperation = rendering::CompositeOperation::OVER;
+ }
+
+ virtual void tearDown() override
+ {
+ mVclDevice.clear();
+ mCanvas = uno::Reference<rendering::XCanvas>();
+ BootstrapFixture::tearDown();
+ }
+
+ void setupCanvas(const Size& size, Color backgroundColor = COL_WHITE, bool alpha = false)
+ {
+ mVclDevice
+ = alpha ? VclPtr<VirtualDevice>::Create(DeviceFormat::DEFAULT, DeviceFormat::DEFAULT)
+ : VclPtr<VirtualDevice>::Create(DeviceFormat::DEFAULT);
+ mVclDevice->SetOutputSizePixel(size);
+ mVclDevice->SetBackground(Wallpaper(backgroundColor));
+ mVclDevice->Erase();
+ mCanvas = mVclDevice->GetCanvas();
+ CPPUNIT_ASSERT(mCanvas.is());
+ }
+
+ void testDrawLine()
+ {
+ setupCanvas(Size(10, 10));
+ mCanvas->drawLine(geometry::RealPoint2D(1, 1), geometry::RealPoint2D(9, 1), mViewState,
+ mRenderState);
+ exportDevice("test-draw-line.png", mVclDevice);
+ Bitmap bitmap = mVclDevice->GetBitmap(Point(), Size(10, 10));
+ Bitmap::ScopedReadAccess access(bitmap);
+ // Canvas uses AA, which blurs the line, and it cannot be turned off,
+ // so do not check the end points.
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(COL_WHITE), access->GetPixel(0, 0));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(COL_BLACK), access->GetPixel(1, 2));
+ CPPUNIT_ASSERT_EQUAL(BitmapColor(COL_BLACK), access->GetPixel(1, 8));
+ }
+
+ CPPUNIT_TEST_SUITE(CanvasTest);
+ CPPUNIT_TEST(testDrawLine);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(CanvasTest);
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/canvas/source/vcl/canvas.cxx b/canvas/source/vcl/canvas.cxx
index 467da51f37ed..e9ebf85b3b3a 100644
--- a/canvas/source/vcl/canvas.cxx
+++ b/canvas/source/vcl/canvas.cxx
@@ -19,40 +19,19 @@
#include <sal/config.h>
+#include "canvas.hxx"
+
#include <com/sun/star/lang/NoSupportException.hpp>
#include <sal/log.hxx>
#include <tools/diagnose_ex.h>
#include <vcl/outdev.hxx>
-#include "canvas.hxx"
+#include "outdevholder.hxx"
using namespace ::com::sun::star;
namespace vclcanvas
{
- namespace
- {
- class OutDevHolder : public OutDevProvider
- {
- public:
- OutDevHolder(const OutDevHolder&) = delete;
- const OutDevHolder& operator=(const OutDevHolder&) = delete;
-
- explicit OutDevHolder( OutputDevice& rOutDev ) :
- mrOutDev(rOutDev)
- {}
-
- private:
- virtual OutputDevice& getOutDev() override { return mrOutDev; }
- virtual const OutputDevice& getOutDev() const override { return mrOutDev; }
-
- // TODO(Q2): Lifetime issue. This _only_ works reliably,
- // if disposing the Canvas correctly disposes all
- // entities which hold this pointer.
- OutputDevice& mrOutDev;
- };
- }
-
Canvas::Canvas( const uno::Sequence< uno::Any >& aArguments,
const uno::Reference< uno::XComponentContext >& /*rxContext*/ ) :
maArguments(aArguments)
diff --git a/canvas/source/vcl/outdevholder.hxx b/canvas/source/vcl/outdevholder.hxx
new file mode 100644
index 000000000000..78f3badf8bb6
--- /dev/null
+++ b/canvas/source/vcl/outdevholder.hxx
@@ -0,0 +1,51 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <vcl/outdev.hxx>
+
+#include "outdevprovider.hxx"
+
+namespace vclcanvas
+{
+class OutDevHolder : public OutDevProvider
+{
+public:
+ OutDevHolder(const OutDevHolder&) = delete;
+ const OutDevHolder& operator=(const OutDevHolder&) = delete;
+
+ explicit OutDevHolder(OutputDevice& rOutDev)
+ : mrOutDev(rOutDev)
+ {
+ }
+
+private:
+ virtual OutputDevice& getOutDev() override { return mrOutDev; }
+ virtual const OutputDevice& getOutDev() const override { return mrOutDev; }
+
+ // TODO(Q2): Lifetime issue. This _only_ works reliably,
+ // if disposing the Canvas correctly disposes all
+ // entities which hold this pointer.
+ OutputDevice& mrOutDev;
+};
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/canvas/source/vcl/spritecanvas.cxx b/canvas/source/vcl/spritecanvas.cxx
index 2238a79127f0..60c65fbd7bce 100644
--- a/canvas/source/vcl/spritecanvas.cxx
+++ b/canvas/source/vcl/spritecanvas.cxx
@@ -21,10 +21,12 @@
#include <sal/log.hxx>
#include <com/sun/star/awt/XTopWindow.hpp>
+#include <com/sun/star/lang/NoSupportException.hpp>
#include <cppuhelper/supportsservice.hxx>
#include <tools/diagnose_ex.h>
#include "spritecanvas.hxx"
+#include "outdevholder.hxx"
#include "windowoutdevholder.hxx"
@@ -75,14 +77,27 @@ namespace vclcanvas
maArguments[3].getValueTypeClass() == uno::TypeClass_INTERFACE,
"VCLSpriteCanvas::initialize: wrong number of arguments, or wrong types" );
+ sal_Int64 nPtr = 0;
+ maArguments[0] >>= nPtr;
+
+ OutputDevice* pOutDev = reinterpret_cast<OutputDevice*>(nPtr);
+ if( !pOutDev )
+ throw lang::NoSupportException("Passed OutDev invalid!", nullptr);
+
uno::Reference< awt::XWindow > xParentWindow;
maArguments[3] >>= xParentWindow;
- OutDevProviderSharedPtr pOutDev = std::make_shared<WindowOutDevHolder>(xParentWindow);
+ OutDevProviderSharedPtr pOutDevProvider;
+ if( xParentWindow.is())
+ pOutDevProvider = std::make_shared<WindowOutDevHolder>(xParentWindow);
+ else
+ pOutDevProvider = std::make_shared<OutDevHolder>(*pOutDev);
// setup helper
- maDeviceHelper.init( pOutDev );
- setWindow(uno::Reference<awt::XWindow2>(xParentWindow, uno::UNO_QUERY_THROW));
+ maDeviceHelper.init( pOutDevProvider );
+ setWindow( xParentWindow.is()
+ ? uno::Reference<awt::XWindow2>(xParentWindow, uno::UNO_QUERY_THROW)
+ : uno::Reference<awt::XWindow2>());
maCanvasHelper.init( maDeviceHelper.getBackBuffer(),
*this,
maRedrawManager,
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index fee759107d5f..f395dddf287a 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -45,6 +45,7 @@
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <unotools/fontdefs.hxx>
+#include <cppuhelper/weakref.hxx>
#include <com/sun/star/drawing/LineCap.hpp>
#include <com/sun/star/uno/Reference.h>
@@ -110,6 +111,11 @@ namespace com::sun::star::awt {
class XGraphics;
}
+namespace com::sun::star::rendering {
+ class XCanvas;
+ class XSpriteCanvas;
+}
+
#if defined UNX
#define GLYPH_FONT_HEIGHT 128
#else
@@ -304,6 +310,8 @@ private:
std::unique_ptr<ImplOutDevData> mpOutDevData;
std::vector< VCLXGraphics* >* mpUnoGraphicsList;
vcl::ExtOutDevData* mpExtOutDevData;
+ // The canvas interface for this output device. Is persistent after the first GetCanvas() call
+ mutable css::uno::WeakReference< css::rendering::XCanvas > mxCanvas;
// TEMP TEMP TEMP
VclPtr<VirtualDevice> mpAlphaVDev;
@@ -440,6 +448,11 @@ public:
virtual size_t GetSyncCount() const { return 0xffffffff; }
+ /// request XCanvas render interface
+ css::uno::Reference< css::rendering::XCanvas > GetCanvas() const;
+ /// request XSpriteCanvas render interface
+ css::uno::Reference< css::rendering::XSpriteCanvas > GetSpriteCanvas() const;
+
protected:
/** Acquire a graphics device that the output device uses to draw on.
@@ -557,6 +570,9 @@ protected:
SAL_DLLPRIVATE bool is_double_buffered_window() const;
+ virtual css::uno::Reference< css::rendering::XCanvas > ImplGetCanvas( bool bSpriteCanvas ) const;
+ SAL_DLLPRIVATE void ImplDisposeCanvas();
+
private:
// not implemented; to detect misuses of DrawOutDev(...OutputDevice&);
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index ce93f06598a6..17fbf4d876ed 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -595,6 +595,8 @@ protected:
SAL_DLLPRIVATE void PushPaintHelper(PaintHelper* pHelper, vcl::RenderContext& rRenderContext);
SAL_DLLPRIVATE void PopPaintHelper(PaintHelper const * pHelper);
+ virtual css::uno::Reference< css::rendering::XCanvas > ImplGetCanvas( bool bSpriteCanvas ) const override;
+
private:
SAL_DLLPRIVATE void ImplSetFrameParent( const vcl::Window* pParent );
@@ -706,9 +708,6 @@ private:
virtual void ImplPaintToDevice( ::OutputDevice* pTargetOutDev, const Point& rPos );
- SAL_DLLPRIVATE css::uno::Reference< css::rendering::XCanvas >
- ImplGetCanvas( bool bSpriteCanvas ) const;
-
public:
virtual vcl::Region GetActiveClipRegion() const override;
virtual vcl::Region GetOutputBoundsClipRegion() const override;
@@ -1252,13 +1251,6 @@ private:
*/
Size get_ungrouped_preferred_size() const;
public:
- /// request XCanvas render interface for this window
- css::uno::Reference< css::rendering::XCanvas >
- GetCanvas() const;
- /// request XSpriteCanvas render interface for this window
- css::uno::Reference< css::rendering::XSpriteCanvas >
- GetSpriteCanvas() const;
-
/* records all DrawText operations within the passed rectangle;
* a synchronous paint is sent to achieve this
*/
diff --git a/vcl/inc/window.h b/vcl/inc/window.h
index 2411d2f7c663..b4a53a580a5c 100644
--- a/vcl/inc/window.h
+++ b/vcl/inc/window.h
@@ -29,7 +29,6 @@
#include <vcl/window.hxx>
#include <vcl/settings.hxx>
#include <o3tl/typed_flags_set.hxx>
-#include <cppuhelper/weakref.hxx>
#include <optional>
#include <list>
@@ -61,10 +60,6 @@ namespace com::sun::star {
class XAccessibleEditableText;
}
- namespace rendering {
- class XCanvas;
- }
-
namespace awt {
class XWindowPeer;
class XWindow;
@@ -249,9 +244,6 @@ public:
Link<vcl::Window&, bool> maMnemonicActivateHdl;
Link<tools::JsonWriter&, void> maDumpAsPropertyTreeHdl;
- // The canvas interface for this VCL window. Is persistent after the first GetCanvas() call
- css::uno::WeakReference< css::rendering::XCanvas > mxCanvas;
-
vcl::Cursor* mpCursor;
PointerStyle maPointer;
Fraction maZoom;
diff --git a/vcl/source/outdev/outdev.cxx b/vcl/source/outdev/outdev.cxx
index f2618c285b36..70ec9616ace7 100644
--- a/vcl/source/outdev/outdev.cxx
+++ b/vcl/source/outdev/outdev.cxx
@@ -29,12 +29,17 @@
#include <vcl/toolkit/unowrap.hxx>
#include <vcl/svapp.hxx>
#include <vcl/sysdata.hxx>
+#include <vcl/lazydelete.hxx>
+#include <comphelper/processfactory.hxx>
#include <salgdi.hxx>
#include <window.h>
#include <outdev.h>
#include <com/sun/star/awt/DeviceCapability.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/rendering/CanvasFactory.hpp>
+#include <com/sun/star/rendering/XSpriteCanvas.hpp>
#ifdef DISABLE_DYNLOADING
// Linking all needed LO code into one .so/executable, these already
@@ -46,6 +51,8 @@ namespace {
}
#endif
+using namespace ::com::sun::star::uno;
+
// Begin initializer and accessor public functions
OutputDevice::OutputDevice(OutDevType eOutDevType) :
@@ -738,4 +745,77 @@ css::awt::DeviceInfo OutputDevice::GetDeviceInfo() const
return aInfo;
}
+Reference< css::rendering::XCanvas > OutputDevice::GetCanvas() const
+{
+ // try to retrieve hard reference from weak member
+ Reference< css::rendering::XCanvas > xCanvas( mxCanvas );
+ // canvas still valid? Then we're done.
+ if( xCanvas.is() )
+ return xCanvas;
+ xCanvas = ImplGetCanvas( false );
+ mxCanvas = xCanvas;
+ return xCanvas;
+}
+
+Reference< css::rendering::XSpriteCanvas > OutputDevice::GetSpriteCanvas() const
+{
+ Reference< css::rendering::XCanvas > xCanvas( mxCanvas );
+ Reference< css::rendering::XSpriteCanvas > xSpriteCanvas( xCanvas, UNO_QUERY );
+ if( xSpriteCanvas.is() )
+ return xSpriteCanvas;
+ xCanvas = ImplGetCanvas( true );
+ mxCanvas = xCanvas;
+ return Reference< css::rendering::XSpriteCanvas >( xCanvas, UNO_QUERY );
+}
+
+// Generic implementation, Window will override.
+com::sun::star::uno::Reference< css::rendering::XCanvas > OutputDevice::ImplGetCanvas( bool bSpriteCanvas ) const
+{
+ /* Arguments:
+ 0: ptr to creating instance (Window or VirtualDevice)
+ 1: current bounds of creating instance
+ 2: bool, denoting always on top state for Window (always false for VirtualDevice)
+ 3: XWindow for creating Window (or empty for VirtualDevice)
+ 4: SystemGraphicsData as a streamed Any
+ */
+ Sequence< Any > aArg(5);
+ aArg[ 0 ] <<= reinterpret_cast<sal_Int64>(this);
+ aArg[ 1 ] <<= css::awt::Rectangle( mnOutOffX, mnOutOffY, mnOutWidth, mnOutHeight );
+ aArg[ 2 ] <<= false;
+ aArg[ 3 ] <<= Reference< css::awt::XWindow >();
+ aArg[ 4 ] = GetSystemGfxDataAny();
+
+ Reference< XComponentContext > xContext = comphelper::getProcessComponentContext();
+
+ static vcl::DeleteUnoReferenceOnDeinit<css::lang::XMultiComponentFactory> xStaticCanvasFactory(
+ css::rendering::CanvasFactory::create( xContext ) );
+ Reference<css::lang::XMultiComponentFactory> xCanvasFactory(xStaticCanvasFactory.get());
+ Reference< css::rendering::XCanvas > xCanvas;
+
+ if(xCanvasFactory.is())
+ {
+ xCanvas.set( xCanvasFactory->createInstanceWithArgumentsAndContext(
+ bSpriteCanvas ?
+ OUString( "com.sun.star.rendering.SpriteCanvas" ) :
+ OUString( "com.sun.star.rendering.Canvas" ),
+ aArg,
+ xContext ),
+ UNO_QUERY );
+ }
+
+ // no factory??? Empty reference, then.
+ return xCanvas;
+}
+
+void OutputDevice::ImplDisposeCanvas()
+{
+ css::uno::Reference< css::rendering::XCanvas > xCanvas( mxCanvas );
+ if( xCanvas.is() )
+ {
+ css::uno::Reference< css::lang::XComponent > xCanvasComponent( xCanvas, css::uno::UNO_QUERY );
+ if( xCanvasComponent.is() )
+ xCanvasComponent->dispose();
+ }
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 94c8cc2df391..44f5438e3864 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -154,13 +154,7 @@ void Window::dispose()
// Dispose of the canvas implementation (which, currently, has an
// own wrapper window as a child to this one.
- Reference< css::rendering::XCanvas > xCanvas( mpWindowImpl->mxCanvas );
- if( xCanvas.is() )
- {
- Reference < XComponent > xCanvasComponent( xCanvas, UNO_QUERY );
- if( xCanvasComponent.is() )
- xCanvasComponent->dispose();
- }
+ ImplDisposeCanvas();
mpWindowImpl->mbInDispose = true;
@@ -3680,13 +3674,6 @@ bool Window::IsNativeWidgetEnabled() const
Reference< css::rendering::XCanvas > Window::ImplGetCanvas( bool bSpriteCanvas ) const
{
- // try to retrieve hard reference from weak member
- Reference< css::rendering::XCanvas > xCanvas( mpWindowImpl->mxCanvas );
-
- // canvas still valid? Then we're done.
- if( xCanvas.is() )
- return xCanvas;
-
Sequence< Any > aArg(5);
// Feed any with operating system's window handle
@@ -3707,6 +3694,7 @@ Reference< css::rendering::XCanvas > Window::ImplGetCanvas( bool bSpriteCanvas )
static vcl::DeleteUnoReferenceOnDeinit<XMultiComponentFactory> xStaticCanvasFactory(
css::rendering::CanvasFactory::create( xContext ) );
Reference<XMultiComponentFactory> xCanvasFactory(xStaticCanvasFactory.get());
+ Reference< css::rendering::XCanvas > xCanvas;
if(xCanvasFactory.is())
{
@@ -3740,25 +3728,12 @@ Reference< css::rendering::XCanvas > Window::ImplGetCanvas( bool bSpriteCanvas )
UNO_QUERY );
}
- mpWindowImpl->mxCanvas = xCanvas;
}
// no factory??? Empty reference, then.
return xCanvas;
}
-Reference< css::rendering::XCanvas > Window::GetCanvas() const
-{
- return ImplGetCanvas( false );
-}
-
-Reference< css::rendering::XSpriteCanvas > Window::GetSpriteCanvas() const
-{
- Reference< css::rendering::XSpriteCanvas > xSpriteCanvas(
- ImplGetCanvas( true ), UNO_QUERY );
- return xSpriteCanvas;
-}
-
OUString Window::GetSurroundingText() const
{
return OUString();
diff --git a/vcl/source/window/wrkwin.cxx b/vcl/source/window/wrkwin.cxx
index 9f90025a74aa..beaa1d48dbd8 100644
--- a/vcl/source/window/wrkwin.cxx
+++ b/vcl/source/window/wrkwin.cxx
@@ -145,13 +145,7 @@ void WorkWindow::ShowFullScreenMode( bool bFullScreenMode, sal_Int32 nDisplayScr
// Dispose of the canvas implementation, which might rely on
// screen-specific system data.
- css::uno::Reference< css::rendering::XCanvas > xCanvas( mpWindowImpl->mxCanvas );
- if( xCanvas.is() )
- {
- css::uno::Reference< css::lang::XComponent > xCanvasComponent( xCanvas, css::uno::UNO_QUERY );
- if( xCanvasComponent.is() )
- xCanvasComponent->dispose();
- }
+ ImplDisposeCanvas();
mpWindowImpl->mpFrameWindow->mpWindowImpl->mbWaitSystemResize = true;
ImplGetFrame()->ShowFullScreen( bFullScreenMode, nDisplayScreen );