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