1*91c99ff4SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*91c99ff4SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*91c99ff4SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*91c99ff4SAndrew Rist  * distributed with this work for additional information
6*91c99ff4SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*91c99ff4SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*91c99ff4SAndrew Rist  * "License"); you may not use this file except in compliance
9*91c99ff4SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*91c99ff4SAndrew Rist  *
11*91c99ff4SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*91c99ff4SAndrew Rist  *
13*91c99ff4SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*91c99ff4SAndrew Rist  * software distributed under the License is distributed on an
15*91c99ff4SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*91c99ff4SAndrew Rist  * KIND, either express or implied.  See the License for the
17*91c99ff4SAndrew Rist  * specific language governing permissions and limitations
18*91c99ff4SAndrew Rist  * under the License.
19*91c99ff4SAndrew Rist  *
20*91c99ff4SAndrew Rist  *************************************************************/
21*91c99ff4SAndrew Rist 
22*91c99ff4SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef _DXCANVAS_CANVASHELPER_HXX_
25cdf0e10cSrcweir #define _DXCANVAS_CANVASHELPER_HXX_
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <com/sun/star/rendering/XCanvas.hpp>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <basegfx/vector/b2isize.hxx>
30cdf0e10cSrcweir #include <basegfx/vector/b2dsize.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "dx_graphicsprovider.hxx"
33cdf0e10cSrcweir #include "dx_gdiplususer.hxx"
34cdf0e10cSrcweir #include "dx_impltools.hxx"
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include <boost/utility.hpp>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir 
39cdf0e10cSrcweir namespace dxcanvas
40cdf0e10cSrcweir {
41cdf0e10cSrcweir     /** Helper class for basic canvas functionality. Also offers
42cdf0e10cSrcweir         optional backbuffer painting, when providing it with a second
43cdf0e10cSrcweir         HDC to render into.
44cdf0e10cSrcweir      */
45cdf0e10cSrcweir     class CanvasHelper : private ::boost::noncopyable
46cdf0e10cSrcweir     {
47cdf0e10cSrcweir     public:
48cdf0e10cSrcweir         CanvasHelper();
49cdf0e10cSrcweir 
50cdf0e10cSrcweir         /// Release all references
51cdf0e10cSrcweir         void disposing();
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 		/** Initialize canvas helper
54cdf0e10cSrcweir 
55cdf0e10cSrcweir         	This method late-initializes the canvas helper, providing
56cdf0e10cSrcweir         	it with the necessary device and output objects. Note that
57cdf0e10cSrcweir         	the CanvasHelper does <em>not</em> take ownership of the
58cdf0e10cSrcweir         	passed rDevice reference, nor does it perform any
59cdf0e10cSrcweir         	reference counting. Thus, to prevent the reference counted
60cdf0e10cSrcweir         	SpriteCanvas object from deletion, the user of this class
61cdf0e10cSrcweir         	is responsible for holding ref-counted references itself!
62cdf0e10cSrcweir 
63cdf0e10cSrcweir         	@param rDevice
64cdf0e10cSrcweir             Reference device this canvas is associated with
65cdf0e10cSrcweir 
66cdf0e10cSrcweir          */
67cdf0e10cSrcweir         void setDevice( com::sun::star::rendering::XGraphicDevice& rDevice );
68cdf0e10cSrcweir 
69cdf0e10cSrcweir         /** Set the target for rendering operations
70cdf0e10cSrcweir 
71cdf0e10cSrcweir             @param rTarget
72cdf0e10cSrcweir             Render target
73cdf0e10cSrcweir          */
74cdf0e10cSrcweir         void setTarget( const GraphicsProviderSharedPtr& rTarget );
75cdf0e10cSrcweir 
76cdf0e10cSrcweir         /** Set the target for rendering operations
77cdf0e10cSrcweir 
78cdf0e10cSrcweir             @param rTarget
79cdf0e10cSrcweir             Render target
80cdf0e10cSrcweir 
81cdf0e10cSrcweir             @param rOutputOffset
82cdf0e10cSrcweir             Output offset in pixel
83cdf0e10cSrcweir          */
84cdf0e10cSrcweir         void setTarget( const GraphicsProviderSharedPtr& rTarget,
85cdf0e10cSrcweir                         const ::basegfx::B2ISize& 		 rOutputOffset );
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 
88cdf0e10cSrcweir         // CanvasHelper functionality
89cdf0e10cSrcweir         // ==========================
90cdf0e10cSrcweir 
91cdf0e10cSrcweir         // XCanvas (only providing, not implementing the
92cdf0e10cSrcweir         // interface. Also note subtle method parameter differences)
93cdf0e10cSrcweir         void clear();
94cdf0e10cSrcweir         void drawPoint( const ::com::sun::star::rendering::XCanvas* 	pCanvas,
95cdf0e10cSrcweir                         const ::com::sun::star::geometry::RealPoint2D& 	aPoint,
96cdf0e10cSrcweir                         const ::com::sun::star::rendering::ViewState& 	viewState,
97cdf0e10cSrcweir                         const ::com::sun::star::rendering::RenderState& renderState );
98cdf0e10cSrcweir         void drawLine( const ::com::sun::star::rendering::XCanvas* 		pCanvas,
99cdf0e10cSrcweir                        const ::com::sun::star::geometry::RealPoint2D& 	aStartPoint,
100cdf0e10cSrcweir                        const ::com::sun::star::geometry::RealPoint2D& 	aEndPoint,
101cdf0e10cSrcweir                        const ::com::sun::star::rendering::ViewState& 	viewState,
102cdf0e10cSrcweir                        const ::com::sun::star::rendering::RenderState& 	renderState	);
103cdf0e10cSrcweir         void drawBezier( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
104cdf0e10cSrcweir                          const ::com::sun::star::geometry::RealBezierSegment2D&	aBezierSegment,
105cdf0e10cSrcweir                          const ::com::sun::star::geometry::RealPoint2D& 		aEndPoint,
106cdf0e10cSrcweir                          const ::com::sun::star::rendering::ViewState& 			viewState,
107cdf0e10cSrcweir                          const ::com::sun::star::rendering::RenderState& 		renderState );
108cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
109cdf0e10cSrcweir         	drawPolyPolygon( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
110cdf0e10cSrcweir                              const ::com::sun::star::uno::Reference<
111cdf0e10cSrcweir                              		::com::sun::star::rendering::XPolyPolygon2D >&	xPolyPolygon,
112cdf0e10cSrcweir                              const ::com::sun::star::rendering::ViewState& 			viewState,
113cdf0e10cSrcweir                              const ::com::sun::star::rendering::RenderState& 		renderState );
114cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
115cdf0e10cSrcweir         	strokePolyPolygon( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
116cdf0e10cSrcweir                                const ::com::sun::star::uno::Reference<
117cdf0e10cSrcweir                                		::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon,
118cdf0e10cSrcweir                                const ::com::sun::star::rendering::ViewState& 		viewState,
119cdf0e10cSrcweir                                const ::com::sun::star::rendering::RenderState& 		renderState,
120cdf0e10cSrcweir                                const ::com::sun::star::rendering::StrokeAttributes& strokeAttributes );
121cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
122cdf0e10cSrcweir         	strokeTexturedPolyPolygon( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
123cdf0e10cSrcweir                                        const ::com::sun::star::uno::Reference<
124cdf0e10cSrcweir                                        		::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon,
125cdf0e10cSrcweir                                        const ::com::sun::star::rendering::ViewState& 		viewState,
126cdf0e10cSrcweir                                        const ::com::sun::star::rendering::RenderState& 		renderState,
127cdf0e10cSrcweir                                        const ::com::sun::star::uno::Sequence<
128cdf0e10cSrcweir                                        		::com::sun::star::rendering::Texture >& 		textures,
129cdf0e10cSrcweir                                        const ::com::sun::star::rendering::StrokeAttributes& strokeAttributes );
130cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
131cdf0e10cSrcweir         	strokeTextureMappedPolyPolygon( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
132cdf0e10cSrcweir                                             const ::com::sun::star::uno::Reference<
133cdf0e10cSrcweir                                             		::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon,
134cdf0e10cSrcweir                                             const ::com::sun::star::rendering::ViewState& 			viewState,
135cdf0e10cSrcweir                                             const ::com::sun::star::rendering::RenderState& 		renderState,
136cdf0e10cSrcweir                                             const ::com::sun::star::uno::Sequence<
137cdf0e10cSrcweir                                             		::com::sun::star::rendering::Texture >& 		textures,
138cdf0e10cSrcweir                                             const ::com::sun::star::uno::Reference<
139cdf0e10cSrcweir                                             		::com::sun::star::geometry::XMapping2D >& 		xMapping,
140cdf0e10cSrcweir                                             const ::com::sun::star::rendering::StrokeAttributes& 	strokeAttributes );
141cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XPolyPolygon2D >
142cdf0e10cSrcweir         	queryStrokeShapes( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
143cdf0e10cSrcweir                                const ::com::sun::star::uno::Reference<
144cdf0e10cSrcweir                                		::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon,
145cdf0e10cSrcweir                                const ::com::sun::star::rendering::ViewState& 		viewState,
146cdf0e10cSrcweir                                const ::com::sun::star::rendering::RenderState& 		renderState,
147cdf0e10cSrcweir                                const ::com::sun::star::rendering::StrokeAttributes& strokeAttributes );
148cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
149cdf0e10cSrcweir         	fillPolyPolygon( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
150cdf0e10cSrcweir                              const ::com::sun::star::uno::Reference<
151cdf0e10cSrcweir                              		::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon,
152cdf0e10cSrcweir                              const ::com::sun::star::rendering::ViewState& 			viewState,
153cdf0e10cSrcweir                              const ::com::sun::star::rendering::RenderState& 		renderState );
154cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
155cdf0e10cSrcweir         	fillTexturedPolyPolygon( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
156cdf0e10cSrcweir                                      const ::com::sun::star::uno::Reference<
157cdf0e10cSrcweir                                      		::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon,
158cdf0e10cSrcweir                                      const ::com::sun::star::rendering::ViewState& 			viewState,
159cdf0e10cSrcweir                                      const ::com::sun::star::rendering::RenderState& 		renderState,
160cdf0e10cSrcweir                                      const ::com::sun::star::uno::Sequence<
161cdf0e10cSrcweir                                      		::com::sun::star::rendering::Texture >& 		textures );
162cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
163cdf0e10cSrcweir         	fillTextureMappedPolyPolygon( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
164cdf0e10cSrcweir                                           const ::com::sun::star::uno::Reference<
165cdf0e10cSrcweir                                           		::com::sun::star::rendering::XPolyPolygon2D >& 	xPolyPolygon,
166cdf0e10cSrcweir                                           const ::com::sun::star::rendering::ViewState& 		viewState,
167cdf0e10cSrcweir                                           const ::com::sun::star::rendering::RenderState& 		renderState,
168cdf0e10cSrcweir                                           const ::com::sun::star::uno::Sequence<
169cdf0e10cSrcweir                                           		::com::sun::star::rendering::Texture >& 		textures,
170cdf0e10cSrcweir                                           const ::com::sun::star::uno::Reference<
171cdf0e10cSrcweir                                           		::com::sun::star::geometry::XMapping2D >& 		xMapping );
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvasFont > SAL_CALL
174cdf0e10cSrcweir         	createFont( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
175cdf0e10cSrcweir                         const ::com::sun::star::rendering::FontRequest& 		fontRequest,
176cdf0e10cSrcweir                         const ::com::sun::star::uno::Sequence<
177cdf0e10cSrcweir                         		::com::sun::star::beans::PropertyValue >& 		extraFontProperties,
178cdf0e10cSrcweir                         const ::com::sun::star::geometry::Matrix2D& 			fontMatrix );
179cdf0e10cSrcweir 
180cdf0e10cSrcweir         ::com::sun::star::uno::Sequence< ::com::sun::star::rendering::FontInfo >
181cdf0e10cSrcweir         	queryAvailableFonts( const ::com::sun::star::rendering::XCanvas* 		pCanvas,
182cdf0e10cSrcweir                                  const ::com::sun::star::rendering::FontInfo& 		aFilter,
183cdf0e10cSrcweir                                  const ::com::sun::star::uno::Sequence<
184cdf0e10cSrcweir                                  		::com::sun::star::beans::PropertyValue >& 	aFontProperties );
185cdf0e10cSrcweir 
186cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
187cdf0e10cSrcweir         	drawText( const ::com::sun::star::rendering::XCanvas* 			pCanvas,
188cdf0e10cSrcweir                       const ::com::sun::star::rendering::StringContext& 	text,
189cdf0e10cSrcweir                       const ::com::sun::star::uno::Reference<
190cdf0e10cSrcweir                       		::com::sun::star::rendering::XCanvasFont >& 	xFont,
191cdf0e10cSrcweir                       const ::com::sun::star::rendering::ViewState& 		viewState,
192cdf0e10cSrcweir                       const ::com::sun::star::rendering::RenderState& 		renderState,
193cdf0e10cSrcweir                       sal_Int8 												textDirection );
194cdf0e10cSrcweir 
195cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
196cdf0e10cSrcweir         	drawTextLayout( const ::com::sun::star::rendering::XCanvas* 	pCanvas,
197cdf0e10cSrcweir                             const ::com::sun::star::uno::Reference<
198cdf0e10cSrcweir                             	::com::sun::star::rendering::XTextLayout >& layoutetText,
199cdf0e10cSrcweir                             const ::com::sun::star::rendering::ViewState& 	viewState,
200cdf0e10cSrcweir                             const ::com::sun::star::rendering::RenderState& renderState );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
203cdf0e10cSrcweir         	drawBitmap( const ::com::sun::star::rendering::XCanvas* 	pCanvas,
204cdf0e10cSrcweir                         const ::com::sun::star::uno::Reference<
205cdf0e10cSrcweir                         		::com::sun::star::rendering::XBitmap >& xBitmap,
206cdf0e10cSrcweir                         const ::com::sun::star::rendering::ViewState& 	viewState,
207cdf0e10cSrcweir                         const ::com::sun::star::rendering::RenderState& renderState );
208cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCachedPrimitive >
209cdf0e10cSrcweir         	drawBitmapModulated( const ::com::sun::star::rendering::XCanvas* 		pCanvas,
210cdf0e10cSrcweir                                  const ::com::sun::star::uno::Reference<
211cdf0e10cSrcweir                                  		::com::sun::star::rendering::XBitmap >&		xBitmap,
212cdf0e10cSrcweir                                  const ::com::sun::star::rendering::ViewState& 		viewState,
213cdf0e10cSrcweir                                  const ::com::sun::star::rendering::RenderState& 	renderState );
214cdf0e10cSrcweir         ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XGraphicDevice >
215cdf0e10cSrcweir         	getDevice();
216cdf0e10cSrcweir 
217cdf0e10cSrcweir         // Flush drawing queue to screen
218cdf0e10cSrcweir         void					flush() const;
219cdf0e10cSrcweir 
220cdf0e10cSrcweir         /** Called from XCanvas base classes, to notify that content
221cdf0e10cSrcweir             is _about_ to change
222cdf0e10cSrcweir         */
modifying()223cdf0e10cSrcweir         void modifying() {}
224cdf0e10cSrcweir 
225cdf0e10cSrcweir     protected:
226cdf0e10cSrcweir         /// Refcounted global GDI+ state container
227cdf0e10cSrcweir         GDIPlusUserSharedPtr			mpGdiPlusUser;
228cdf0e10cSrcweir 
229cdf0e10cSrcweir         /** Phyical output device
230cdf0e10cSrcweir 
231cdf0e10cSrcweir             Deliberately not a refcounted reference, because of
232cdf0e10cSrcweir             potential circular references for spritecanvas.
233cdf0e10cSrcweir          */
234cdf0e10cSrcweir         com::sun::star::rendering::XGraphicDevice* mpDevice;
235cdf0e10cSrcweir 
236cdf0e10cSrcweir         /// Provides the Gdiplus::Graphics to render into
237cdf0e10cSrcweir         GraphicsProviderSharedPtr                  mpGraphicsProvider;
238cdf0e10cSrcweir 
needOutput() const239cdf0e10cSrcweir         bool needOutput() const { return mpGraphicsProvider.get() != NULL; };
240cdf0e10cSrcweir 
241cdf0e10cSrcweir         // returns transparency of color
242cdf0e10cSrcweir         void setupGraphicsState( GraphicsSharedPtr&                              rGraphics,
243cdf0e10cSrcweir                                  const ::com::sun::star::rendering::ViewState& 	 viewState,
244cdf0e10cSrcweir                                  const ::com::sun::star::rendering::RenderState& renderState );
245cdf0e10cSrcweir 
246cdf0e10cSrcweir         Gdiplus::CompositingMode 	calcCompositingMode( sal_Int8 nMode );
247cdf0e10cSrcweir 
248cdf0e10cSrcweir         /// Current (transformation-independent) output buffer offset
249cdf0e10cSrcweir         ::basegfx::B2ISize				maOutputOffset;
250cdf0e10cSrcweir     };
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir #endif /* _DXCANVAS_CANVASHELPER_HXX_ */
254