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 #include "overlayrangesoutline.hxx" 20 #include <svx/sdr/overlay/overlaymanager.hxx> 21 #include <basegfx/polygon/b2dpolygon.hxx> 22 #include <basegfx/polygon/b2dpolypolygon.hxx> 23 #include <basegfx/polygon/b2dpolygontools.hxx> 24 #include <basegfx/polygon/b2dpolypolygoncutter.hxx> 25 #include <drawinglayer/primitive2d/PolyPolygonHairlinePrimitive2D.hxx> 26 27 namespace 28 { 29 // combine ranges geometrically to a single, ORed polygon impCombineRangesToPolyPolygon(const std::vector<basegfx::B2DRange> & rRanges)30 basegfx::B2DPolyPolygon impCombineRangesToPolyPolygon(const std::vector< basegfx::B2DRange >& rRanges) 31 { 32 const sal_uInt32 nCount(rRanges.size()); 33 basegfx::B2DPolyPolygon aRetval; 34 35 for(sal_uInt32 a(0); a < nCount; a++) 36 { 37 const basegfx::B2DPolygon aDiscretePolygon(basegfx::utils::createPolygonFromRect(rRanges[a])); 38 39 if(0 == a) 40 { 41 aRetval.append(aDiscretePolygon); 42 } 43 else 44 { 45 aRetval = basegfx::utils::solvePolygonOperationOr(aRetval, basegfx::B2DPolyPolygon(aDiscretePolygon)); 46 } 47 } 48 49 return aRetval; 50 } 51 } 52 53 namespace sw::overlay 54 { createOverlayObjectPrimitive2DSequence()55 drawinglayer::primitive2d::Primitive2DContainer OverlayRangesOutline::createOverlayObjectPrimitive2DSequence() 56 { 57 drawinglayer::primitive2d::Primitive2DContainer aRetval; 58 const sal_uInt32 nCount(getRanges().size()); 59 60 if( nCount ) 61 { 62 const basegfx::BColor aRGBColor(getBaseColor().getBColor()); 63 const basegfx::B2DPolyPolygon aPolyPolygon(impCombineRangesToPolyPolygon(getRanges())); 64 const drawinglayer::primitive2d::Primitive2DReference aOutline( 65 new drawinglayer::primitive2d::PolyPolygonHairlinePrimitive2D( 66 aPolyPolygon, 67 aRGBColor)); 68 69 aRetval.resize(1); 70 aRetval[0] = aOutline; 71 } 72 73 return aRetval; 74 } 75 OverlayRangesOutline(const Color & rColor,const std::vector<basegfx::B2DRange> & rRanges)76 OverlayRangesOutline::OverlayRangesOutline( 77 const Color& rColor, 78 const std::vector< basegfx::B2DRange >& rRanges ) 79 : sdr::overlay::OverlayObject(rColor) 80 , maRanges(rRanges) 81 { 82 // no AA for highlight overlays 83 allowAntiAliase(false); 84 } 85 ~OverlayRangesOutline()86 OverlayRangesOutline::~OverlayRangesOutline() 87 { 88 if( getOverlayManager() ) 89 { 90 getOverlayManager()->remove(*this); 91 } 92 } 93 setRanges(const std::vector<basegfx::B2DRange> & rNew)94 void OverlayRangesOutline::setRanges(const std::vector< basegfx::B2DRange >& rNew) 95 { 96 if(rNew != maRanges) 97 { 98 maRanges = rNew; 99 objectChange(); 100 } 101 } 102 } // end of namespace sw::overlay 103 104 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 105