1 /*************************************************************************
2  *
3  *  OpenOffice.org - a multi-platform office productivity suite
4  *
5  *  $RCSfile: fillattribute.cxx,v $
6  *
7  *  $Revision: 1.4 $
8  *
9  *  last change: $Author: aw $ $Date: 2008-05-27 14:11:19 $
10  *
11  *  The Contents of this file are made available subject to
12  *  the terms of GNU Lesser General Public License Version 2.1.
13  *
14  *
15  *    GNU Lesser General Public License Version 2.1
16  *    =============================================
17  *    Copyright 2005 by Sun Microsystems, Inc.
18  *    901 San Antonio Road, Palo Alto, CA 94303, USA
19  *
20  *    This library is free software; you can redistribute it and/or
21  *    modify it under the terms of the GNU Lesser General Public
22  *    License version 2.1, as published by the Free Software Foundation.
23  *
24  *    This library is distributed in the hope that it will be useful,
25  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
26  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
27  *    Lesser General Public License for more details.
28  *
29  *    You should have received a copy of the GNU Lesser General Public
30  *    License along with this library; if not, write to the Free Software
31  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
32  *    MA  02111-1307  USA
33  *
34  ************************************************************************/
35 
36 // MARKER(update_precomp.py): autogen include statement, do not remove
37 #include "precompiled_drawinglayer.hxx"
38 
39 #include <drawinglayer/attribute/fillgradientattribute.hxx>
40 #include <basegfx/color/bcolor.hxx>
41 
42 //////////////////////////////////////////////////////////////////////////////
43 
44 namespace drawinglayer
45 {
46 	namespace attribute
47 	{
48 	    class ImpFillGradientAttribute
49 	    {
50         public:
51 		    // refcounter
52 		    sal_uInt32								mnRefCount;
53 
54             // data definitions
55 		    GradientStyle							meStyle;
56 		    double									mfBorder;
57 		    double									mfOffsetX;
58 		    double									mfOffsetY;
59 		    double									mfAngle;
60             basegfx::BColor							maStartColor;
61 		    basegfx::BColor							maEndColor;
62 		    sal_uInt16								mnSteps;
63 
64 		    ImpFillGradientAttribute(
65 			    GradientStyle eStyle,
66                 double fBorder,
67                 double fOffsetX,
68                 double fOffsetY,
69                 double fAngle,
70 			    const basegfx::BColor& rStartColor,
71                 const basegfx::BColor& rEndColor,
72                 sal_uInt16 nSteps)
73 		    :	mnRefCount(0),
74 		        meStyle(eStyle),
75 		        mfBorder(fBorder),
76 		        mfOffsetX(fOffsetX),
77 		        mfOffsetY(fOffsetY),
78 		        mfAngle(fAngle),
79                 maStartColor(rStartColor),
80 		        maEndColor(rEndColor),
81 		        mnSteps(nSteps)
82             {
83             }
84 
85 		    // data read access
86 		    GradientStyle getStyle() const { return meStyle; }
87 		    double getBorder() const { return mfBorder; }
88 		    double getOffsetX() const { return mfOffsetX; }
89 		    double getOffsetY() const { return mfOffsetY; }
90 		    double getAngle() const { return mfAngle; }
91 		    const basegfx::BColor& getStartColor() const { return maStartColor; }
92 		    const basegfx::BColor& getEndColor() const { return maEndColor; }
93 		    sal_uInt16 getSteps() const { return mnSteps; }
94 
95 		    bool operator==(const ImpFillGradientAttribute& rCandidate) const
96             {
97 		        return (getStyle() == rCandidate.getStyle()
98 			        && getBorder() == rCandidate.getBorder()
99 			        && getOffsetX() == rCandidate.getOffsetX()
100 			        && getOffsetY() == rCandidate.getOffsetY()
101 			        && getAngle() == rCandidate.getAngle()
102                     && getStartColor() == rCandidate.getStartColor()
103 			        && getEndColor() == rCandidate.getEndColor()
104 			        && getSteps() == rCandidate.getSteps());
105             }
106 
107             static ImpFillGradientAttribute* get_global_default()
108             {
109                 static ImpFillGradientAttribute* pDefault = 0;
110 
111                 if(!pDefault)
112                 {
113                     pDefault = new ImpFillGradientAttribute(
114                         GRADIENTSTYLE_LINEAR,
115                         0.0, 0.0, 0.0, 0.0,
116                         basegfx::BColor(),
117                         basegfx::BColor(),
118                         0);
119 
120                     // never delete; start with RefCount 1, not 0
121     			    pDefault->mnRefCount++;
122                 }
123 
124                 return pDefault;
125             }
126 	    };
127 
128         FillGradientAttribute::FillGradientAttribute(
129 			GradientStyle eStyle,
130             double fBorder,
131             double fOffsetX,
132             double fOffsetY,
133             double fAngle,
134 			const basegfx::BColor& rStartColor,
135             const basegfx::BColor& rEndColor,
136             sal_uInt16 nSteps)
137         :	mpFillGradientAttribute(new ImpFillGradientAttribute(
138                 eStyle, fBorder, fOffsetX, fOffsetY, fAngle, rStartColor, rEndColor, nSteps))
139 		{
140 		}
141 
142 		FillGradientAttribute::FillGradientAttribute()
143         :	mpFillGradientAttribute(ImpFillGradientAttribute::get_global_default())
144 		{
145 			mpFillGradientAttribute->mnRefCount++;
146 		}
147 
148 		FillGradientAttribute::FillGradientAttribute(const FillGradientAttribute& rCandidate)
149 		:	mpFillGradientAttribute(rCandidate.mpFillGradientAttribute)
150 		{
151 			mpFillGradientAttribute->mnRefCount++;
152 		}
153 
154 		FillGradientAttribute::~FillGradientAttribute()
155 		{
156 			if(mpFillGradientAttribute->mnRefCount)
157 			{
158 				mpFillGradientAttribute->mnRefCount--;
159 			}
160 			else
161 			{
162 				delete mpFillGradientAttribute;
163 			}
164 		}
165 
166         bool FillGradientAttribute::isDefault() const
167         {
168             return mpFillGradientAttribute == ImpFillGradientAttribute::get_global_default();
169         }
170 
171         FillGradientAttribute& FillGradientAttribute::operator=(const FillGradientAttribute& rCandidate)
172 		{
173 			if(rCandidate.mpFillGradientAttribute != mpFillGradientAttribute)
174 			{
175 				if(mpFillGradientAttribute->mnRefCount)
176 				{
177 					mpFillGradientAttribute->mnRefCount--;
178 				}
179 				else
180 				{
181 					delete mpFillGradientAttribute;
182 				}
183 
184 				mpFillGradientAttribute = rCandidate.mpFillGradientAttribute;
185 				mpFillGradientAttribute->mnRefCount++;
186 			}
187 
188 			return *this;
189 		}
190 
191 		bool FillGradientAttribute::operator==(const FillGradientAttribute& rCandidate) const
192 		{
193 			if(rCandidate.mpFillGradientAttribute == mpFillGradientAttribute)
194 			{
195 				return true;
196 			}
197 
198 			if(rCandidate.isDefault() != isDefault())
199 			{
200 				return false;
201 			}
202 
203 			return (*rCandidate.mpFillGradientAttribute == *mpFillGradientAttribute);
204 		}
205 
206 		const basegfx::BColor& FillGradientAttribute::getStartColor() const
207         {
208             return mpFillGradientAttribute->getStartColor();
209         }
210 
211 		const basegfx::BColor& FillGradientAttribute::getEndColor() const
212         {
213             return mpFillGradientAttribute->getEndColor();
214         }
215 
216 		double FillGradientAttribute::getBorder() const
217         {
218             return mpFillGradientAttribute->getBorder();
219         }
220 
221 		double FillGradientAttribute::getOffsetX() const
222         {
223             return mpFillGradientAttribute->getOffsetX();
224         }
225 
226 		double FillGradientAttribute::getOffsetY() const
227         {
228             return mpFillGradientAttribute->getOffsetY();
229         }
230 
231 		double FillGradientAttribute::getAngle() const
232         {
233             return mpFillGradientAttribute->getAngle();
234         }
235 
236 		GradientStyle FillGradientAttribute::getStyle() const
237         {
238             return mpFillGradientAttribute->getStyle();
239         }
240 
241 		sal_uInt16 FillGradientAttribute::getSteps() const
242         {
243             return mpFillGradientAttribute->getSteps();
244         }
245 
246     } // end of namespace attribute
247 } // end of namespace drawinglayer
248 
249 //////////////////////////////////////////////////////////////////////////////
250 // eof
251