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