1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_cppcanvas.hxx"
30 
31 #include <lineaction.hxx>
32 #include <outdevstate.hxx>
33 
34 #include <rtl/logfile.hxx>
35 #include <com/sun/star/rendering/XCanvas.hpp>
36 
37 #include <tools/gen.hxx>
38 #include <vcl/canvastools.hxx>
39 
40 #include <basegfx/range/b2drange.hxx>
41 #include <basegfx/point/b2dpoint.hxx>
42 #include <basegfx/tools/canvastools.hxx>
43 #include <canvas/canvastools.hxx>
44 
45 #include <boost/utility.hpp>
46 
47 #include <cppcanvas/canvas.hxx>
48 
49 #include <mtftools.hxx>
50 
51 
52 using namespace ::com::sun::star;
53 
54 namespace cppcanvas
55 {
56     namespace internal
57     {
58         namespace
59         {
60             class LineAction : public Action, private ::boost::noncopyable
61             {
62             public:
63                 LineAction( const ::basegfx::B2DPoint&,
64                             const ::basegfx::B2DPoint&,
65                             const CanvasSharedPtr&,
66                             const OutDevState& );
67 
68                 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation ) const;
69                 virtual bool render( const ::basegfx::B2DHomMatrix& rTransformation,
70                                      const Subset&					rSubset ) const;
71 
72                 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix& rTransformation ) const;
73                 virtual ::basegfx::B2DRange getBounds( const ::basegfx::B2DHomMatrix&	rTransformation,
74                                                        const Subset&					rSubset ) const;
75 
76                 virtual sal_Int32 getActionCount() const;
77 
78             private:
79                 ::basegfx::B2DPoint     maStartPoint;
80                 ::basegfx::B2DPoint     maEndPoint;
81                 CanvasSharedPtr			mpCanvas;
82                 rendering::RenderState	maState;
83             };
84 
85             LineAction::LineAction( const ::basegfx::B2DPoint& rStartPoint,
86                                     const ::basegfx::B2DPoint& rEndPoint,
87                                     const CanvasSharedPtr&     rCanvas,
88                                     const OutDevState&         rState ) :
89                 maStartPoint( rStartPoint ),
90                 maEndPoint( rEndPoint ),
91                 mpCanvas( rCanvas ),
92                 maState()
93             {
94                 tools::initRenderState(maState,rState);
95                 maState.DeviceColor = rState.lineColor;
96             }
97 
98             bool LineAction::render( const ::basegfx::B2DHomMatrix& rTransformation ) const
99             {
100                 RTL_LOGFILE_CONTEXT( aLog, "::cppcanvas::internal::LineAction::render()" );
101                 RTL_LOGFILE_CONTEXT_TRACE1( aLog, "::cppcanvas::internal::LineAction: 0x%X", this );
102 
103                 rendering::RenderState aLocalState( maState );
104                 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
105 
106                 mpCanvas->getUNOCanvas()->drawLine( ::basegfx::unotools::point2DFromB2DPoint(maStartPoint),
107                                                     ::basegfx::unotools::point2DFromB2DPoint(maEndPoint),
108                                                     mpCanvas->getViewState(),
109                                                     aLocalState );
110 
111                 return true;
112             }
113 
114             bool LineAction::render( const ::basegfx::B2DHomMatrix&	rTransformation,
115                                      const Subset&					rSubset ) const
116             {
117                 // line only contains a single action, fail if subset
118                 // requests different range
119                 if( rSubset.mnSubsetBegin != 0 ||
120                     rSubset.mnSubsetEnd != 1 )
121                     return false;
122 
123                 return render( rTransformation );
124             }
125 
126             ::basegfx::B2DRange LineAction::getBounds( const ::basegfx::B2DHomMatrix& rTransformation ) const
127             {
128                 rendering::RenderState aLocalState( maState );
129                 ::canvas::tools::prependToRenderState(aLocalState, rTransformation);
130 
131                 return tools::calcDevicePixelBounds( ::basegfx::B2DRange( maStartPoint,
132                                                                           maEndPoint ),
133                                                      mpCanvas->getViewState(),
134                                                      aLocalState );
135             }
136 
137             ::basegfx::B2DRange LineAction::getBounds( const ::basegfx::B2DHomMatrix&	rTransformation,
138                                                        const Subset&					rSubset ) const
139             {
140                 // line only contains a single action, empty bounds
141                 // if subset requests different range
142                 if( rSubset.mnSubsetBegin != 0 ||
143                     rSubset.mnSubsetEnd != 1 )
144                     return ::basegfx::B2DRange();
145 
146                 return getBounds( rTransformation );
147             }
148 
149             sal_Int32 LineAction::getActionCount() const
150             {
151                 return 1;
152             }
153         }
154 
155         ActionSharedPtr LineActionFactory::createLineAction( const ::basegfx::B2DPoint&	rStartPoint,
156                                                              const ::basegfx::B2DPoint&	rEndPoint,
157                                                              const CanvasSharedPtr&     rCanvas,
158                                                              const OutDevState&         rState	)
159         {
160             return ActionSharedPtr( new LineAction( rStartPoint,
161                                                     rEndPoint,
162                                                     rCanvas,
163                                                     rState) );
164         }
165 
166     }
167 }
168