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 // MARKER(update_precomp.py): autogen include statement, do not remove
23*b1cdbd2cSJim Jagielski #include "precompiled_drawinglayer.hxx"
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #include <drawinglayer/attribute/fillhatchattribute.hxx>
26*b1cdbd2cSJim Jagielski #include <basegfx/color/bcolor.hxx>
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski namespace drawinglayer
31*b1cdbd2cSJim Jagielski {
32*b1cdbd2cSJim Jagielski 	namespace attribute
33*b1cdbd2cSJim Jagielski 	{
34*b1cdbd2cSJim Jagielski 		class ImpFillHatchAttribute
35*b1cdbd2cSJim Jagielski 		{
36*b1cdbd2cSJim Jagielski 		public:
37*b1cdbd2cSJim Jagielski 			// refcounter
38*b1cdbd2cSJim Jagielski 			sal_uInt32								mnRefCount;
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski             // data definitions
41*b1cdbd2cSJim Jagielski 			HatchStyle								meStyle;
42*b1cdbd2cSJim Jagielski 			double									mfDistance;
43*b1cdbd2cSJim Jagielski 			double									mfAngle;
44*b1cdbd2cSJim Jagielski 			basegfx::BColor							maColor;
45*b1cdbd2cSJim Jagielski             sal_uInt32                              mnMinimalDiscreteDistance;
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski 			// bitfield
48*b1cdbd2cSJim Jagielski 			unsigned								mbFillBackground : 1;
49*b1cdbd2cSJim Jagielski 
ImpFillHatchAttribute(HatchStyle eStyle,double fDistance,double fAngle,const basegfx::BColor & rColor,sal_uInt32 nMinimalDiscreteDistance,bool bFillBackground)50*b1cdbd2cSJim Jagielski 			ImpFillHatchAttribute(
51*b1cdbd2cSJim Jagielski                 HatchStyle eStyle,
52*b1cdbd2cSJim Jagielski                 double fDistance,
53*b1cdbd2cSJim Jagielski                 double fAngle,
54*b1cdbd2cSJim Jagielski                 const basegfx::BColor& rColor,
55*b1cdbd2cSJim Jagielski                 sal_uInt32 nMinimalDiscreteDistance,
56*b1cdbd2cSJim Jagielski                 bool bFillBackground)
57*b1cdbd2cSJim Jagielski 			:	mnRefCount(0),
58*b1cdbd2cSJim Jagielski 			    meStyle(eStyle),
59*b1cdbd2cSJim Jagielski 		    	mfDistance(fDistance),
60*b1cdbd2cSJim Jagielski 			    mfAngle(fAngle),
61*b1cdbd2cSJim Jagielski 			    maColor(rColor),
62*b1cdbd2cSJim Jagielski                 mnMinimalDiscreteDistance(nMinimalDiscreteDistance),
63*b1cdbd2cSJim Jagielski 			    mbFillBackground(bFillBackground)
64*b1cdbd2cSJim Jagielski             {
65*b1cdbd2cSJim Jagielski             }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 			// data read access
getStyle() const68*b1cdbd2cSJim Jagielski 			HatchStyle getStyle() const { return meStyle; }
getDistance() const69*b1cdbd2cSJim Jagielski 			double getDistance() const { return mfDistance; }
getAngle() const70*b1cdbd2cSJim Jagielski 			double getAngle() const { return mfAngle; }
getColor() const71*b1cdbd2cSJim Jagielski 			const basegfx::BColor& getColor() const { return maColor; }
getMinimalDiscreteDistance() const72*b1cdbd2cSJim Jagielski             sal_uInt32 getMinimalDiscreteDistance() const { return mnMinimalDiscreteDistance; }
isFillBackground() const73*b1cdbd2cSJim Jagielski 			bool isFillBackground() const { return mbFillBackground; }
74*b1cdbd2cSJim Jagielski 
operator ==(const ImpFillHatchAttribute & rCandidate) const75*b1cdbd2cSJim Jagielski 			bool operator==(const ImpFillHatchAttribute& rCandidate) const
76*b1cdbd2cSJim Jagielski             {
77*b1cdbd2cSJim Jagielski 			    return (getStyle() == rCandidate.getStyle()
78*b1cdbd2cSJim Jagielski                     && getDistance() == rCandidate.getDistance()
79*b1cdbd2cSJim Jagielski 				    && getAngle() == rCandidate.getAngle()
80*b1cdbd2cSJim Jagielski 				    && getColor() == rCandidate.getColor()
81*b1cdbd2cSJim Jagielski                     && getMinimalDiscreteDistance() == rCandidate.getMinimalDiscreteDistance()
82*b1cdbd2cSJim Jagielski 				    && isFillBackground() == rCandidate.isFillBackground());
83*b1cdbd2cSJim Jagielski             }
84*b1cdbd2cSJim Jagielski 
get_global_default()85*b1cdbd2cSJim Jagielski             static ImpFillHatchAttribute* get_global_default()
86*b1cdbd2cSJim Jagielski             {
87*b1cdbd2cSJim Jagielski                 static ImpFillHatchAttribute* pDefault = 0;
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski                 if(!pDefault)
90*b1cdbd2cSJim Jagielski                 {
91*b1cdbd2cSJim Jagielski                     pDefault = new ImpFillHatchAttribute(
92*b1cdbd2cSJim Jagielski                         HATCHSTYLE_SINGLE,
93*b1cdbd2cSJim Jagielski                         0.0, 0.0,
94*b1cdbd2cSJim Jagielski                         basegfx::BColor(),
95*b1cdbd2cSJim Jagielski                         3, // same as VCL
96*b1cdbd2cSJim Jagielski                         false);
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski                     // never delete; start with RefCount 1, not 0
99*b1cdbd2cSJim Jagielski     			    pDefault->mnRefCount++;
100*b1cdbd2cSJim Jagielski                 }
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski                 return pDefault;
103*b1cdbd2cSJim Jagielski             }
104*b1cdbd2cSJim Jagielski 		};
105*b1cdbd2cSJim Jagielski 
FillHatchAttribute(HatchStyle eStyle,double fDistance,double fAngle,const basegfx::BColor & rColor,sal_uInt32 nMinimalDiscreteDistance,bool bFillBackground)106*b1cdbd2cSJim Jagielski         FillHatchAttribute::FillHatchAttribute(
107*b1cdbd2cSJim Jagielski             HatchStyle eStyle,
108*b1cdbd2cSJim Jagielski             double fDistance,
109*b1cdbd2cSJim Jagielski             double fAngle,
110*b1cdbd2cSJim Jagielski             const basegfx::BColor& rColor,
111*b1cdbd2cSJim Jagielski             sal_uInt32 nMinimalDiscreteDistance,
112*b1cdbd2cSJim Jagielski             bool bFillBackground)
113*b1cdbd2cSJim Jagielski 		:	mpFillHatchAttribute(
114*b1cdbd2cSJim Jagielski                 new ImpFillHatchAttribute(
115*b1cdbd2cSJim Jagielski                     eStyle,
116*b1cdbd2cSJim Jagielski                     fDistance,
117*b1cdbd2cSJim Jagielski                     fAngle,
118*b1cdbd2cSJim Jagielski                     rColor,
119*b1cdbd2cSJim Jagielski                     nMinimalDiscreteDistance,
120*b1cdbd2cSJim Jagielski                     bFillBackground))
121*b1cdbd2cSJim Jagielski 		{
122*b1cdbd2cSJim Jagielski 		}
123*b1cdbd2cSJim Jagielski 
FillHatchAttribute()124*b1cdbd2cSJim Jagielski 		FillHatchAttribute::FillHatchAttribute()
125*b1cdbd2cSJim Jagielski         :	mpFillHatchAttribute(ImpFillHatchAttribute::get_global_default())
126*b1cdbd2cSJim Jagielski 		{
127*b1cdbd2cSJim Jagielski 			mpFillHatchAttribute->mnRefCount++;
128*b1cdbd2cSJim Jagielski 		}
129*b1cdbd2cSJim Jagielski 
FillHatchAttribute(const FillHatchAttribute & rCandidate)130*b1cdbd2cSJim Jagielski         FillHatchAttribute::FillHatchAttribute(const FillHatchAttribute& rCandidate)
131*b1cdbd2cSJim Jagielski 		:	mpFillHatchAttribute(rCandidate.mpFillHatchAttribute)
132*b1cdbd2cSJim Jagielski 		{
133*b1cdbd2cSJim Jagielski 			mpFillHatchAttribute->mnRefCount++;
134*b1cdbd2cSJim Jagielski 		}
135*b1cdbd2cSJim Jagielski 
~FillHatchAttribute()136*b1cdbd2cSJim Jagielski 		FillHatchAttribute::~FillHatchAttribute()
137*b1cdbd2cSJim Jagielski 		{
138*b1cdbd2cSJim Jagielski 			if(mpFillHatchAttribute->mnRefCount)
139*b1cdbd2cSJim Jagielski 			{
140*b1cdbd2cSJim Jagielski 				mpFillHatchAttribute->mnRefCount--;
141*b1cdbd2cSJim Jagielski 			}
142*b1cdbd2cSJim Jagielski 			else
143*b1cdbd2cSJim Jagielski 			{
144*b1cdbd2cSJim Jagielski 				delete mpFillHatchAttribute;
145*b1cdbd2cSJim Jagielski 			}
146*b1cdbd2cSJim Jagielski 		}
147*b1cdbd2cSJim Jagielski 
isDefault() const148*b1cdbd2cSJim Jagielski         bool FillHatchAttribute::isDefault() const
149*b1cdbd2cSJim Jagielski         {
150*b1cdbd2cSJim Jagielski             return mpFillHatchAttribute == ImpFillHatchAttribute::get_global_default();
151*b1cdbd2cSJim Jagielski         }
152*b1cdbd2cSJim Jagielski 
operator =(const FillHatchAttribute & rCandidate)153*b1cdbd2cSJim Jagielski         FillHatchAttribute& FillHatchAttribute::operator=(const FillHatchAttribute& rCandidate)
154*b1cdbd2cSJim Jagielski 		{
155*b1cdbd2cSJim Jagielski 			if(rCandidate.mpFillHatchAttribute != mpFillHatchAttribute)
156*b1cdbd2cSJim Jagielski 			{
157*b1cdbd2cSJim Jagielski 				if(mpFillHatchAttribute->mnRefCount)
158*b1cdbd2cSJim Jagielski 				{
159*b1cdbd2cSJim Jagielski 					mpFillHatchAttribute->mnRefCount--;
160*b1cdbd2cSJim Jagielski 				}
161*b1cdbd2cSJim Jagielski 				else
162*b1cdbd2cSJim Jagielski 				{
163*b1cdbd2cSJim Jagielski 					delete mpFillHatchAttribute;
164*b1cdbd2cSJim Jagielski 				}
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski 				mpFillHatchAttribute = rCandidate.mpFillHatchAttribute;
167*b1cdbd2cSJim Jagielski 				mpFillHatchAttribute->mnRefCount++;
168*b1cdbd2cSJim Jagielski 			}
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 			return *this;
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 
operator ==(const FillHatchAttribute & rCandidate) const173*b1cdbd2cSJim Jagielski 		bool FillHatchAttribute::operator==(const FillHatchAttribute& rCandidate) const
174*b1cdbd2cSJim Jagielski 		{
175*b1cdbd2cSJim Jagielski 			if(rCandidate.mpFillHatchAttribute == mpFillHatchAttribute)
176*b1cdbd2cSJim Jagielski 			{
177*b1cdbd2cSJim Jagielski 				return true;
178*b1cdbd2cSJim Jagielski 			}
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 			if(rCandidate.isDefault() != isDefault())
181*b1cdbd2cSJim Jagielski 			{
182*b1cdbd2cSJim Jagielski 				return false;
183*b1cdbd2cSJim Jagielski 			}
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 			return (*rCandidate.mpFillHatchAttribute == *mpFillHatchAttribute);
186*b1cdbd2cSJim Jagielski 		}
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 		// data read access
getStyle() const189*b1cdbd2cSJim Jagielski 		HatchStyle FillHatchAttribute::getStyle() const
190*b1cdbd2cSJim Jagielski         {
191*b1cdbd2cSJim Jagielski             return mpFillHatchAttribute->getStyle();
192*b1cdbd2cSJim Jagielski         }
193*b1cdbd2cSJim Jagielski 
getDistance() const194*b1cdbd2cSJim Jagielski 		double FillHatchAttribute::getDistance() const
195*b1cdbd2cSJim Jagielski         {
196*b1cdbd2cSJim Jagielski             return mpFillHatchAttribute->getDistance();
197*b1cdbd2cSJim Jagielski         }
198*b1cdbd2cSJim Jagielski 
getAngle() const199*b1cdbd2cSJim Jagielski 		double FillHatchAttribute::getAngle() const
200*b1cdbd2cSJim Jagielski         {
201*b1cdbd2cSJim Jagielski             return mpFillHatchAttribute->getAngle();
202*b1cdbd2cSJim Jagielski         }
203*b1cdbd2cSJim Jagielski 
getColor() const204*b1cdbd2cSJim Jagielski 		const basegfx::BColor& FillHatchAttribute::getColor() const
205*b1cdbd2cSJim Jagielski         {
206*b1cdbd2cSJim Jagielski             return mpFillHatchAttribute->getColor();
207*b1cdbd2cSJim Jagielski         }
208*b1cdbd2cSJim Jagielski 
getMinimalDiscreteDistance() const209*b1cdbd2cSJim Jagielski         sal_uInt32 FillHatchAttribute::getMinimalDiscreteDistance() const
210*b1cdbd2cSJim Jagielski         {
211*b1cdbd2cSJim Jagielski             return mpFillHatchAttribute->getMinimalDiscreteDistance();
212*b1cdbd2cSJim Jagielski         }
213*b1cdbd2cSJim Jagielski 
isFillBackground() const214*b1cdbd2cSJim Jagielski 		bool FillHatchAttribute::isFillBackground() const
215*b1cdbd2cSJim Jagielski         {
216*b1cdbd2cSJim Jagielski             return mpFillHatchAttribute->isFillBackground();
217*b1cdbd2cSJim Jagielski         }
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski     } // end of namespace attribute
220*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
223*b1cdbd2cSJim Jagielski // eof
224