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