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