xref: /AOO41X/main/drawinglayer/source/attribute/linestartendattribute.cxx (revision 464702f4578bd67db020a330afd07883930c5e07)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_drawinglayer.hxx"
26 
27 #include <drawinglayer/attribute/linestartendattribute.hxx>
28 #include <basegfx/polygon/b2dpolygon.hxx>
29 #include <basegfx/polygon/b2dpolypolygon.hxx>
30 
31 //////////////////////////////////////////////////////////////////////////////
32 
33 namespace drawinglayer
34 {
35     namespace attribute
36     {
37         class ImpLineStartEndAttribute
38         {
39         public:
40             // refcounter
41             sal_uInt32                              mnRefCount;
42 
43             // data definitions
44             double                                  mfWidth;                // absolute line StartEndGeometry base width
45             basegfx::B2DPolyPolygon                 maPolyPolygon;          // the StartEndGeometry PolyPolygon
46 
47             // bitfield
48             unsigned                                mbCentered : 1;         // use centered to ineStart/End point?
49 
ImpLineStartEndAttribute(double fWidth,const basegfx::B2DPolyPolygon & rPolyPolygon,bool bCentered)50             ImpLineStartEndAttribute(
51                 double fWidth,
52                 const basegfx::B2DPolyPolygon& rPolyPolygon,
53                 bool bCentered)
54             :   mnRefCount(0),
55                 mfWidth(fWidth),
56                 maPolyPolygon(rPolyPolygon),
57                 mbCentered(bCentered)
58             {
59             }
60 
61             // data read access
getWidth() const62             double getWidth() const { return mfWidth; }
getB2DPolyPolygon() const63             const basegfx::B2DPolyPolygon& getB2DPolyPolygon() const { return maPolyPolygon; }
isCentered() const64             bool isCentered() const { return mbCentered; }
65 
operator ==(const ImpLineStartEndAttribute & rCandidate) const66             bool operator==(const ImpLineStartEndAttribute& rCandidate) const
67             {
68                 return (basegfx::fTools::equal(getWidth(), rCandidate.getWidth())
69                     && getB2DPolyPolygon() == rCandidate.getB2DPolyPolygon()
70                     && isCentered() == rCandidate.isCentered());
71             }
72 
get_global_default()73             static ImpLineStartEndAttribute* get_global_default()
74             {
75                 static ImpLineStartEndAttribute* pDefault = 0;
76 
77                 if(!pDefault)
78                 {
79                     pDefault = new ImpLineStartEndAttribute(
80                         0.0,
81                         basegfx::B2DPolyPolygon(),
82                         false);
83 
84                     // never delete; start with RefCount 1, not 0
85                     pDefault->mnRefCount++;
86                 }
87 
88                 return pDefault;
89             }
90         };
91 
LineStartEndAttribute(double fWidth,const basegfx::B2DPolyPolygon & rPolyPolygon,bool bCentered)92         LineStartEndAttribute::LineStartEndAttribute(
93             double fWidth,
94             const basegfx::B2DPolyPolygon& rPolyPolygon,
95             bool bCentered)
96         :   mpLineStartEndAttribute(new ImpLineStartEndAttribute(
97                 fWidth, rPolyPolygon, bCentered))
98         {
99         }
100 
LineStartEndAttribute()101         LineStartEndAttribute::LineStartEndAttribute()
102         :   mpLineStartEndAttribute(ImpLineStartEndAttribute::get_global_default())
103         {
104             mpLineStartEndAttribute->mnRefCount++;
105         }
106 
LineStartEndAttribute(const LineStartEndAttribute & rCandidate)107         LineStartEndAttribute::LineStartEndAttribute(const LineStartEndAttribute& rCandidate)
108         :   mpLineStartEndAttribute(rCandidate.mpLineStartEndAttribute)
109         {
110             mpLineStartEndAttribute->mnRefCount++;
111         }
112 
~LineStartEndAttribute()113         LineStartEndAttribute::~LineStartEndAttribute()
114         {
115             if(mpLineStartEndAttribute->mnRefCount)
116             {
117                 mpLineStartEndAttribute->mnRefCount--;
118             }
119             else
120             {
121                 delete mpLineStartEndAttribute;
122             }
123         }
124 
isDefault() const125         bool LineStartEndAttribute::isDefault() const
126         {
127             return mpLineStartEndAttribute == ImpLineStartEndAttribute::get_global_default();
128         }
129 
operator =(const LineStartEndAttribute & rCandidate)130         LineStartEndAttribute& LineStartEndAttribute::operator=(const LineStartEndAttribute& rCandidate)
131         {
132             if(rCandidate.mpLineStartEndAttribute != mpLineStartEndAttribute)
133             {
134                 if(mpLineStartEndAttribute->mnRefCount)
135                 {
136                     mpLineStartEndAttribute->mnRefCount--;
137                 }
138                 else
139                 {
140                     delete mpLineStartEndAttribute;
141                 }
142 
143                 mpLineStartEndAttribute = rCandidate.mpLineStartEndAttribute;
144                 mpLineStartEndAttribute->mnRefCount++;
145             }
146 
147             return *this;
148         }
149 
operator ==(const LineStartEndAttribute & rCandidate) const150         bool LineStartEndAttribute::operator==(const LineStartEndAttribute& rCandidate) const
151         {
152             if(rCandidate.mpLineStartEndAttribute == mpLineStartEndAttribute)
153             {
154                 return true;
155             }
156 
157             if(rCandidate.isDefault() != isDefault())
158             {
159                 return false;
160             }
161 
162             return (*rCandidate.mpLineStartEndAttribute == *mpLineStartEndAttribute);
163         }
164 
getWidth() const165         double LineStartEndAttribute::getWidth() const
166         {
167             return mpLineStartEndAttribute->getWidth();
168         }
169 
getB2DPolyPolygon() const170         const basegfx::B2DPolyPolygon& LineStartEndAttribute::getB2DPolyPolygon() const
171         {
172             return mpLineStartEndAttribute->getB2DPolyPolygon();
173         }
174 
isCentered() const175         bool LineStartEndAttribute::isCentered() const
176         {
177             return mpLineStartEndAttribute->isCentered();
178         }
179 
isActive() const180         bool LineStartEndAttribute::isActive() const
181         {
182             return (0.0 != getWidth()
183                 && 0 != getB2DPolyPolygon().count()
184                 && 0 != getB2DPolyPolygon().getB2DPolygon(0).count());
185         }
186     } // end of namespace attribute
187 } // end of namespace drawinglayer
188 
189 //////////////////////////////////////////////////////////////////////////////
190 // eof
191