Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 : #ifndef _VCLCANVAS_CANVASHELPER_HXX_
21 : #define _VCLCANVAS_CANVASHELPER_HXX_
22 :
23 : #include <com/sun/star/rendering/XCanvas.hpp>
24 : #include <com/sun/star/rendering/XIntegerBitmap.hpp>
25 :
26 : #include <vcl/outdev.hxx>
27 :
28 : #include <canvas/vclwrapper.hxx>
29 :
30 : #include "cachedbitmap.hxx"
31 : #include "outdevprovider.hxx"
32 :
33 : #include <boost/utility.hpp>
34 :
35 :
36 : namespace vclcanvas
37 : {
38 : class SpriteCanvas;
39 :
40 : /** Helper class for basic canvas functionality. Also offers
41 : optional backbuffer painting, when providing it with a second
42 : OutputDevice to render into.
43 : */
44 0 : class CanvasHelper : private ::boost::noncopyable
45 : {
46 : public:
47 : /** Create canvas helper
48 : */
49 : CanvasHelper();
50 :
51 : /// Release all references
52 : void disposing();
53 :
54 : /** Initialize canvas helper
55 :
56 : This method late-initializes the canvas helper, providing
57 : it with the necessary device and output objects. Note that
58 : the CanvasHelper does <em>not</em> take ownership of the
59 : passed rDevice reference, nor does it perform any
60 : reference counting. Thus, to prevent the reference counted
61 : SpriteCanvas object from deletion, the user of this class
62 : is responsible for holding ref-counted references itself!
63 :
64 : @param rDevice
65 : Reference device this canvas is associated with
66 :
67 : @param rOutDev
68 : Set primary output device for this canvas. That's where
69 : all content is output to.
70 :
71 : @param bProtect
72 : When true, all output operations preserve outdev
73 : state. When false, outdev state might change at any time.
74 :
75 : @param bHaveAlpha
76 : When true, hasAlpha() will always return true, otherwise, false.
77 : */
78 : void init( ::com::sun::star::rendering::XGraphicDevice& rDevice,
79 : const OutDevProviderSharedPtr& rOutDev,
80 : bool bProtect,
81 : bool bHaveAlpha );
82 :
83 : /** Set primary output device
84 :
85 : This changes the primary output device, where rendering is
86 : sent to.
87 : */
88 : void setOutDev( const OutDevProviderSharedPtr& rOutDev,
89 : bool bProtect);
90 :
91 : /** Set secondary output device
92 :
93 : Used for sprites, to generate mask bitmap.
94 : */
95 : void setBackgroundOutDev( const OutDevProviderSharedPtr& rOutDev );
96 :
97 :
98 : // CanvasHelper functionality
99 : // ==========================
100 :
101 : // XCanvas (only providing, not implementing the
102 : // interface. Also note subtle method parameter differences)
103 : void clear();
104 : void drawPoint( const ::com::sun::star::rendering::XCanvas* rCanvas,
105 : const ::com::sun::star::geometry::RealPoint2D& aPoint,
106 : const ::com::sun::star::rendering::ViewState& viewState,
107 : const ::com::sun::star::rendering::RenderState& renderState );
108 : void drawLine( const ::com::sun::star::rendering::XCanvas* rCanvas,
109 : const ::com::sun::star::geometry::RealPoint2D& aStartPoint,
110 : const ::com::sun::star::geometry::RealPoint2D& aEndPoint,
111 : const ::com::sun::star::rendering::ViewState& viewState,
112 : const ::com::sun::star::rendering::RenderState& renderState );
113 : void drawBezier( const ::com::sun::star::rendering::XCanvas* rCanvas,
114 : const ::com::sun::star::geometry::RealBezierSegment2D& aBezierSegment,
115 : const ::com::sun::star::geometry::RealPoint2D& aEndPoint,
116 : const ::com::sun::star::rendering::ViewState& viewState,
117 : const ::com::sun::star::rendering::RenderState& renderState );
118 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
119 : drawPolyPolygon( const ::com::sun::star::rendering::XCanvas* rCanvas,
120 : const ::com::sun::star::uno::Reference<
121 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
122 : const ::com::sun::star::rendering::ViewState& viewState,
123 : const ::com::sun::star::rendering::RenderState& renderState );
124 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
125 : strokePolyPolygon( const ::com::sun::star::rendering::XCanvas* rCanvas,
126 : const ::com::sun::star::uno::Reference<
127 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
128 : const ::com::sun::star::rendering::ViewState& viewState,
129 : const ::com::sun::star::rendering::RenderState& renderState,
130 : const ::com::sun::star::rendering::StrokeAttributes& strokeAttributes );
131 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
132 : strokeTexturedPolyPolygon( const ::com::sun::star::rendering::XCanvas* rCanvas,
133 : const ::com::sun::star::uno::Reference<
134 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
135 : const ::com::sun::star::rendering::ViewState& viewState,
136 : const ::com::sun::star::rendering::RenderState& renderState,
137 : const ::com::sun::star::uno::Sequence<
138 : ::com::sun::star::rendering::Texture >& textures,
139 : const ::com::sun::star::rendering::StrokeAttributes& strokeAttributes );
140 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
141 : strokeTextureMappedPolyPolygon( const ::com::sun::star::rendering::XCanvas* rCanvas,
142 : const ::com::sun::star::uno::Reference<
143 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
144 : const ::com::sun::star::rendering::ViewState& viewState,
145 : const ::com::sun::star::rendering::RenderState& renderState,
146 : const ::com::sun::star::uno::Sequence<
147 : ::com::sun::star::rendering::Texture >& textures,
148 : const ::com::sun::star::uno::Reference<
149 : ::com::sun::star::geometry::XMapping2D >& xMapping,
150 : const ::com::sun::star::rendering::StrokeAttributes& strokeAttributes );
151 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >
152 : queryStrokeShapes( const ::com::sun::star::rendering::XCanvas* rCanvas,
153 : const ::com::sun::star::uno::Reference<
154 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
155 : const ::com::sun::star::rendering::ViewState& viewState,
156 : const ::com::sun::star::rendering::RenderState& renderState,
157 : const ::com::sun::star::rendering::StrokeAttributes& strokeAttributes );
158 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
159 : fillPolyPolygon( const ::com::sun::star::rendering::XCanvas* rCanvas,
160 : const ::com::sun::star::uno::Reference<
161 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
162 : const ::com::sun::star::rendering::ViewState& viewState,
163 : const ::com::sun::star::rendering::RenderState& renderState );
164 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
165 : fillTexturedPolyPolygon( const ::com::sun::star::rendering::XCanvas* rCanvas,
166 : const ::com::sun::star::uno::Reference<
167 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
168 : const ::com::sun::star::rendering::ViewState& viewState,
169 : const ::com::sun::star::rendering::RenderState& renderState,
170 : const ::com::sun::star::uno::Sequence<
171 : ::com::sun::star::rendering::Texture >& textures );
172 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
173 : fillTextureMappedPolyPolygon( const ::com::sun::star::rendering::XCanvas* rCanvas,
174 : const ::com::sun::star::uno::Reference<
175 : ::com::sun::star::rendering::XPolyPolygon2D >& xPolyPolygon,
176 : const ::com::sun::star::rendering::ViewState& viewState,
177 : const ::com::sun::star::rendering::RenderState& renderState,
178 : const ::com::sun::star::uno::Sequence<
179 : ::com::sun::star::rendering::Texture >& textures,
180 : const ::com::sun::star::uno::Reference<
181 : ::com::sun::star::geometry::XMapping2D >& xMapping );
182 :
183 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvasFont >
184 : createFont( const ::com::sun::star::rendering::XCanvas* rCanvas,
185 : const ::com::sun::star::rendering::FontRequest& fontRequest,
186 : const ::com::sun::star::uno::Sequence<
187 : ::com::sun::star::beans::PropertyValue >& extraFontProperties,
188 : const ::com::sun::star::geometry::Matrix2D& fontMatrix );
189 :
190 : ::com::sun::star::uno::Sequence< ::com::sun::star::rendering::FontInfo >
191 : queryAvailableFonts( const ::com::sun::star::rendering::XCanvas* rCanvas,
192 : const ::com::sun::star::rendering::FontInfo& aFilter,
193 : const ::com::sun::star::uno::Sequence<
194 : ::com::sun::star::beans::PropertyValue >& aFontProperties );
195 :
196 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
197 : drawText( const ::com::sun::star::rendering::XCanvas* rCanvas,
198 : const ::com::sun::star::rendering::StringContext& text,
199 : const ::com::sun::star::uno::Reference<
200 : ::com::sun::star::rendering::XCanvasFont >& xFont,
201 : const ::com::sun::star::rendering::ViewState& viewState,
202 : const ::com::sun::star::rendering::RenderState& renderState,
203 : sal_Int8 textDirection );
204 :
205 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
206 : drawTextLayout( const ::com::sun::star::rendering::XCanvas* rCanvas,
207 : const ::com::sun::star::uno::Reference<
208 : ::com::sun::star::rendering::XTextLayout >& layoutetText,
209 : const ::com::sun::star::rendering::ViewState& viewState,
210 : const ::com::sun::star::rendering::RenderState& renderState );
211 :
212 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
213 : drawBitmap( const ::com::sun::star::rendering::XCanvas* rCanvas,
214 : const ::com::sun::star::uno::Reference<
215 : ::com::sun::star::rendering::XBitmap >& xBitmap,
216 : const ::com::sun::star::rendering::ViewState& viewState,
217 : const ::com::sun::star::rendering::RenderState& renderState );
218 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
219 : drawBitmapModulated( const ::com::sun::star::rendering::XCanvas* rCanvas,
220 : const ::com::sun::star::uno::Reference<
221 : ::com::sun::star::rendering::XBitmap >& xBitmap,
222 : const ::com::sun::star::rendering::ViewState& viewState,
223 : const ::com::sun::star::rendering::RenderState& renderState );
224 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >
225 : getDevice();
226 :
227 : // BitmapCanvasHelper functionality
228 : // ================================
229 :
230 : void copyRect( const ::com::sun::star::rendering::XCanvas* rCanvas,
231 : const ::com::sun::star::uno::Reference<
232 : ::com::sun::star::rendering::XBitmapCanvas >& sourceCanvas,
233 : const ::com::sun::star::geometry::RealRectangle2D& sourceRect,
234 : const ::com::sun::star::rendering::ViewState& sourceViewState,
235 : const ::com::sun::star::rendering::RenderState& sourceRenderState,
236 : const ::com::sun::star::geometry::RealRectangle2D& destRect,
237 : const ::com::sun::star::rendering::ViewState& destViewState,
238 : const ::com::sun::star::rendering::RenderState& destRenderState );
239 :
240 : ::com::sun::star::geometry::IntegerSize2D getSize();
241 :
242 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > queryBitmapCanvas();
243 :
244 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmap >
245 : getScaledBitmap( const ::com::sun::star::geometry::RealSize2D& newSize,
246 : sal_Bool beFast );
247 :
248 : ::com::sun::star::uno::Sequence< sal_Int8 >
249 : getData( ::com::sun::star::rendering::IntegerBitmapLayout& bitmapLayout,
250 : const ::com::sun::star::geometry::IntegerRectangle2D& rect );
251 :
252 : void setData( const ::com::sun::star::uno::Sequence< sal_Int8 >& data,
253 : const ::com::sun::star::rendering::IntegerBitmapLayout& bitmapLayout,
254 : const ::com::sun::star::geometry::IntegerRectangle2D& rect );
255 :
256 : void setPixel( const ::com::sun::star::uno::Sequence< sal_Int8 >& color,
257 : const ::com::sun::star::rendering::IntegerBitmapLayout& bitmapLayout,
258 : const ::com::sun::star::geometry::IntegerPoint2D& pos );
259 :
260 : ::com::sun::star::uno::Sequence< sal_Int8 >
261 : getPixel( ::com::sun::star::rendering::IntegerBitmapLayout& bitmapLayout,
262 : const ::com::sun::star::geometry::IntegerPoint2D& pos );
263 :
264 : ::com::sun::star::rendering::IntegerBitmapLayout getMemoryLayout();
265 :
266 : /// Repaint a cached bitmap
267 : bool repaint( const GraphicObjectSharedPtr& rGrf,
268 : const ::com::sun::star::rendering::ViewState& viewState,
269 : const ::com::sun::star::rendering::RenderState& renderState,
270 : const ::Point& rPt,
271 : const ::Size& rSz,
272 : const GraphicAttr& rAttr ) const;
273 :
274 : /** Flush drawing queue.
275 :
276 : This only works for Window canvases, and ensures that all
277 : pending render operations are flushed to the
278 : driver/hardware.
279 : */
280 : void flush() const;
281 :
282 : enum ColorType
283 : {
284 : LINE_COLOR, FILL_COLOR, TEXT_COLOR, IGNORE_COLOR
285 : };
286 :
287 : // returns transparency of color
288 : int setupOutDevState( const ::com::sun::star::rendering::ViewState& viewState,
289 : const ::com::sun::star::rendering::RenderState& renderState,
290 : ColorType eColorType ) const;
291 :
292 : /** Called from XCanvas base classes, to notify that content
293 : is _about_ to change
294 : */
295 0 : void modifying() {}
296 :
297 0 : bool hasAlpha() const { return mbHaveAlpha; }
298 :
299 : protected:
300 : /** Phyical output device
301 :
302 : Deliberately not a refcounted reference, because of
303 : potential circular references for spritecanvas.
304 : */
305 : ::com::sun::star::rendering::XGraphicDevice* mpDevice;
306 :
307 : /// Rendering to this outdev preserves its state
308 : OutDevProviderSharedPtr mpProtectedOutDev;
309 :
310 : /// Rendering to this outdev does not preserve its state
311 : OutDevProviderSharedPtr mpOutDev;
312 :
313 : /// Rendering to this outdev does not preserve its state
314 : OutDevProviderSharedPtr mp2ndOutDev;
315 :
316 : /// When true, content is able to represent alpha
317 : bool mbHaveAlpha;
318 :
319 : private:
320 : ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
321 : implDrawBitmap( const ::com::sun::star::rendering::XCanvas* rCanvas,
322 : const ::com::sun::star::uno::Reference<
323 : ::com::sun::star::rendering::XBitmap >& xBitmap,
324 : const ::com::sun::star::rendering::ViewState& viewState,
325 : const ::com::sun::star::rendering::RenderState& renderState,
326 : bool bModulateColors );
327 :
328 : bool setupTextOutput( ::Point& o_rOutPos,
329 : const ::com::sun::star::rendering::ViewState& viewState,
330 : const ::com::sun::star::rendering::RenderState& renderState,
331 : const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvasFont >& xFont ) const;
332 :
333 : };
334 : }
335 :
336 : #endif /* _VCLCANVAS_CANVASHELPER_HXX_ */
337 :
338 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|