1*69a74367SOliver-Rainer Wittmann /************************************************************** 2*69a74367SOliver-Rainer Wittmann * 3*69a74367SOliver-Rainer Wittmann * Licensed to the Apache Software Foundation (ASF) under one 4*69a74367SOliver-Rainer Wittmann * or more contributor license agreements. See the NOTICE file 5*69a74367SOliver-Rainer Wittmann * distributed with this work for additional information 6*69a74367SOliver-Rainer Wittmann * regarding copyright ownership. The ASF licenses this file 7*69a74367SOliver-Rainer Wittmann * to you under the Apache License, Version 2.0 (the 8*69a74367SOliver-Rainer Wittmann * "License"); you may not use this file except in compliance 9*69a74367SOliver-Rainer Wittmann * with the License. You may obtain a copy of the License at 10*69a74367SOliver-Rainer Wittmann * 11*69a74367SOliver-Rainer Wittmann * http://www.apache.org/licenses/LICENSE-2.0 12*69a74367SOliver-Rainer Wittmann * 13*69a74367SOliver-Rainer Wittmann * Unless required by applicable law or agreed to in writing, 14*69a74367SOliver-Rainer Wittmann * software distributed under the License is distributed on an 15*69a74367SOliver-Rainer Wittmann * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*69a74367SOliver-Rainer Wittmann * KIND, either express or implied. See the License for the 17*69a74367SOliver-Rainer Wittmann * specific language governing permissions and limitations 18*69a74367SOliver-Rainer Wittmann * under the License. 19*69a74367SOliver-Rainer Wittmann * 20*69a74367SOliver-Rainer Wittmann *************************************************************/ 21*69a74367SOliver-Rainer Wittmann 22*69a74367SOliver-Rainer Wittmann 23*69a74367SOliver-Rainer Wittmann // MARKER(update_precomp.py): autogen include statement, do not remove 24*69a74367SOliver-Rainer Wittmann #include "precompiled_sw.hxx" 25*69a74367SOliver-Rainer Wittmann 26*69a74367SOliver-Rainer Wittmann #include <overlayrangesoutline.hxx> 27*69a74367SOliver-Rainer Wittmann #include <svx/sdr/overlay/overlaymanager.hxx> 28*69a74367SOliver-Rainer Wittmann #include <basegfx/polygon/b2dpolygon.hxx> 29*69a74367SOliver-Rainer Wittmann #include <basegfx/polygon/b2dpolypolygon.hxx> 30*69a74367SOliver-Rainer Wittmann #include <basegfx/polygon/b2dpolygontools.hxx> 31*69a74367SOliver-Rainer Wittmann #include <basegfx/polygon/b2dpolypolygoncutter.hxx> 32*69a74367SOliver-Rainer Wittmann #include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx> 33*69a74367SOliver-Rainer Wittmann 34*69a74367SOliver-Rainer Wittmann ////////////////////////////////////////////////////////////////////////////// 35*69a74367SOliver-Rainer Wittmann 36*69a74367SOliver-Rainer Wittmann namespace 37*69a74367SOliver-Rainer Wittmann { 38*69a74367SOliver-Rainer Wittmann // combine ranges geometrically to a single, ORed polygon impCombineRangesToPolyPolygon(const std::vector<basegfx::B2DRange> & rRanges)39*69a74367SOliver-Rainer Wittmann basegfx::B2DPolyPolygon impCombineRangesToPolyPolygon(const std::vector< basegfx::B2DRange >& rRanges) 40*69a74367SOliver-Rainer Wittmann { 41*69a74367SOliver-Rainer Wittmann const sal_uInt32 nCount(rRanges.size()); 42*69a74367SOliver-Rainer Wittmann basegfx::B2DPolyPolygon aRetval; 43*69a74367SOliver-Rainer Wittmann 44*69a74367SOliver-Rainer Wittmann for(sal_uInt32 a(0); a < nCount; a++) 45*69a74367SOliver-Rainer Wittmann { 46*69a74367SOliver-Rainer Wittmann const basegfx::B2DPolygon aDiscretePolygon(basegfx::tools::createPolygonFromRect(rRanges[a])); 47*69a74367SOliver-Rainer Wittmann 48*69a74367SOliver-Rainer Wittmann if(0 == a) 49*69a74367SOliver-Rainer Wittmann { 50*69a74367SOliver-Rainer Wittmann aRetval.append(aDiscretePolygon); 51*69a74367SOliver-Rainer Wittmann } 52*69a74367SOliver-Rainer Wittmann else 53*69a74367SOliver-Rainer Wittmann { 54*69a74367SOliver-Rainer Wittmann aRetval = basegfx::tools::solvePolygonOperationOr(aRetval, basegfx::B2DPolyPolygon(aDiscretePolygon)); 55*69a74367SOliver-Rainer Wittmann } 56*69a74367SOliver-Rainer Wittmann } 57*69a74367SOliver-Rainer Wittmann 58*69a74367SOliver-Rainer Wittmann return aRetval; 59*69a74367SOliver-Rainer Wittmann } 60*69a74367SOliver-Rainer Wittmann } 61*69a74367SOliver-Rainer Wittmann 62*69a74367SOliver-Rainer Wittmann namespace sw 63*69a74367SOliver-Rainer Wittmann { 64*69a74367SOliver-Rainer Wittmann namespace overlay 65*69a74367SOliver-Rainer Wittmann { createOverlayObjectPrimitive2DSequence()66*69a74367SOliver-Rainer Wittmann drawinglayer::primitive2d::Primitive2DSequence OverlayRangesOutline::createOverlayObjectPrimitive2DSequence() 67*69a74367SOliver-Rainer Wittmann { 68*69a74367SOliver-Rainer Wittmann drawinglayer::primitive2d::Primitive2DSequence aRetval; 69*69a74367SOliver-Rainer Wittmann const sal_uInt32 nCount(getRanges().size()); 70*69a74367SOliver-Rainer Wittmann 71*69a74367SOliver-Rainer Wittmann if( nCount ) 72*69a74367SOliver-Rainer Wittmann { 73*69a74367SOliver-Rainer Wittmann const basegfx::BColor aRGBColor(getBaseColor().getBColor()); 74*69a74367SOliver-Rainer Wittmann const basegfx::B2DPolyPolygon aPolyPolygon(impCombineRangesToPolyPolygon(getRanges())); 75*69a74367SOliver-Rainer Wittmann const drawinglayer::primitive2d::Primitive2DReference aOutline( 76*69a74367SOliver-Rainer Wittmann new drawinglayer::primitive2d::PolyPolygonHairlinePrimitive2D( 77*69a74367SOliver-Rainer Wittmann aPolyPolygon, 78*69a74367SOliver-Rainer Wittmann aRGBColor)); 79*69a74367SOliver-Rainer Wittmann 80*69a74367SOliver-Rainer Wittmann aRetval.realloc(1); 81*69a74367SOliver-Rainer Wittmann aRetval[0] = aOutline; 82*69a74367SOliver-Rainer Wittmann } 83*69a74367SOliver-Rainer Wittmann 84*69a74367SOliver-Rainer Wittmann return aRetval; 85*69a74367SOliver-Rainer Wittmann } 86*69a74367SOliver-Rainer Wittmann OverlayRangesOutline(const Color & rColor,const std::vector<basegfx::B2DRange> & rRanges)87*69a74367SOliver-Rainer Wittmann OverlayRangesOutline::OverlayRangesOutline( 88*69a74367SOliver-Rainer Wittmann const Color& rColor, 89*69a74367SOliver-Rainer Wittmann const std::vector< basegfx::B2DRange >& rRanges ) 90*69a74367SOliver-Rainer Wittmann : sdr::overlay::OverlayObject(rColor) 91*69a74367SOliver-Rainer Wittmann , maRanges(rRanges) 92*69a74367SOliver-Rainer Wittmann { 93*69a74367SOliver-Rainer Wittmann // no AA for highlight overlays 94*69a74367SOliver-Rainer Wittmann allowAntiAliase(false); 95*69a74367SOliver-Rainer Wittmann } 96*69a74367SOliver-Rainer Wittmann ~OverlayRangesOutline()97*69a74367SOliver-Rainer Wittmann OverlayRangesOutline::~OverlayRangesOutline() 98*69a74367SOliver-Rainer Wittmann { 99*69a74367SOliver-Rainer Wittmann if( getOverlayManager() ) 100*69a74367SOliver-Rainer Wittmann { 101*69a74367SOliver-Rainer Wittmann getOverlayManager()->remove(*this); 102*69a74367SOliver-Rainer Wittmann } 103*69a74367SOliver-Rainer Wittmann } 104*69a74367SOliver-Rainer Wittmann setRanges(const std::vector<basegfx::B2DRange> & rNew)105*69a74367SOliver-Rainer Wittmann void OverlayRangesOutline::setRanges(const std::vector< basegfx::B2DRange >& rNew) 106*69a74367SOliver-Rainer Wittmann { 107*69a74367SOliver-Rainer Wittmann if(rNew != maRanges) 108*69a74367SOliver-Rainer Wittmann { 109*69a74367SOliver-Rainer Wittmann maRanges = rNew; 110*69a74367SOliver-Rainer Wittmann objectChange(); 111*69a74367SOliver-Rainer Wittmann } 112*69a74367SOliver-Rainer Wittmann } 113*69a74367SOliver-Rainer Wittmann } // end of namespace overlay 114*69a74367SOliver-Rainer Wittmann } // end of namespace sdr 115*69a74367SOliver-Rainer Wittmann 116*69a74367SOliver-Rainer Wittmann ////////////////////////////////////////////////////////////////////////////// 117*69a74367SOliver-Rainer Wittmann // eof 118