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 #include <sal/config.h> 21 #include <sal/log.hxx> 22 23 #include <algorithm> 24 25 #include <basegfx/matrix/b2dhommatrix.hxx> 26 #include <basegfx/point/b2dpoint.hxx> 27 #include <basegfx/utils/canvastools.hxx> 28 #include <com/sun/star/rendering/CompositeOperation.hpp> 29 #include <com/sun/star/rendering/PathCapType.hpp> 30 #include <com/sun/star/rendering/PathJoinType.hpp> 31 #include <com/sun/star/rendering/RepaintResult.hpp> 32 #include <com/sun/star/rendering/TexturingMode.hpp> 33 #include <rtl/math.hxx> 34 #include <comphelper/diagnose_ex.hxx> 35 36 #include <canvas/canvastools.hxx> 37 38 #include "dx_bitmapcanvashelper.hxx" 39 #include "dx_canvasfont.hxx" 40 #include "dx_impltools.hxx" 41 #include "dx_spritecanvas.hxx" 42 #include "dx_textlayout.hxx" 43 44 45 using namespace ::com::sun::star; 46 47 namespace dxcanvas 48 { BitmapCanvasHelper()49 BitmapCanvasHelper::BitmapCanvasHelper() : 50 mpTarget() 51 {} 52 disposing()53 void BitmapCanvasHelper::disposing() 54 { 55 mpTarget.reset(); 56 CanvasHelper::disposing(); 57 } 58 setTarget(const IBitmapSharedPtr & rTarget)59 void BitmapCanvasHelper::setTarget( const IBitmapSharedPtr& rTarget ) 60 { 61 ENSURE_OR_THROW( rTarget, 62 "BitmapCanvasHelper::setTarget(): Invalid target" ); 63 ENSURE_OR_THROW( !mpTarget, 64 "BitmapCanvasHelper::setTarget(): target set, old target would be overwritten" ); 65 66 mpTarget = rTarget; 67 CanvasHelper::setTarget(rTarget); 68 } 69 setTarget(const IBitmapSharedPtr & rTarget,const::basegfx::B2ISize & rOutputOffset)70 void BitmapCanvasHelper::setTarget( const IBitmapSharedPtr& rTarget, 71 const ::basegfx::B2ISize& rOutputOffset ) 72 { 73 ENSURE_OR_THROW( rTarget, 74 "BitmapCanvasHelper::setTarget(): invalid target" ); 75 ENSURE_OR_THROW( !mpTarget, 76 "BitmapCanvasHelper::setTarget(): target set, old target would be overwritten" ); 77 78 mpTarget = rTarget; 79 CanvasHelper::setTarget(rTarget,rOutputOffset); 80 } 81 clear()82 void BitmapCanvasHelper::clear() 83 { 84 if( needOutput() ) 85 { 86 GraphicsSharedPtr pGraphics( mpTarget->getGraphics() ); 87 88 Gdiplus::Color aClearColor = hasAlpha() ? 89 Gdiplus::Color( 0,255,255,255 ) : Gdiplus::Color(Gdiplus::ARGB(Gdiplus::Color::White)); 90 91 ENSURE_OR_THROW( 92 Gdiplus::Ok == pGraphics->SetCompositingMode( 93 Gdiplus::CompositingModeSourceCopy ), // force set, don't blend 94 "BitmapCanvasHelper::clear(): GDI+ SetCompositingMode call failed" ); 95 ENSURE_OR_THROW( 96 Gdiplus::Ok == pGraphics->Clear( aClearColor ), 97 "BitmapCanvasHelper::clear(): GDI+ Clear call failed" ); 98 } 99 } 100 drawTextLayout(const rendering::XCanvas *,const uno::Reference<rendering::XTextLayout> & xLayoutetText,const rendering::ViewState & viewState,const rendering::RenderState & renderState)101 uno::Reference< rendering::XCachedPrimitive > BitmapCanvasHelper::drawTextLayout( const rendering::XCanvas* /*pCanvas*/, 102 const uno::Reference< rendering::XTextLayout >& xLayoutetText, 103 const rendering::ViewState& viewState, 104 const rendering::RenderState& renderState ) 105 { 106 ENSURE_OR_THROW( xLayoutetText.is(), 107 "BitmapCanvasHelper::drawTextLayout: layout is NULL"); 108 109 if( needOutput() ) 110 { 111 TextLayout* pTextLayout = 112 dynamic_cast< TextLayout* >( xLayoutetText.get() ); 113 114 ENSURE_OR_THROW( pTextLayout, 115 "BitmapCanvasHelper::drawTextLayout(): TextLayout not compatible with this canvas" ); 116 117 pTextLayout->draw( mpTarget->getGraphics(), 118 viewState, 119 renderState, 120 maOutputOffset, 121 mpDevice, 122 mpTarget->hasAlpha() ); 123 } 124 125 return uno::Reference< rendering::XCachedPrimitive >(nullptr); 126 } 127 copyRect(const rendering::XCanvas *,const uno::Reference<rendering::XBitmapCanvas> &,const geometry::RealRectangle2D &,const rendering::ViewState &,const rendering::RenderState &,const geometry::RealRectangle2D &,const rendering::ViewState &,const rendering::RenderState &)128 void BitmapCanvasHelper::copyRect( const rendering::XCanvas* /*pCanvas*/, 129 const uno::Reference< rendering::XBitmapCanvas >& /*sourceCanvas*/, 130 const geometry::RealRectangle2D& /*sourceRect*/, 131 const rendering::ViewState& /*sourceViewState*/, 132 const rendering::RenderState& /*sourceRenderState*/, 133 const geometry::RealRectangle2D& /*destRect*/, 134 const rendering::ViewState& /*destViewState*/, 135 const rendering::RenderState& /*destRenderState*/ ) 136 { 137 // TODO(F2): copyRect NYI 138 } 139 getSize()140 geometry::IntegerSize2D BitmapCanvasHelper::getSize() 141 { 142 if( !mpTarget ) 143 return geometry::IntegerSize2D(1, 1); 144 return basegfx::unotools::integerSize2DFromB2ISize(mpTarget->getSize()); 145 } 146 getScaledBitmap(const geometry::RealSize2D &,bool)147 uno::Reference< rendering::XBitmap > BitmapCanvasHelper::getScaledBitmap( const geometry::RealSize2D& /*newSize*/, 148 bool /*beFast*/ ) 149 { 150 // TODO(F1): 151 return uno::Reference< rendering::XBitmap >(); 152 } 153 getData(rendering::IntegerBitmapLayout & bitmapLayout,const geometry::IntegerRectangle2D & rect)154 uno::Sequence< sal_Int8 > BitmapCanvasHelper::getData( rendering::IntegerBitmapLayout& bitmapLayout, 155 const geometry::IntegerRectangle2D& rect ) 156 { 157 SAL_INFO( "canvas.directx", "::dxcanvas::BitmapCanvasHelper::getData()" ); 158 159 ENSURE_OR_THROW( mpTarget, 160 "::dxcanvas::BitmapCanvasHelper::getData(): disposed" ); 161 162 bitmapLayout = getMemoryLayout(); 163 return mpTarget->getData(bitmapLayout,rect); 164 } 165 setData(const uno::Sequence<sal_Int8> & data,const rendering::IntegerBitmapLayout & bitmapLayout,const geometry::IntegerRectangle2D & rect)166 void BitmapCanvasHelper::setData( const uno::Sequence< sal_Int8 >& data, 167 const rendering::IntegerBitmapLayout& bitmapLayout, 168 const geometry::IntegerRectangle2D& rect ) 169 { 170 SAL_INFO( "canvas.directx", "::dxcanvas::BitmapCanvasHelper::setData()" ); 171 172 ENSURE_OR_THROW( mpTarget, 173 "::dxcanvas::BitmapCanvasHelper::setData(): disposed" ); 174 175 mpTarget->setData(data,bitmapLayout,rect); 176 } 177 setPixel(const uno::Sequence<sal_Int8> & color,const rendering::IntegerBitmapLayout & bitmapLayout,const geometry::IntegerPoint2D & pos)178 void BitmapCanvasHelper::setPixel( const uno::Sequence< sal_Int8 >& color, 179 const rendering::IntegerBitmapLayout& bitmapLayout, 180 const geometry::IntegerPoint2D& pos ) 181 { 182 SAL_INFO( "canvas.directx", "::dxcanvas::BitmapCanvasHelper::setPixel()" ); 183 184 ENSURE_OR_THROW( mpTarget, 185 "::dxcanvas::BitmapCanvasHelper::setPixel(): disposed" ); 186 187 mpTarget->setPixel(color,bitmapLayout,pos); 188 } 189 getPixel(rendering::IntegerBitmapLayout & bitmapLayout,const geometry::IntegerPoint2D & pos)190 uno::Sequence< sal_Int8 > BitmapCanvasHelper::getPixel( rendering::IntegerBitmapLayout& bitmapLayout, 191 const geometry::IntegerPoint2D& pos ) 192 { 193 SAL_INFO( "canvas.directx", "::dxcanvas::BitmapCanvasHelper::getPixel()" ); 194 195 ENSURE_OR_THROW( mpTarget, 196 "::dxcanvas::BitmapCanvasHelper::getPixel(): disposed" ); 197 198 bitmapLayout = getMemoryLayout(); 199 return mpTarget->getPixel(bitmapLayout,pos); 200 } 201 getPalette()202 uno::Reference< rendering::XBitmapPalette > BitmapCanvasHelper::getPalette() 203 { 204 // TODO(F1): Palette bitmaps NYI 205 return uno::Reference< rendering::XBitmapPalette >(); 206 } 207 getMemoryLayout()208 rendering::IntegerBitmapLayout BitmapCanvasHelper::getMemoryLayout() 209 { 210 if( !mpTarget ) 211 return rendering::IntegerBitmapLayout(); // we're disposed 212 213 return ::canvas::tools::getStdMemoryLayout(getSize()); 214 } hasAlpha() const215 bool BitmapCanvasHelper::hasAlpha() const 216 { 217 return mpTarget && mpTarget->hasAlpha(); 218 } 219 } 220 221 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 222
