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/lineattribute.hxx>
28*b1cdbd2cSJim Jagielski #include <basegfx/color/bcolor.hxx>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski namespace drawinglayer
33*b1cdbd2cSJim Jagielski {
34*b1cdbd2cSJim Jagielski 	namespace attribute
35*b1cdbd2cSJim Jagielski 	{
36*b1cdbd2cSJim Jagielski 		class ImpLineAttribute
37*b1cdbd2cSJim Jagielski 		{
38*b1cdbd2cSJim Jagielski 		public:
39*b1cdbd2cSJim Jagielski 			// refcounter
40*b1cdbd2cSJim Jagielski 			sal_uInt32								mnRefCount;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski             // data definitions
43*b1cdbd2cSJim Jagielski 			basegfx::BColor							maColor;				// color
44*b1cdbd2cSJim Jagielski 			double									mfWidth;				// absolute line width
45*b1cdbd2cSJim Jagielski 			basegfx::B2DLineJoin					meLineJoin;				// type of LineJoin
46*b1cdbd2cSJim Jagielski             com::sun::star::drawing::LineCap        meLineCap;              // BUTT, ROUND, or SQUARE
47*b1cdbd2cSJim Jagielski 
ImpLineAttribute(const basegfx::BColor & rColor,double fWidth,basegfx::B2DLineJoin aB2DLineJoin,com::sun::star::drawing::LineCap aLineCap)48*b1cdbd2cSJim Jagielski 			ImpLineAttribute(
49*b1cdbd2cSJim Jagielski                 const basegfx::BColor& rColor,
50*b1cdbd2cSJim Jagielski 				double fWidth,
51*b1cdbd2cSJim Jagielski 				basegfx::B2DLineJoin aB2DLineJoin,
52*b1cdbd2cSJim Jagielski                 com::sun::star::drawing::LineCap aLineCap)
53*b1cdbd2cSJim Jagielski 			:	mnRefCount(0),
54*b1cdbd2cSJim Jagielski                 maColor(rColor),
55*b1cdbd2cSJim Jagielski                 mfWidth(fWidth),
56*b1cdbd2cSJim Jagielski                 meLineJoin(aB2DLineJoin),
57*b1cdbd2cSJim Jagielski                 meLineCap(aLineCap)
58*b1cdbd2cSJim Jagielski 			{
59*b1cdbd2cSJim Jagielski 			}
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski 			// data read access
getColor() const62*b1cdbd2cSJim Jagielski 			const basegfx::BColor& getColor() const { return maColor; }
getWidth() const63*b1cdbd2cSJim Jagielski 			double getWidth() const { return mfWidth; }
getLineJoin() const64*b1cdbd2cSJim Jagielski 			basegfx::B2DLineJoin getLineJoin() const { return meLineJoin; }
getLineCap() const65*b1cdbd2cSJim Jagielski             com::sun::star::drawing::LineCap getLineCap() const { return meLineCap; }
66*b1cdbd2cSJim Jagielski 
operator ==(const ImpLineAttribute & rCandidate) const67*b1cdbd2cSJim Jagielski 			bool operator==(const ImpLineAttribute& rCandidate) const
68*b1cdbd2cSJim Jagielski 			{
69*b1cdbd2cSJim Jagielski 				return (getColor() == rCandidate.getColor()
70*b1cdbd2cSJim Jagielski 					&& getWidth() == rCandidate.getWidth()
71*b1cdbd2cSJim Jagielski 					&& getLineJoin() == rCandidate.getLineJoin()
72*b1cdbd2cSJim Jagielski                     && getLineCap() == rCandidate.getLineCap());
73*b1cdbd2cSJim Jagielski 			}
74*b1cdbd2cSJim Jagielski 
get_global_default()75*b1cdbd2cSJim Jagielski             static ImpLineAttribute* get_global_default()
76*b1cdbd2cSJim Jagielski             {
77*b1cdbd2cSJim Jagielski                 static ImpLineAttribute* pDefault = 0;
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski                 if(!pDefault)
80*b1cdbd2cSJim Jagielski                 {
81*b1cdbd2cSJim Jagielski                     pDefault = new ImpLineAttribute(
82*b1cdbd2cSJim Jagielski                         basegfx::BColor(),
83*b1cdbd2cSJim Jagielski                         0.0,
84*b1cdbd2cSJim Jagielski                         basegfx::B2DLINEJOIN_ROUND,
85*b1cdbd2cSJim Jagielski                         com::sun::star::drawing::LineCap_BUTT);
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski                     // never delete; start with RefCount 1, not 0
88*b1cdbd2cSJim Jagielski     			    pDefault->mnRefCount++;
89*b1cdbd2cSJim Jagielski                 }
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski                 return pDefault;
92*b1cdbd2cSJim Jagielski             }
93*b1cdbd2cSJim Jagielski 		};
94*b1cdbd2cSJim Jagielski 
LineAttribute(const basegfx::BColor & rColor,double fWidth,basegfx::B2DLineJoin aB2DLineJoin,com::sun::star::drawing::LineCap aLineCap)95*b1cdbd2cSJim Jagielski         LineAttribute::LineAttribute(
96*b1cdbd2cSJim Jagielski             const basegfx::BColor& rColor,
97*b1cdbd2cSJim Jagielski 			double fWidth,
98*b1cdbd2cSJim Jagielski 			basegfx::B2DLineJoin aB2DLineJoin,
99*b1cdbd2cSJim Jagielski             com::sun::star::drawing::LineCap aLineCap)
100*b1cdbd2cSJim Jagielski 		:	mpLineAttribute(
101*b1cdbd2cSJim Jagielski                 new ImpLineAttribute(
102*b1cdbd2cSJim Jagielski                     rColor,
103*b1cdbd2cSJim Jagielski                     fWidth,
104*b1cdbd2cSJim Jagielski                     aB2DLineJoin,
105*b1cdbd2cSJim Jagielski                     aLineCap))
106*b1cdbd2cSJim Jagielski 		{
107*b1cdbd2cSJim Jagielski 		}
108*b1cdbd2cSJim Jagielski 
LineAttribute()109*b1cdbd2cSJim Jagielski 		LineAttribute::LineAttribute()
110*b1cdbd2cSJim Jagielski         :	mpLineAttribute(ImpLineAttribute::get_global_default())
111*b1cdbd2cSJim Jagielski 		{
112*b1cdbd2cSJim Jagielski 			mpLineAttribute->mnRefCount++;
113*b1cdbd2cSJim Jagielski 		}
114*b1cdbd2cSJim Jagielski 
LineAttribute(const LineAttribute & rCandidate)115*b1cdbd2cSJim Jagielski         LineAttribute::LineAttribute(const LineAttribute& rCandidate)
116*b1cdbd2cSJim Jagielski 		:	mpLineAttribute(rCandidate.mpLineAttribute)
117*b1cdbd2cSJim Jagielski 		{
118*b1cdbd2cSJim Jagielski 			mpLineAttribute->mnRefCount++;
119*b1cdbd2cSJim Jagielski 		}
120*b1cdbd2cSJim Jagielski 
~LineAttribute()121*b1cdbd2cSJim Jagielski 		LineAttribute::~LineAttribute()
122*b1cdbd2cSJim Jagielski 		{
123*b1cdbd2cSJim Jagielski 			if(mpLineAttribute->mnRefCount)
124*b1cdbd2cSJim Jagielski 			{
125*b1cdbd2cSJim Jagielski 				mpLineAttribute->mnRefCount--;
126*b1cdbd2cSJim Jagielski 			}
127*b1cdbd2cSJim Jagielski 			else
128*b1cdbd2cSJim Jagielski 			{
129*b1cdbd2cSJim Jagielski 				delete mpLineAttribute;
130*b1cdbd2cSJim Jagielski 			}
131*b1cdbd2cSJim Jagielski 		}
132*b1cdbd2cSJim Jagielski 
isDefault() const133*b1cdbd2cSJim Jagielski         bool LineAttribute::isDefault() const
134*b1cdbd2cSJim Jagielski         {
135*b1cdbd2cSJim Jagielski             return mpLineAttribute == ImpLineAttribute::get_global_default();
136*b1cdbd2cSJim Jagielski         }
137*b1cdbd2cSJim Jagielski 
operator =(const LineAttribute & rCandidate)138*b1cdbd2cSJim Jagielski         LineAttribute& LineAttribute::operator=(const LineAttribute& rCandidate)
139*b1cdbd2cSJim Jagielski 		{
140*b1cdbd2cSJim Jagielski 			if(rCandidate.mpLineAttribute != mpLineAttribute)
141*b1cdbd2cSJim Jagielski 			{
142*b1cdbd2cSJim Jagielski 				if(mpLineAttribute->mnRefCount)
143*b1cdbd2cSJim Jagielski 				{
144*b1cdbd2cSJim Jagielski 					mpLineAttribute->mnRefCount--;
145*b1cdbd2cSJim Jagielski 				}
146*b1cdbd2cSJim Jagielski 				else
147*b1cdbd2cSJim Jagielski 				{
148*b1cdbd2cSJim Jagielski 					delete mpLineAttribute;
149*b1cdbd2cSJim Jagielski 				}
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 				mpLineAttribute = rCandidate.mpLineAttribute;
152*b1cdbd2cSJim Jagielski 				mpLineAttribute->mnRefCount++;
153*b1cdbd2cSJim Jagielski 			}
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 			return *this;
156*b1cdbd2cSJim Jagielski 		}
157*b1cdbd2cSJim Jagielski 
operator ==(const LineAttribute & rCandidate) const158*b1cdbd2cSJim Jagielski 		bool LineAttribute::operator==(const LineAttribute& rCandidate) const
159*b1cdbd2cSJim Jagielski 		{
160*b1cdbd2cSJim Jagielski 			if(rCandidate.mpLineAttribute == mpLineAttribute)
161*b1cdbd2cSJim Jagielski 			{
162*b1cdbd2cSJim Jagielski 				return true;
163*b1cdbd2cSJim Jagielski 			}
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 			if(rCandidate.isDefault() != isDefault())
166*b1cdbd2cSJim Jagielski 			{
167*b1cdbd2cSJim Jagielski 				return false;
168*b1cdbd2cSJim Jagielski 			}
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 			return (*rCandidate.mpLineAttribute == *mpLineAttribute);
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 
getColor() const173*b1cdbd2cSJim Jagielski 		const basegfx::BColor& LineAttribute::getColor() const
174*b1cdbd2cSJim Jagielski 		{
175*b1cdbd2cSJim Jagielski 			return mpLineAttribute->getColor();
176*b1cdbd2cSJim Jagielski 		}
177*b1cdbd2cSJim Jagielski 
getWidth() const178*b1cdbd2cSJim Jagielski 		double LineAttribute::getWidth() const
179*b1cdbd2cSJim Jagielski         {
180*b1cdbd2cSJim Jagielski             return mpLineAttribute->getWidth();
181*b1cdbd2cSJim Jagielski         }
182*b1cdbd2cSJim Jagielski 
getLineJoin() const183*b1cdbd2cSJim Jagielski         basegfx::B2DLineJoin LineAttribute::getLineJoin() const
184*b1cdbd2cSJim Jagielski         {
185*b1cdbd2cSJim Jagielski             return mpLineAttribute->getLineJoin();
186*b1cdbd2cSJim Jagielski         }
187*b1cdbd2cSJim Jagielski 
getLineCap() const188*b1cdbd2cSJim Jagielski         com::sun::star::drawing::LineCap LineAttribute::getLineCap() const
189*b1cdbd2cSJim Jagielski         {
190*b1cdbd2cSJim Jagielski             return mpLineAttribute->getLineCap();
191*b1cdbd2cSJim Jagielski         }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski     } // end of namespace attribute
194*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
197*b1cdbd2cSJim Jagielski // eof
198