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/fillgradientattribute.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 ImpFillGradientAttribute
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 		    GradientStyle							meStyle;
42*b1cdbd2cSJim Jagielski 		    double									mfBorder;
43*b1cdbd2cSJim Jagielski 		    double									mfOffsetX;
44*b1cdbd2cSJim Jagielski 		    double									mfOffsetY;
45*b1cdbd2cSJim Jagielski 		    double									mfAngle;
46*b1cdbd2cSJim Jagielski             basegfx::BColor							maStartColor;
47*b1cdbd2cSJim Jagielski 		    basegfx::BColor							maEndColor;
48*b1cdbd2cSJim Jagielski 		    sal_uInt16								mnSteps;
49*b1cdbd2cSJim Jagielski 
ImpFillGradientAttribute(GradientStyle eStyle,double fBorder,double fOffsetX,double fOffsetY,double fAngle,const basegfx::BColor & rStartColor,const basegfx::BColor & rEndColor,sal_uInt16 nSteps)50*b1cdbd2cSJim Jagielski 		    ImpFillGradientAttribute(
51*b1cdbd2cSJim Jagielski 			    GradientStyle eStyle,
52*b1cdbd2cSJim Jagielski                 double fBorder,
53*b1cdbd2cSJim Jagielski                 double fOffsetX,
54*b1cdbd2cSJim Jagielski                 double fOffsetY,
55*b1cdbd2cSJim Jagielski                 double fAngle,
56*b1cdbd2cSJim Jagielski 			    const basegfx::BColor& rStartColor,
57*b1cdbd2cSJim Jagielski                 const basegfx::BColor& rEndColor,
58*b1cdbd2cSJim Jagielski                 sal_uInt16 nSteps)
59*b1cdbd2cSJim Jagielski 		    :	mnRefCount(0),
60*b1cdbd2cSJim Jagielski 		        meStyle(eStyle),
61*b1cdbd2cSJim Jagielski 		        mfBorder(fBorder),
62*b1cdbd2cSJim Jagielski 		        mfOffsetX(fOffsetX),
63*b1cdbd2cSJim Jagielski 		        mfOffsetY(fOffsetY),
64*b1cdbd2cSJim Jagielski 		        mfAngle(fAngle),
65*b1cdbd2cSJim Jagielski                 maStartColor(rStartColor),
66*b1cdbd2cSJim Jagielski 		        maEndColor(rEndColor),
67*b1cdbd2cSJim Jagielski 		        mnSteps(nSteps)
68*b1cdbd2cSJim Jagielski             {
69*b1cdbd2cSJim Jagielski             }
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski 		    // data read access
getStyle() const72*b1cdbd2cSJim Jagielski 		    GradientStyle getStyle() const { return meStyle; }
getBorder() const73*b1cdbd2cSJim Jagielski 		    double getBorder() const { return mfBorder; }
getOffsetX() const74*b1cdbd2cSJim Jagielski 		    double getOffsetX() const { return mfOffsetX; }
getOffsetY() const75*b1cdbd2cSJim Jagielski 		    double getOffsetY() const { return mfOffsetY; }
getAngle() const76*b1cdbd2cSJim Jagielski 		    double getAngle() const { return mfAngle; }
getStartColor() const77*b1cdbd2cSJim Jagielski 		    const basegfx::BColor& getStartColor() const { return maStartColor; }
getEndColor() const78*b1cdbd2cSJim Jagielski 		    const basegfx::BColor& getEndColor() const { return maEndColor; }
getSteps() const79*b1cdbd2cSJim Jagielski 		    sal_uInt16 getSteps() const { return mnSteps; }
80*b1cdbd2cSJim Jagielski 
operator ==(const ImpFillGradientAttribute & rCandidate) const81*b1cdbd2cSJim Jagielski 		    bool operator==(const ImpFillGradientAttribute& rCandidate) const
82*b1cdbd2cSJim Jagielski             {
83*b1cdbd2cSJim Jagielski 		        return (getStyle() == rCandidate.getStyle()
84*b1cdbd2cSJim Jagielski 			        && getBorder() == rCandidate.getBorder()
85*b1cdbd2cSJim Jagielski 			        && getOffsetX() == rCandidate.getOffsetX()
86*b1cdbd2cSJim Jagielski 			        && getOffsetY() == rCandidate.getOffsetY()
87*b1cdbd2cSJim Jagielski 			        && getAngle() == rCandidate.getAngle()
88*b1cdbd2cSJim Jagielski                     && getStartColor() == rCandidate.getStartColor()
89*b1cdbd2cSJim Jagielski 			        && getEndColor() == rCandidate.getEndColor()
90*b1cdbd2cSJim Jagielski 			        && getSteps() == rCandidate.getSteps());
91*b1cdbd2cSJim Jagielski             }
92*b1cdbd2cSJim Jagielski 
get_global_default()93*b1cdbd2cSJim Jagielski             static ImpFillGradientAttribute* get_global_default()
94*b1cdbd2cSJim Jagielski             {
95*b1cdbd2cSJim Jagielski                 static ImpFillGradientAttribute* pDefault = 0;
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski                 if(!pDefault)
98*b1cdbd2cSJim Jagielski                 {
99*b1cdbd2cSJim Jagielski                     pDefault = new ImpFillGradientAttribute(
100*b1cdbd2cSJim Jagielski                         GRADIENTSTYLE_LINEAR,
101*b1cdbd2cSJim Jagielski                         0.0, 0.0, 0.0, 0.0,
102*b1cdbd2cSJim Jagielski                         basegfx::BColor(),
103*b1cdbd2cSJim Jagielski                         basegfx::BColor(),
104*b1cdbd2cSJim Jagielski                         0);
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski                     // never delete; start with RefCount 1, not 0
107*b1cdbd2cSJim Jagielski     			    pDefault->mnRefCount++;
108*b1cdbd2cSJim Jagielski                 }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski                 return pDefault;
111*b1cdbd2cSJim Jagielski             }
112*b1cdbd2cSJim Jagielski 	    };
113*b1cdbd2cSJim Jagielski 
FillGradientAttribute(GradientStyle eStyle,double fBorder,double fOffsetX,double fOffsetY,double fAngle,const basegfx::BColor & rStartColor,const basegfx::BColor & rEndColor,sal_uInt16 nSteps)114*b1cdbd2cSJim Jagielski         FillGradientAttribute::FillGradientAttribute(
115*b1cdbd2cSJim Jagielski 			GradientStyle eStyle,
116*b1cdbd2cSJim Jagielski             double fBorder,
117*b1cdbd2cSJim Jagielski             double fOffsetX,
118*b1cdbd2cSJim Jagielski             double fOffsetY,
119*b1cdbd2cSJim Jagielski             double fAngle,
120*b1cdbd2cSJim Jagielski 			const basegfx::BColor& rStartColor,
121*b1cdbd2cSJim Jagielski             const basegfx::BColor& rEndColor,
122*b1cdbd2cSJim Jagielski             sal_uInt16 nSteps)
123*b1cdbd2cSJim Jagielski         :	mpFillGradientAttribute(new ImpFillGradientAttribute(
124*b1cdbd2cSJim Jagielski                 eStyle, fBorder, fOffsetX, fOffsetY, fAngle, rStartColor, rEndColor, nSteps))
125*b1cdbd2cSJim Jagielski 		{
126*b1cdbd2cSJim Jagielski 		}
127*b1cdbd2cSJim Jagielski 
FillGradientAttribute()128*b1cdbd2cSJim Jagielski 		FillGradientAttribute::FillGradientAttribute()
129*b1cdbd2cSJim Jagielski         :	mpFillGradientAttribute(ImpFillGradientAttribute::get_global_default())
130*b1cdbd2cSJim Jagielski 		{
131*b1cdbd2cSJim Jagielski 			mpFillGradientAttribute->mnRefCount++;
132*b1cdbd2cSJim Jagielski 		}
133*b1cdbd2cSJim Jagielski 
FillGradientAttribute(const FillGradientAttribute & rCandidate)134*b1cdbd2cSJim Jagielski 		FillGradientAttribute::FillGradientAttribute(const FillGradientAttribute& rCandidate)
135*b1cdbd2cSJim Jagielski 		:	mpFillGradientAttribute(rCandidate.mpFillGradientAttribute)
136*b1cdbd2cSJim Jagielski 		{
137*b1cdbd2cSJim Jagielski 			mpFillGradientAttribute->mnRefCount++;
138*b1cdbd2cSJim Jagielski 		}
139*b1cdbd2cSJim Jagielski 
~FillGradientAttribute()140*b1cdbd2cSJim Jagielski 		FillGradientAttribute::~FillGradientAttribute()
141*b1cdbd2cSJim Jagielski 		{
142*b1cdbd2cSJim Jagielski 			if(mpFillGradientAttribute->mnRefCount)
143*b1cdbd2cSJim Jagielski 			{
144*b1cdbd2cSJim Jagielski 				mpFillGradientAttribute->mnRefCount--;
145*b1cdbd2cSJim Jagielski 			}
146*b1cdbd2cSJim Jagielski 			else
147*b1cdbd2cSJim Jagielski 			{
148*b1cdbd2cSJim Jagielski 				delete mpFillGradientAttribute;
149*b1cdbd2cSJim Jagielski 			}
150*b1cdbd2cSJim Jagielski 		}
151*b1cdbd2cSJim Jagielski 
isDefault() const152*b1cdbd2cSJim Jagielski         bool FillGradientAttribute::isDefault() const
153*b1cdbd2cSJim Jagielski         {
154*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute == ImpFillGradientAttribute::get_global_default();
155*b1cdbd2cSJim Jagielski         }
156*b1cdbd2cSJim Jagielski 
operator =(const FillGradientAttribute & rCandidate)157*b1cdbd2cSJim Jagielski         FillGradientAttribute& FillGradientAttribute::operator=(const FillGradientAttribute& rCandidate)
158*b1cdbd2cSJim Jagielski 		{
159*b1cdbd2cSJim Jagielski 			if(rCandidate.mpFillGradientAttribute != mpFillGradientAttribute)
160*b1cdbd2cSJim Jagielski 			{
161*b1cdbd2cSJim Jagielski 				if(mpFillGradientAttribute->mnRefCount)
162*b1cdbd2cSJim Jagielski 				{
163*b1cdbd2cSJim Jagielski 					mpFillGradientAttribute->mnRefCount--;
164*b1cdbd2cSJim Jagielski 				}
165*b1cdbd2cSJim Jagielski 				else
166*b1cdbd2cSJim Jagielski 				{
167*b1cdbd2cSJim Jagielski 					delete mpFillGradientAttribute;
168*b1cdbd2cSJim Jagielski 				}
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 				mpFillGradientAttribute = rCandidate.mpFillGradientAttribute;
171*b1cdbd2cSJim Jagielski 				mpFillGradientAttribute->mnRefCount++;
172*b1cdbd2cSJim Jagielski 			}
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 			return *this;
175*b1cdbd2cSJim Jagielski 		}
176*b1cdbd2cSJim Jagielski 
operator ==(const FillGradientAttribute & rCandidate) const177*b1cdbd2cSJim Jagielski 		bool FillGradientAttribute::operator==(const FillGradientAttribute& rCandidate) const
178*b1cdbd2cSJim Jagielski 		{
179*b1cdbd2cSJim Jagielski 			if(rCandidate.mpFillGradientAttribute == mpFillGradientAttribute)
180*b1cdbd2cSJim Jagielski 			{
181*b1cdbd2cSJim Jagielski 				return true;
182*b1cdbd2cSJim Jagielski 			}
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 			if(rCandidate.isDefault() != isDefault())
185*b1cdbd2cSJim Jagielski 			{
186*b1cdbd2cSJim Jagielski 				return false;
187*b1cdbd2cSJim Jagielski 			}
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 			return (*rCandidate.mpFillGradientAttribute == *mpFillGradientAttribute);
190*b1cdbd2cSJim Jagielski 		}
191*b1cdbd2cSJim Jagielski 
getStartColor() const192*b1cdbd2cSJim Jagielski 		const basegfx::BColor& FillGradientAttribute::getStartColor() const
193*b1cdbd2cSJim Jagielski         {
194*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getStartColor();
195*b1cdbd2cSJim Jagielski         }
196*b1cdbd2cSJim Jagielski 
getEndColor() const197*b1cdbd2cSJim Jagielski 		const basegfx::BColor& FillGradientAttribute::getEndColor() const
198*b1cdbd2cSJim Jagielski         {
199*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getEndColor();
200*b1cdbd2cSJim Jagielski         }
201*b1cdbd2cSJim Jagielski 
getBorder() const202*b1cdbd2cSJim Jagielski 		double FillGradientAttribute::getBorder() const
203*b1cdbd2cSJim Jagielski         {
204*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getBorder();
205*b1cdbd2cSJim Jagielski         }
206*b1cdbd2cSJim Jagielski 
getOffsetX() const207*b1cdbd2cSJim Jagielski 		double FillGradientAttribute::getOffsetX() const
208*b1cdbd2cSJim Jagielski         {
209*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getOffsetX();
210*b1cdbd2cSJim Jagielski         }
211*b1cdbd2cSJim Jagielski 
getOffsetY() const212*b1cdbd2cSJim Jagielski 		double FillGradientAttribute::getOffsetY() const
213*b1cdbd2cSJim Jagielski         {
214*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getOffsetY();
215*b1cdbd2cSJim Jagielski         }
216*b1cdbd2cSJim Jagielski 
getAngle() const217*b1cdbd2cSJim Jagielski 		double FillGradientAttribute::getAngle() const
218*b1cdbd2cSJim Jagielski         {
219*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getAngle();
220*b1cdbd2cSJim Jagielski         }
221*b1cdbd2cSJim Jagielski 
getStyle() const222*b1cdbd2cSJim Jagielski 		GradientStyle FillGradientAttribute::getStyle() const
223*b1cdbd2cSJim Jagielski         {
224*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getStyle();
225*b1cdbd2cSJim Jagielski         }
226*b1cdbd2cSJim Jagielski 
getSteps() const227*b1cdbd2cSJim Jagielski 		sal_uInt16 FillGradientAttribute::getSteps() const
228*b1cdbd2cSJim Jagielski         {
229*b1cdbd2cSJim Jagielski             return mpFillGradientAttribute->getSteps();
230*b1cdbd2cSJim Jagielski         }
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski     } // end of namespace attribute
233*b1cdbd2cSJim Jagielski } // end of namespace drawinglayer
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
236*b1cdbd2cSJim Jagielski // eof
237