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 
21 #include <com/sun/star/rendering/XCanvas.hpp>
22 
23 #include <sal/types.h>
24 #include <sal/log.hxx>
25 #include <vcl/canvastools.hxx>
26 
27 #include <basegfx/range/b2drange.hxx>
28 #include <basegfx/point/b2dpoint.hxx>
29 #include <basegfx/utils/canvastools.hxx>
30 #include <canvas/canvastools.hxx>
31 
32 #include "pointaction.hxx"
33 #include <outdevstate.hxx>
34 #include <cppcanvas/canvas.hxx>
35 #include "mtftools.hxx"
36 
37 
38 using namespace ::com::sun::star;
39 
40 namespace cppcanvas
41 {
42     namespace internal
43     {
44         namespace
45         {
46             class PointAction : public Action
47             {
48             public:
49                 PointAction( const ::basegfx::B2DPoint&,
50                              const CanvasSharedPtr&,
51                              const OutDevState& );
52                 PointAction( const ::basegfx::B2DPoint&,
53                              const CanvasSharedPtr&,
54                              const OutDevState&,
55                              const ::Color&     );
56 
57                 PointAction(const PointAction&) = delete;
58                 const PointAction& operator=(const PointAction&) = delete;
59 
60                 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation ) const override;
61                 virtual bool renderSubset( const ::basegfx::B2DHomMatrix& rTransformation,
62                                            const Subset&                  rSubset ) const override;
63 
64                 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation ) const override;
65                 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix&   rTransformation,
66                                                        const Subset&                    rSubset ) const override;
67 
68                 virtual sal_Int32 getActionCount() const override;
69 
70             private:
71                 ::basegfx::B2DPoint                         maPoint;
72                 CanvasSharedPtr                             mpCanvas;
73                 css::rendering::RenderState                 maState;
74             };
75 
PointAction(const::basegfx::B2DPoint & rPoint,const CanvasSharedPtr & rCanvas,const OutDevState & rState)76             PointAction::PointAction( const ::basegfx::B2DPoint& rPoint,
77                                       const CanvasSharedPtr&     rCanvas,
78                                       const OutDevState&         rState ) :
79                 maPoint( rPoint ),
80                 mpCanvas( rCanvas ),
81                 maState()
82             {
83                 tools::initRenderState(maState,rState);
84                 maState.DeviceColor = rState.lineColor;
85             }
86 
PointAction(const::basegfx::B2DPoint & rPoint,const CanvasSharedPtr & rCanvas,const OutDevState & rState,const::Color & rAltColor)87             PointAction::PointAction( const ::basegfx::B2DPoint& rPoint,
88                                       const CanvasSharedPtr&     rCanvas,
89                                       const OutDevState&         rState,
90                                       const ::Color&             rAltColor ) :
91                 maPoint( rPoint ),
92                 mpCanvas( rCanvas ),
93                 maState()
94             {
95                 tools::initRenderState(maState,rState);
96                 maState.DeviceColor = vcl::unotools::colorToDoubleSequence(
97                     rAltColor,
98                     rCanvas->getUNOCanvas()->getDevice()->getDeviceColorSpace() );
99             }
100 
render(const::basegfx::B2DHomMatrix & rTransformation) const101             bool PointAction::render( const ::basegfx::B2DHomMatrix& rTransformation ) const
102             {
103                 SAL_INFO( "cppcanvas.emf", "::cppcanvas::internal::PointAction::render()" );
104                 SAL_INFO( "cppcanvas.emf", "::cppcanvas::internal::PointAction: 0x" << std::hex << this );
105 
106                 rendering::RenderState aLocalState( maState );
107                 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
108 
109                 mpCanvas->getUNOCanvas()->drawPoint( ::basegfx::unotools::point2DFromB2DPoint(maPoint),
110                                                      mpCanvas->getViewState(),
111                                                      aLocalState );
112 
113                 return true;
114             }
115 
renderSubset(const::basegfx::B2DHomMatrix & rTransformation,const Subset & rSubset) const116             bool PointAction::renderSubset( const ::basegfx::B2DHomMatrix&    rTransformation,
117                                             const Subset&                     rSubset ) const
118             {
119                 // point only contains a single action, fail if subset
120                 // requests different range
121                 if( rSubset.mnSubsetBegin != 0 ||
122                     rSubset.mnSubsetEnd != 1 )
123                     return false;
124 
125                 return render( rTransformation );
126             }
127 
getBounds(const::basegfx::B2DHomMatrix & rTransformation) const128             ::basegfx::B2DRange PointAction::getBounds( const ::basegfx::B2DHomMatrix&  rTransformation ) const
129             {
130                 rendering::RenderState aLocalState( maState );
131                 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
132 
133                 return tools::calcDevicePixelBounds( ::basegfx::B2DRange( maPoint.getX()-1,
134                                                                           maPoint.getY()-1,
135                                                                           maPoint.getX()+1,
136                                                                           maPoint.getY()+1 ),
137                                                      mpCanvas->getViewState(),
138                                                      aLocalState );
139             }
140 
getBounds(const::basegfx::B2DHomMatrix & rTransformation,const Subset & rSubset) const141             ::basegfx::B2DRange PointAction::getBounds( const ::basegfx::B2DHomMatrix&  rTransformation,
142                                                         const Subset&                   rSubset ) const
143             {
144                 // point only contains a single action, empty bounds
145                 // if subset requests different range
146                 if( rSubset.mnSubsetBegin != 0 ||
147                     rSubset.mnSubsetEnd != 1 )
148                     return ::basegfx::B2DRange();
149 
150                 return getBounds( rTransformation );
151             }
152 
getActionCount() const153             sal_Int32 PointAction::getActionCount() const
154             {
155                 return 1;
156             }
157         }
158 
createPointAction(const::basegfx::B2DPoint & rPoint,const CanvasSharedPtr & rCanvas,const OutDevState & rState)159         std::shared_ptr<Action> PointActionFactory::createPointAction( const ::basegfx::B2DPoint& rPoint,
160                                                                const CanvasSharedPtr&     rCanvas,
161                                                                const OutDevState&         rState )
162         {
163             return std::shared_ptr<Action>( new PointAction( rPoint, rCanvas, rState ) );
164         }
165 
createPointAction(const::basegfx::B2DPoint & rPoint,const CanvasSharedPtr & rCanvas,const OutDevState & rState,const::Color & rColor)166         std::shared_ptr<Action> PointActionFactory::createPointAction( const ::basegfx::B2DPoint& rPoint,
167                                                                const CanvasSharedPtr&     rCanvas,
168                                                                const OutDevState&         rState,
169                                                                const ::Color&             rColor    )
170         {
171             return std::shared_ptr<Action>( new PointAction( rPoint, rCanvas, rState, rColor ) );
172         }
173     }
174 }
175 
176 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
177