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 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <drawinglayer/attribute/linestartendattribute.hxx>
28*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
29*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygon.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski namespace drawinglayer
34*b1cdbd2cSJim Jagielski {
35*b1cdbd2cSJim Jagielski 	namespace attribute
36*b1cdbd2cSJim Jagielski 	{
37*b1cdbd2cSJim Jagielski 		class ImpLineStartEndAttribute
38*b1cdbd2cSJim Jagielski 		{
39*b1cdbd2cSJim Jagielski 		public:
40*b1cdbd2cSJim Jagielski 			// refcounter
41*b1cdbd2cSJim Jagielski 			sal_uInt32								mnRefCount;
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski             // data definitions
44*b1cdbd2cSJim Jagielski 			double									mfWidth;				// absolute line StartEndGeometry base width
45*b1cdbd2cSJim Jagielski 			basegfx::B2DPolyPolygon					maPolyPolygon;			// the StartEndGeometry PolyPolygon
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 			// bitfield
48*b1cdbd2cSJim Jagielski 			unsigned								mbCentered : 1;			// use centered to ineStart/End point?
49*b1cdbd2cSJim Jagielski 
ImpLineStartEndAttribute(double fWidth,const basegfx::B2DPolyPolygon & rPolyPolygon,bool bCentered)50*b1cdbd2cSJim Jagielski 			ImpLineStartEndAttribute(
51*b1cdbd2cSJim Jagielski 				double fWidth,
52*b1cdbd2cSJim Jagielski 				const basegfx::B2DPolyPolygon& rPolyPolygon,
53*b1cdbd2cSJim Jagielski 				bool bCentered)
54*b1cdbd2cSJim Jagielski 			:	mnRefCount(0),
55*b1cdbd2cSJim Jagielski 				mfWidth(fWidth),
56*b1cdbd2cSJim Jagielski 				maPolyPolygon(rPolyPolygon),
57*b1cdbd2cSJim Jagielski 				mbCentered(bCentered)
58*b1cdbd2cSJim Jagielski 			{
59*b1cdbd2cSJim Jagielski 			}
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 			// data read access
getWidth() const62*b1cdbd2cSJim Jagielski 			double getWidth() const { return mfWidth; }
getB2DPolyPolygon() const63*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& getB2DPolyPolygon() const { return maPolyPolygon; }
isCentered() const64*b1cdbd2cSJim Jagielski 			bool isCentered() const { return mbCentered; }
65*b1cdbd2cSJim Jagielski 
operator ==(const ImpLineStartEndAttribute & rCandidate) const66*b1cdbd2cSJim Jagielski             bool operator==(const ImpLineStartEndAttribute& rCandidate) const
67*b1cdbd2cSJim Jagielski 			{
68*b1cdbd2cSJim Jagielski 				return (basegfx::fTools::equal(getWidth(), rCandidate.getWidth())
69*b1cdbd2cSJim Jagielski 					&& getB2DPolyPolygon() == rCandidate.getB2DPolyPolygon()
70*b1cdbd2cSJim Jagielski 					&& isCentered() == rCandidate.isCentered());
71*b1cdbd2cSJim Jagielski 			}
72*b1cdbd2cSJim Jagielski 
get_global_default()73*b1cdbd2cSJim Jagielski             static ImpLineStartEndAttribute* get_global_default()
74*b1cdbd2cSJim Jagielski             {
75*b1cdbd2cSJim Jagielski                 static ImpLineStartEndAttribute* pDefault = 0;
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski                 if(!pDefault)
78*b1cdbd2cSJim Jagielski                 {
79*b1cdbd2cSJim Jagielski                     pDefault = new ImpLineStartEndAttribute(
80*b1cdbd2cSJim Jagielski                         0.0,
81*b1cdbd2cSJim Jagielski                         basegfx::B2DPolyPolygon(),
82*b1cdbd2cSJim Jagielski                         false);
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski                     // never delete; start with RefCount 1, not 0
85*b1cdbd2cSJim Jagielski     			    pDefault->mnRefCount++;
86*b1cdbd2cSJim Jagielski                 }
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski                 return pDefault;
89*b1cdbd2cSJim Jagielski             }
90*b1cdbd2cSJim Jagielski         };
91*b1cdbd2cSJim Jagielski 
LineStartEndAttribute(double fWidth,const basegfx::B2DPolyPolygon & rPolyPolygon,bool bCentered)92*b1cdbd2cSJim Jagielski         LineStartEndAttribute::LineStartEndAttribute(
93*b1cdbd2cSJim Jagielski 			double fWidth,
94*b1cdbd2cSJim Jagielski 			const basegfx::B2DPolyPolygon& rPolyPolygon,
95*b1cdbd2cSJim Jagielski 			bool bCentered)
96*b1cdbd2cSJim Jagielski 		:	mpLineStartEndAttribute(new ImpLineStartEndAttribute(
97*b1cdbd2cSJim Jagielski                 fWidth, rPolyPolygon, bCentered))
98*b1cdbd2cSJim Jagielski 		{
99*b1cdbd2cSJim Jagielski 		}
100*b1cdbd2cSJim Jagielski 
LineStartEndAttribute()101*b1cdbd2cSJim Jagielski 		LineStartEndAttribute::LineStartEndAttribute()
102*b1cdbd2cSJim Jagielski         :	mpLineStartEndAttribute(ImpLineStartEndAttribute::get_global_default())
103*b1cdbd2cSJim Jagielski 		{
104*b1cdbd2cSJim Jagielski 			mpLineStartEndAttribute->mnRefCount++;
105*b1cdbd2cSJim Jagielski 		}
106*b1cdbd2cSJim Jagielski 
LineStartEndAttribute(const LineStartEndAttribute & rCandidate)107*b1cdbd2cSJim Jagielski         LineStartEndAttribute::LineStartEndAttribute(const LineStartEndAttribute& rCandidate)
108*b1cdbd2cSJim Jagielski 		:	mpLineStartEndAttribute(rCandidate.mpLineStartEndAttribute)
109*b1cdbd2cSJim Jagielski 		{
110*b1cdbd2cSJim Jagielski 			mpLineStartEndAttribute->mnRefCount++;
111*b1cdbd2cSJim Jagielski 		}
112*b1cdbd2cSJim Jagielski 
~LineStartEndAttribute()113*b1cdbd2cSJim Jagielski 		LineStartEndAttribute::~LineStartEndAttribute()
114*b1cdbd2cSJim Jagielski 		{
115*b1cdbd2cSJim Jagielski 			if(mpLineStartEndAttribute->mnRefCount)
116*b1cdbd2cSJim Jagielski 			{
117*b1cdbd2cSJim Jagielski 				mpLineStartEndAttribute->mnRefCount--;
118*b1cdbd2cSJim Jagielski 			}
119*b1cdbd2cSJim Jagielski 			else
120*b1cdbd2cSJim Jagielski 			{
121*b1cdbd2cSJim Jagielski 				delete mpLineStartEndAttribute;
122*b1cdbd2cSJim Jagielski 			}
123*b1cdbd2cSJim Jagielski 		}
124*b1cdbd2cSJim Jagielski 
isDefault() const125*b1cdbd2cSJim Jagielski         bool LineStartEndAttribute::isDefault() const
126*b1cdbd2cSJim Jagielski         {
127*b1cdbd2cSJim Jagielski             return mpLineStartEndAttribute == ImpLineStartEndAttribute::get_global_default();
128*b1cdbd2cSJim Jagielski         }
129*b1cdbd2cSJim Jagielski 
operator =(const LineStartEndAttribute & rCandidate)130*b1cdbd2cSJim Jagielski         LineStartEndAttribute& LineStartEndAttribute::operator=(const LineStartEndAttribute& rCandidate)
131*b1cdbd2cSJim Jagielski 		{
132*b1cdbd2cSJim Jagielski 			if(rCandidate.mpLineStartEndAttribute != mpLineStartEndAttribute)
133*b1cdbd2cSJim Jagielski 			{
134*b1cdbd2cSJim Jagielski 				if(mpLineStartEndAttribute->mnRefCount)
135*b1cdbd2cSJim Jagielski 				{
136*b1cdbd2cSJim Jagielski 					mpLineStartEndAttribute->mnRefCount--;
137*b1cdbd2cSJim Jagielski 				}
138*b1cdbd2cSJim Jagielski 				else
139*b1cdbd2cSJim Jagielski 				{
140*b1cdbd2cSJim Jagielski 					delete mpLineStartEndAttribute;
141*b1cdbd2cSJim Jagielski 				}
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 				mpLineStartEndAttribute = rCandidate.mpLineStartEndAttribute;
144*b1cdbd2cSJim Jagielski 				mpLineStartEndAttribute->mnRefCount++;
145*b1cdbd2cSJim Jagielski 			}
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 			return *this;
148*b1cdbd2cSJim Jagielski 		}
149*b1cdbd2cSJim Jagielski 
operator ==(const LineStartEndAttribute & rCandidate) const150*b1cdbd2cSJim Jagielski 		bool LineStartEndAttribute::operator==(const LineStartEndAttribute& rCandidate) const
151*b1cdbd2cSJim Jagielski 		{
152*b1cdbd2cSJim Jagielski 			if(rCandidate.mpLineStartEndAttribute == mpLineStartEndAttribute)
153*b1cdbd2cSJim Jagielski 			{
154*b1cdbd2cSJim Jagielski 				return true;
155*b1cdbd2cSJim Jagielski 			}
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 			if(rCandidate.isDefault() != isDefault())
158*b1cdbd2cSJim Jagielski 			{
159*b1cdbd2cSJim Jagielski 				return false;
160*b1cdbd2cSJim Jagielski 			}
161*b1cdbd2cSJim Jagielski 
162*b1cdbd2cSJim Jagielski 			return (*rCandidate.mpLineStartEndAttribute == *mpLineStartEndAttribute);
163*b1cdbd2cSJim Jagielski 		}
164*b1cdbd2cSJim Jagielski 
getWidth() const165*b1cdbd2cSJim Jagielski 		double LineStartEndAttribute::getWidth() const
166*b1cdbd2cSJim Jagielski         {
167*b1cdbd2cSJim Jagielski             return mpLineStartEndAttribute->getWidth();
168*b1cdbd2cSJim Jagielski         }
169*b1cdbd2cSJim Jagielski 
getB2DPolyPolygon() const170*b1cdbd2cSJim Jagielski 		const basegfx::B2DPolyPolygon& LineStartEndAttribute::getB2DPolyPolygon() const
171*b1cdbd2cSJim Jagielski         {
172*b1cdbd2cSJim Jagielski             return mpLineStartEndAttribute->getB2DPolyPolygon();
173*b1cdbd2cSJim Jagielski         }
174*b1cdbd2cSJim Jagielski 
isCentered() const175*b1cdbd2cSJim Jagielski 		bool LineStartEndAttribute::isCentered() const
176*b1cdbd2cSJim Jagielski         {
177*b1cdbd2cSJim Jagielski             return mpLineStartEndAttribute->isCentered();
178*b1cdbd2cSJim Jagielski         }
179*b1cdbd2cSJim Jagielski 
isActive() const180*b1cdbd2cSJim Jagielski         bool LineStartEndAttribute::isActive() const
181*b1cdbd2cSJim Jagielski         {
182*b1cdbd2cSJim Jagielski             return (0.0 != getWidth()
183*b1cdbd2cSJim Jagielski                 && 0 != getB2DPolyPolygon().count()
184*b1cdbd2cSJim Jagielski                 && 0 != getB2DPolyPolygon().getB2DPolygon(0).count());
185*b1cdbd2cSJim Jagielski         }
186*b1cdbd2cSJim Jagielski 	} // end of namespace attribute
187*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
190*b1cdbd2cSJim Jagielski // eof
191