xref: /trunk/main/canvas/inc/canvas/base/canvasbase.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef INCLUDED_CANVAS_CANVASBASE_HXX
25 #define INCLUDED_CANVAS_CANVASBASE_HXX
26 
27 #include <com/sun/star/uno/Reference.hxx>
28 #include <com/sun/star/rendering/XCanvas.hpp>
29 #include <com/sun/star/rendering/TextDirection.hpp>
30 #include <osl/mutex.hxx>
31 #include <canvas/verifyinput.hxx>
32 
33 
34 namespace canvas
35 {
36     /** Helper template to handle XCanvas method forwarding to CanvasHelper
37 
38         Use this helper to handle the XCanvas part of your
39         implementation. In theory, we could have provided CanvasHelper
40         and CanvasBase as a single template, but that would duplicate
41         a lot of code now residing in CanvasHelper only.
42 
43         This template basically interposes itself between the full
44         interface you implement (i.e. not restricted to XCanvas. The
45         problem with UNO partial interface implementation actually is,
46         that you cannot do it the plain way, since deriving from a
47         common base subclass always introduces the whole set of pure
48         virtuals, that your baseclass helper just overrided) and your
49         implementation class. You then only have to implement the
50         functionality <em>besides</em> XCanvas.
51 
52         <pre>
53         Example:
54         typedef ::cppu::WeakComponentImplHelper4< ::com::sun::star::rendering::XSpriteCanvas,
55                                                   ::com::sun::star::lang::XInitialization,
56                                                   ::com::sun::star::lang::XServiceInfo,
57                                                   ::com::sun::star::lang::XServiceName > CanvasBase_Base;
58         typedef ::canvas::internal::CanvasBase< CanvasBase_Base, CanvasHelper > ExampleCanvas_Base;
59 
60         class ExampleCanvas : public ExampleCanvas_Base,
61                               public SpriteSurface,
62                               public RepaintTarget
63         {
64         };
65         </pre>
66 
67         @tpl Base
68         Base class to use, most probably one of the
69         WeakComponentImplHelperN templates with the appropriate
70         interfaces. At least XCanvas should be among them (why else
71         would you use this template, then?). Base class must have an
72         Base( const Mutex& ) constructor (like the
73         WeakComponentImplHelperN templates have). As the very least,
74         the base class must be derived from uno::XInterface, as some
75         error reporting mechanisms rely on that.
76 
77         @tpl CanvasHelper
78         Canvas helper implementation for the backend in question. This
79         object will be held as a member of this template class, and
80         basically gets forwarded all XCanvas API calls. Furthermore,
81         every time the canvas API semantically changes the content of
82         the canvas, CanvasHelper::modifying() will get called
83         (<em>before</em> the actual modification takes place).
84 
85         @tpl Mutex
86         Lock strategy to use. Defaults to using the
87         OBaseMutex-provided lock.  Every time one of the methods is
88         entered, an object of type Mutex is created with m_aMutex as
89         the sole parameter, and destroyed again when the method scope
90         is left.
91 
92         @tpl UnambiguousBase
93         Optional unambiguous base class for XInterface of Base. It's
94         sometimes necessary to specify this parameter, e.g. if Base
95         derives from multiple UNO interface (were each provides its
96         own version of XInterface, making the conversion ambiguous)
97      */
98     template< class Base,
99               class CanvasHelper,
100               class Mutex=::osl::MutexGuard,
101               class UnambiguousBase=::com::sun::star::uno::XInterface > class CanvasBase :
102             public Base
103     {
104     public:
105         typedef Base            BaseType;
106         typedef CanvasHelper    HelperType;
107         typedef Mutex           MutexType;
108         typedef UnambiguousBase UnambiguousBaseType;
109 
110         /** Create CanvasBase
111          */
CanvasBase()112         CanvasBase() :
113             maCanvasHelper(),
114             mbSurfaceDirty( true )
115         {
116         }
117 
118 #if defined __SUNPRO_CC
119         using Base::disposing;
120 #endif
disposing()121         virtual void SAL_CALL disposing()
122         {
123             MutexType aGuard( BaseType::m_aMutex );
124 
125             maCanvasHelper.disposing();
126 
127             // pass on to base class
128             BaseType::disposing();
129         }
130 
131         // XCanvas
clear()132         virtual void SAL_CALL clear()
133         {
134             MutexType aGuard( BaseType::m_aMutex );
135 
136             mbSurfaceDirty = true;
137             maCanvasHelper.modifying();
138 
139             maCanvasHelper.clear();
140         }
141 
drawPoint(const::com::sun::star::geometry::RealPoint2D & aPoint,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)142         virtual void SAL_CALL drawPoint( const ::com::sun::star::geometry::RealPoint2D&     aPoint,
143                                          const ::com::sun::star::rendering::ViewState&      viewState,
144                                          const ::com::sun::star::rendering::RenderState&    renderState )
145         {
146             tools::verifyArgs(aPoint, viewState, renderState,
147                               BOOST_CURRENT_FUNCTION,
148                               static_cast< UnambiguousBaseType* >(this));
149 
150             MutexType aGuard( BaseType::m_aMutex );
151 
152             mbSurfaceDirty = true;
153             maCanvasHelper.modifying();
154 
155             maCanvasHelper.drawPoint( this, aPoint, viewState, renderState );
156         }
157 
drawLine(const::com::sun::star::geometry::RealPoint2D & aStartPoint,const::com::sun::star::geometry::RealPoint2D & aEndPoint,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)158         virtual void SAL_CALL drawLine( const ::com::sun::star::geometry::RealPoint2D&  aStartPoint,
159                                         const ::com::sun::star::geometry::RealPoint2D&  aEndPoint,
160                                         const ::com::sun::star::rendering::ViewState&   viewState,
161                                         const ::com::sun::star::rendering::RenderState& renderState )
162         {
163             tools::verifyArgs(aStartPoint, aEndPoint, viewState, renderState,
164                               BOOST_CURRENT_FUNCTION,
165                               static_cast< UnambiguousBaseType* >(this));
166 
167             MutexType aGuard( BaseType::m_aMutex );
168 
169             mbSurfaceDirty = true;
170             maCanvasHelper.modifying();
171 
172             maCanvasHelper.drawLine( this, aStartPoint, aEndPoint, viewState, renderState );
173         }
174 
drawBezier(const::com::sun::star::geometry::RealBezierSegment2D & aBezierSegment,const::com::sun::star::geometry::RealPoint2D & aEndPoint,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)175         virtual void SAL_CALL drawBezier( const ::com::sun::star::geometry::RealBezierSegment2D&    aBezierSegment,
176                                           const ::com::sun::star::geometry::RealPoint2D&            aEndPoint,
177                                           const ::com::sun::star::rendering::ViewState&             viewState,
178                                           const ::com::sun::star::rendering::RenderState&           renderState )
179         {
180             tools::verifyArgs(aBezierSegment, aEndPoint, viewState, renderState,
181                               BOOST_CURRENT_FUNCTION,
182                               static_cast< UnambiguousBaseType* >(this));
183 
184             MutexType aGuard( BaseType::m_aMutex );
185 
186             mbSurfaceDirty = true;
187             maCanvasHelper.modifying();
188 
189             maCanvasHelper.drawBezier( this, aBezierSegment, aEndPoint, viewState, renderState );
190         }
191 
192         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
drawPolyPolygon(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)193             drawPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
194                              const ::com::sun::star::rendering::ViewState&                                          viewState,
195                              const ::com::sun::star::rendering::RenderState&                                        renderState )
196         {
197             tools::verifyArgs(xPolyPolygon, viewState, renderState,
198                               BOOST_CURRENT_FUNCTION,
199                               static_cast< UnambiguousBaseType* >(this));
200 
201             MutexType aGuard( BaseType::m_aMutex );
202 
203             mbSurfaceDirty = true;
204             maCanvasHelper.modifying();
205 
206             return maCanvasHelper.drawPolyPolygon( this, xPolyPolygon, viewState, renderState );
207         }
208 
209         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
strokePolyPolygon(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState,const::com::sun::star::rendering::StrokeAttributes & strokeAttributes)210             strokePolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >&   xPolyPolygon,
211                                const ::com::sun::star::rendering::ViewState&                                            viewState,
212                                const ::com::sun::star::rendering::RenderState&                                          renderState,
213                                const ::com::sun::star::rendering::StrokeAttributes&                                     strokeAttributes )
214         {
215             tools::verifyArgs(xPolyPolygon, viewState, renderState, strokeAttributes,
216                               BOOST_CURRENT_FUNCTION,
217                               static_cast< UnambiguousBaseType* >(this));
218 
219             MutexType aGuard( BaseType::m_aMutex );
220 
221             mbSurfaceDirty = true;
222             maCanvasHelper.modifying();
223 
224             return maCanvasHelper.strokePolyPolygon( this, xPolyPolygon, viewState, renderState, strokeAttributes );
225         }
226 
227         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
strokeTexturedPolyPolygon(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState,const::com::sun::star::uno::Sequence<::com::sun::star::rendering::Texture> & textures,const::com::sun::star::rendering::StrokeAttributes & strokeAttributes)228             strokeTexturedPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >&   xPolyPolygon,
229                                        const ::com::sun::star::rendering::ViewState&                                            viewState,
230                                        const ::com::sun::star::rendering::RenderState&                                          renderState,
231                                        const ::com::sun::star::uno::Sequence< ::com::sun::star::rendering::Texture >&           textures,
232                                        const ::com::sun::star::rendering::StrokeAttributes&                                     strokeAttributes )
233         {
234             tools::verifyArgs(xPolyPolygon, viewState, renderState, strokeAttributes,
235                               BOOST_CURRENT_FUNCTION,
236                               static_cast< UnambiguousBaseType* >(this));
237 
238             MutexType aGuard( BaseType::m_aMutex );
239 
240             mbSurfaceDirty = true;
241             maCanvasHelper.modifying();
242 
243             return maCanvasHelper.strokeTexturedPolyPolygon( this, xPolyPolygon, viewState, renderState, textures, strokeAttributes );
244         }
245 
246         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
strokeTextureMappedPolyPolygon(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState,const::com::sun::star::uno::Sequence<::com::sun::star::rendering::Texture> & textures,const::com::sun::star::uno::Reference<::com::sun::star::geometry::XMapping2D> & xMapping,const::com::sun::star::rendering::StrokeAttributes & strokeAttributes)247             strokeTextureMappedPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >&  xPolyPolygon,
248                                             const ::com::sun::star::rendering::ViewState&                                           viewState,
249                                             const ::com::sun::star::rendering::RenderState&                                         renderState,
250                                             const ::com::sun::star::uno::Sequence< ::com::sun::star::rendering::Texture >&          textures,
251                                             const ::com::sun::star::uno::Reference< ::com::sun::star::geometry::XMapping2D >&       xMapping,
252                                             const ::com::sun::star::rendering::StrokeAttributes&                                    strokeAttributes )
253         {
254             tools::verifyArgs(xPolyPolygon, viewState, renderState, textures, xMapping, strokeAttributes,
255                               BOOST_CURRENT_FUNCTION,
256                               static_cast< UnambiguousBaseType* >(this));
257 
258             MutexType aGuard( BaseType::m_aMutex );
259 
260             mbSurfaceDirty = true;
261             maCanvasHelper.modifying();
262 
263             return maCanvasHelper.strokeTextureMappedPolyPolygon( this, xPolyPolygon, viewState, renderState, textures, xMapping, strokeAttributes );
264         }
265 
266         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >   SAL_CALL
queryStrokeShapes(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState,const::com::sun::star::rendering::StrokeAttributes & strokeAttributes)267             queryStrokeShapes( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >&   xPolyPolygon,
268                                const ::com::sun::star::rendering::ViewState&                                            viewState,
269                                const ::com::sun::star::rendering::RenderState&                                          renderState,
270                                const ::com::sun::star::rendering::StrokeAttributes&                                     strokeAttributes )
271         {
272             tools::verifyArgs(xPolyPolygon, viewState, renderState, strokeAttributes,
273                               BOOST_CURRENT_FUNCTION,
274                               static_cast< UnambiguousBaseType* >(this));
275 
276             MutexType aGuard( BaseType::m_aMutex );
277 
278             mbSurfaceDirty = true;
279             maCanvasHelper.modifying();
280 
281             return maCanvasHelper.queryStrokeShapes( this, xPolyPolygon, viewState, renderState, strokeAttributes );
282         }
283 
284         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
fillPolyPolygon(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)285             fillPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
286                              const ::com::sun::star::rendering::ViewState&                                          viewState,
287                              const ::com::sun::star::rendering::RenderState&                                        renderState )
288         {
289             tools::verifyArgs(xPolyPolygon, viewState, renderState,
290                               BOOST_CURRENT_FUNCTION,
291                               static_cast< UnambiguousBaseType* >(this));
292 
293             MutexType aGuard( BaseType::m_aMutex );
294 
295             mbSurfaceDirty = true;
296             maCanvasHelper.modifying();
297 
298             return maCanvasHelper.fillPolyPolygon( this, xPolyPolygon, viewState, renderState );
299         }
300 
301         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
fillTexturedPolyPolygon(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState,const::com::sun::star::uno::Sequence<::com::sun::star::rendering::Texture> & textures)302             fillTexturedPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
303                                      const ::com::sun::star::rendering::ViewState&                                          viewState,
304                                      const ::com::sun::star::rendering::RenderState&                                        renderState,
305                                      const ::com::sun::star::uno::Sequence< ::com::sun::star::rendering::Texture >&         textures )
306         {
307             tools::verifyArgs(xPolyPolygon, viewState, renderState, textures,
308                               BOOST_CURRENT_FUNCTION,
309                               static_cast< UnambiguousBaseType* >(this));
310 
311             MutexType aGuard( BaseType::m_aMutex );
312 
313             mbSurfaceDirty = true;
314             maCanvasHelper.modifying();
315 
316             return maCanvasHelper.fillTexturedPolyPolygon( this, xPolyPolygon, viewState, renderState, textures );
317         }
318 
319         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
fillTextureMappedPolyPolygon(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XPolyPolygon2D> & xPolyPolygon,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState,const::com::sun::star::uno::Sequence<::com::sun::star::rendering::Texture> & textures,const::com::sun::star::uno::Reference<::com::sun::star::geometry::XMapping2D> & xMapping)320             fillTextureMappedPolyPolygon( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >&    xPolyPolygon,
321                                           const ::com::sun::star::rendering::ViewState&                                             viewState,
322                                           const ::com::sun::star::rendering::RenderState&                                           renderState,
323                                           const ::com::sun::star::uno::Sequence< ::com::sun::star::rendering::Texture >&            textures,
324                                           const ::com::sun::star::uno::Reference< ::com::sun::star::geometry::XMapping2D >&         xMapping )
325         {
326             tools::verifyArgs(xPolyPolygon, viewState, renderState, textures, xMapping,
327                               BOOST_CURRENT_FUNCTION,
328                               static_cast< UnambiguousBaseType* >(this));
329 
330             MutexType aGuard( BaseType::m_aMutex );
331 
332             mbSurfaceDirty = true;
333             maCanvasHelper.modifying();
334 
335             return maCanvasHelper.fillTextureMappedPolyPolygon( this, xPolyPolygon, viewState, renderState, textures, xMapping );
336         }
337 
338 
339         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvasFont > SAL_CALL
createFont(const::com::sun::star::rendering::FontRequest & fontRequest,const::com::sun::star::uno::Sequence<::com::sun::star::beans::PropertyValue> & extraFontProperties,const::com::sun::star::geometry::Matrix2D & fontMatrix)340             createFont( const ::com::sun::star::rendering::FontRequest&                                     fontRequest,
341                         const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >&    extraFontProperties,
342                         const ::com::sun::star::geometry::Matrix2D&                                         fontMatrix )
343         {
344             tools::verifyArgs(fontRequest,
345                               // dummy, to keep argPos in sync
346                               fontRequest,
347                               fontMatrix,
348                               BOOST_CURRENT_FUNCTION,
349                               static_cast< UnambiguousBaseType* >(this));
350 
351             MutexType aGuard( BaseType::m_aMutex );
352 
353             return maCanvasHelper.createFont( this, fontRequest, extraFontProperties, fontMatrix );
354         }
355 
356 
357         virtual ::com::sun::star::uno::Sequence< ::com::sun::star::rendering::FontInfo > SAL_CALL
queryAvailableFonts(const::com::sun::star::rendering::FontInfo & aFilter,const::com::sun::star::uno::Sequence<::com::sun::star::beans::PropertyValue> & aFontProperties)358             queryAvailableFonts( const ::com::sun::star::rendering::FontInfo&                                       aFilter,
359                                  const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >&   aFontProperties )
360         {
361             tools::verifyArgs(aFilter,
362                               BOOST_CURRENT_FUNCTION,
363                               static_cast< UnambiguousBaseType* >(this));
364 
365             MutexType aGuard( BaseType::m_aMutex );
366 
367             return maCanvasHelper.queryAvailableFonts( this, aFilter, aFontProperties );
368         }
369 
370 
371         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
drawText(const::com::sun::star::rendering::StringContext & text,const::com::sun::star::uno::Reference<::com::sun::star::rendering::XCanvasFont> & xFont,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState,sal_Int8 textDirection)372             drawText( const ::com::sun::star::rendering::StringContext&                                     text,
373                       const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvasFont >&   xFont,
374                       const ::com::sun::star::rendering::ViewState&                                         viewState,
375                       const ::com::sun::star::rendering::RenderState&                                       renderState,
376                       sal_Int8                                                                              textDirection )
377         {
378             tools::verifyArgs(xFont, viewState, renderState,
379                               BOOST_CURRENT_FUNCTION,
380                               static_cast< UnambiguousBaseType* >(this));
381             tools::verifyRange( textDirection,
382                                 ::com::sun::star::rendering::TextDirection::WEAK_LEFT_TO_RIGHT,
383                                 ::com::sun::star::rendering::TextDirection::STRONG_RIGHT_TO_LEFT );
384 
385             MutexType aGuard( BaseType::m_aMutex );
386 
387             mbSurfaceDirty = true;
388             maCanvasHelper.modifying();
389 
390             return maCanvasHelper.drawText( this, text, xFont, viewState, renderState, textDirection );
391         }
392 
393 
394         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
drawTextLayout(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XTextLayout> & layoutetText,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)395             drawTextLayout( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XTextLayout >& layoutetText,
396                             const ::com::sun::star::rendering::ViewState&                                       viewState,
397                             const ::com::sun::star::rendering::RenderState&                                     renderState )
398         {
399             tools::verifyArgs(layoutetText, viewState, renderState,
400                               BOOST_CURRENT_FUNCTION,
401                               static_cast< UnambiguousBaseType* >(this));
402 
403             MutexType aGuard( BaseType::m_aMutex );
404 
405             mbSurfaceDirty = true;
406             maCanvasHelper.modifying();
407 
408             return maCanvasHelper.drawTextLayout( this, layoutetText, viewState, renderState );
409         }
410 
411 
412         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
drawBitmap(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XBitmap> & xBitmap,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)413             drawBitmap( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmap >& xBitmap,
414                         const ::com::sun::star::rendering::ViewState&                                   viewState,
415                         const ::com::sun::star::rendering::RenderState&                                 renderState )
416         {
417             tools::verifyArgs(xBitmap, viewState, renderState,
418                               BOOST_CURRENT_FUNCTION,
419                               static_cast< UnambiguousBaseType* >(this));
420 
421             MutexType aGuard( BaseType::m_aMutex );
422 
423             mbSurfaceDirty = true;
424             maCanvasHelper.modifying();
425 
426             return maCanvasHelper.drawBitmap( this, xBitmap, viewState, renderState );
427         }
428 
429         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive > SAL_CALL
drawBitmapModulated(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XBitmap> & xBitmap,const::com::sun::star::rendering::ViewState & viewState,const::com::sun::star::rendering::RenderState & renderState)430             drawBitmapModulated( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmap >&    xBitmap,
431                                  const ::com::sun::star::rendering::ViewState&                                      viewState,
432                                  const ::com::sun::star::rendering::RenderState&                                    renderState )
433         {
434             tools::verifyArgs(xBitmap, viewState, renderState,
435                               BOOST_CURRENT_FUNCTION,
436                               static_cast< UnambiguousBaseType* >(this));
437 
438             MutexType aGuard( BaseType::m_aMutex );
439 
440             mbSurfaceDirty = true;
441             maCanvasHelper.modifying();
442 
443             return maCanvasHelper.drawBitmapModulated( this, xBitmap, viewState, renderState );
444         }
445 
446         virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >   SAL_CALL
getDevice()447             getDevice()
448         {
449             MutexType aGuard( BaseType::m_aMutex );
450 
451             return maCanvasHelper.getDevice();
452         }
453 
454     protected:
~CanvasBase()455         ~CanvasBase() {} // we're a ref-counted UNO class. _We_ destroy ourselves.
456 
457         HelperType          maCanvasHelper;
458         mutable bool        mbSurfaceDirty;
459 
460     private:
461         CanvasBase( const CanvasBase& );
462         CanvasBase& operator=( const CanvasBase& );
463     };
464 }
465 
466 #endif /* INCLUDED_CANVAS_CANVASBASE_HXX */
467