Branch libreoffice-5-0-4
[LibreOffice.git] / canvas / source / cairo / cairo_spritecanvas.hxx
blobae419c700a69d559aebe747f5168a7bccd8bd615
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_CANVAS_SOURCE_CAIRO_CAIRO_SPRITECANVAS_HXX
21 #define INCLUDED_CANVAS_SOURCE_CAIRO_CAIRO_SPRITECANVAS_HXX
23 #include <com/sun/star/uno/XComponentContext.hpp>
24 #include <com/sun/star/beans/XPropertySet.hpp>
25 #include <com/sun/star/lang/XInitialization.hpp>
26 #include <com/sun/star/lang/XServiceInfo.hpp>
27 #include <com/sun/star/lang/XServiceName.hpp>
28 #include <com/sun/star/awt/XWindowListener.hpp>
29 #include <com/sun/star/util/XUpdatable.hpp>
30 #include <com/sun/star/rendering/XSpriteCanvas.hpp>
31 #include <com/sun/star/rendering/XIntegerBitmap.hpp>
32 #include <com/sun/star/rendering/XGraphicDevice.hpp>
33 #include <com/sun/star/rendering/XBufferController.hpp>
35 #include <cppuhelper/compbase9.hxx>
36 #include <comphelper/uno3.hxx>
38 #include <canvas/base/spritecanvasbase.hxx>
39 #include <canvas/base/disambiguationhelper.hxx>
40 #include <canvas/base/bufferedgraphicdevicebase.hxx>
42 #include <basegfx/vector/b2isize.hxx>
44 #include "cairo_spritedevicehelper.hxx"
45 #include "cairo_repainttarget.hxx"
46 #include "cairo_surfaceprovider.hxx"
47 #include "cairo_spritecanvashelper.hxx"
49 #define SPRITECANVAS_SERVICE_NAME "com.sun.star.rendering.SpriteCanvas.Cairo"
50 #define SPRITECANVAS_IMPLEMENTATION_NAME "com.sun.star.comp.rendering.SpriteCanvas.Cairo"
52 namespace cairocanvas
54 typedef ::cppu::WeakComponentImplHelper9< ::com::sun::star::rendering::XSpriteCanvas,
55 ::com::sun::star::rendering::XIntegerBitmap,
56 ::com::sun::star::rendering::XGraphicDevice,
57 ::com::sun::star::lang::XMultiServiceFactory,
58 ::com::sun::star::rendering::XBufferController,
59 ::com::sun::star::awt::XWindowListener,
60 ::com::sun::star::util::XUpdatable,
61 ::com::sun::star::beans::XPropertySet,
62 ::com::sun::star::lang::XServiceName > WindowGraphicDeviceBase_Base;
63 typedef ::canvas::BufferedGraphicDeviceBase< ::canvas::DisambiguationHelper< WindowGraphicDeviceBase_Base >,
64 SpriteDeviceHelper,
65 ::osl::MutexGuard,
66 ::cppu::OWeakObject > SpriteCanvasBase_Base;
67 /** Mixin SpriteSurface
69 Have to mixin the SpriteSurface before deriving from
70 ::canvas::SpriteCanvasBase, as this template should already
71 implement some of those interface methods.
73 The reason why this appears kinda convoluted is the fact that
74 we cannot specify non-IDL types as WeakComponentImplHelperN
75 template args, and furthermore, don't want to derive
76 ::canvas::SpriteCanvasBase directly from
77 ::canvas::SpriteSurface (because derivees of
78 ::canvas::SpriteCanvasBase have to explicitly forward the
79 XInterface methods (e.g. via DECLARE_UNO3_AGG_DEFAULTS)
80 anyway). Basically, ::canvas::CanvasCustomSpriteBase should
81 remain a base class that provides implementation, not to
82 enforce any specific interface on its derivees.
84 class SpriteCanvasBaseSpriteSurface_Base : public SpriteCanvasBase_Base,
85 public ::canvas::SpriteSurface,
86 public SurfaceProvider
90 typedef ::canvas::SpriteCanvasBase< SpriteCanvasBaseSpriteSurface_Base,
91 SpriteCanvasHelper,
92 ::osl::MutexGuard,
93 ::cppu::OWeakObject > SpriteCanvasBaseT;
95 /** Product of this component's factory.
97 The SpriteCanvas object combines the actual Window canvas with
98 the XGraphicDevice interface. This is because there's a
99 one-to-one relation between them, anyway, since each window
100 can have exactly one canvas and one associated
101 XGraphicDevice. And to avoid messing around with circular
102 references, this is implemented as one single object.
104 class SpriteCanvas : public SpriteCanvasBaseT,
105 public RepaintTarget
107 public:
108 SpriteCanvas( const ::com::sun::star::uno::Sequence<
109 ::com::sun::star::uno::Any >& aArguments,
110 const ::com::sun::star::uno::Reference<
111 ::com::sun::star::uno::XComponentContext >& rxContext );
113 void initialize();
115 /// Dispose all internal references
116 virtual void disposeThis() SAL_OVERRIDE;
118 // Forwarding the XComponent implementation to the
119 // cppu::ImplHelper templated base
120 // Classname Base doing refcounting Base implementing the XComponent interface
121 // | | |
122 // V V V
123 DECLARE_UNO3_XCOMPONENT_AGG_DEFAULTS( SpriteCanvas, WindowGraphicDeviceBase_Base, ::cppu::WeakComponentImplHelperBase )
125 // XBufferController (partial)
126 virtual sal_Bool SAL_CALL showBuffer( sal_Bool bUpdateAll ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
127 virtual sal_Bool SAL_CALL switchBuffer( sal_Bool bUpdateAll ) throw (::com::sun::star::uno::RuntimeException) SAL_OVERRIDE;
129 // XSpriteCanvas (partial)
130 virtual sal_Bool SAL_CALL updateScreen( sal_Bool bUpdateAll ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
132 // XServiceName
133 virtual OUString SAL_CALL getServiceName( ) throw (::com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
135 // SurfaceProvider
136 virtual ::cairo::SurfaceSharedPtr getSurface() SAL_OVERRIDE;
137 virtual ::cairo::SurfaceSharedPtr createSurface( const ::basegfx::B2ISize& rSize, int aContent = CAIRO_CONTENT_COLOR_ALPHA ) SAL_OVERRIDE;
138 virtual ::cairo::SurfaceSharedPtr createSurface( ::Bitmap& rBitmap ) SAL_OVERRIDE;
139 virtual ::cairo::SurfaceSharedPtr changeSurface( bool bHasAlpha, bool bCopyContent ) SAL_OVERRIDE;
140 virtual OutputDevice* getOutputDevice() SAL_OVERRIDE;
142 // RepaintTarget
143 virtual bool repaint( const ::cairo::SurfaceSharedPtr& pSurface,
144 const ::com::sun::star::rendering::ViewState& viewState,
145 const ::com::sun::star::rendering::RenderState& renderState ) SAL_OVERRIDE;
147 ::cairo::SurfaceSharedPtr getWindowSurface();
148 ::cairo::SurfaceSharedPtr getBufferSurface();
150 const ::basegfx::B2ISize& getSizePixel();
151 void setSizePixel( const ::basegfx::B2ISize& rSize );
152 void flush();
154 private:
155 ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > maArguments;
156 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mxComponentContext;
159 typedef ::rtl::Reference< SpriteCanvas > SpriteCanvasRef;
162 #endif
164 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */