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