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