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