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