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