1 /*************************************************************************
2  *
3  *  OpenOffice.org - a multi-platform office productivity suite
4  *
5  *  $RCSfile: sdrattribute.cxx,v $
6  *
7  *  $Revision: 1.5 $
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/sdrfillattribute.hxx>
40 #include <basegfx/color/bcolor.hxx>
41 #include <drawinglayer/attribute/sdrfillbitmapattribute.hxx>
42 #include <drawinglayer/attribute/fillhatchattribute.hxx>
43 #include <drawinglayer/attribute/fillgradientattribute.hxx>
44 
45 //////////////////////////////////////////////////////////////////////////////
46 
47 namespace drawinglayer
48 {
49 	namespace attribute
50 	{
51 		class ImpSdrFillAttribute
52 		{
53 		public:
54 			// refcounter
55 			sal_uInt32							mnRefCount;
56 
57 			// fill definitions
58 			double								mfTransparence;		// [0.0 .. 1.0], 0.0==no transp.
59 			basegfx::BColor						maColor;			// fill color
60 			FillGradientAttribute				maGradient;			// fill gradient (if used)
61 			FillHatchAttribute					maHatch;			// fill hatch (if used)
62 			SdrFillBitmapAttribute				maBitmap;			// fill bitmap (if used)
63 
64 		public:
65 			ImpSdrFillAttribute(
66 				double fTransparence,
67                 const basegfx::BColor& rColor,
68                 const FillGradientAttribute& rGradient,
69 				const FillHatchAttribute& rHatch,
70                 const SdrFillBitmapAttribute& rBitmap)
71 			:	mnRefCount(0),
72 			    mfTransparence(fTransparence),
73 			    maColor(rColor),
74 			    maGradient(rGradient),
75 			    maHatch(rHatch),
76 			    maBitmap(rBitmap)
77             {
78             }
79 
80 			// data read access
81 			double getTransparence() const { return mfTransparence;	}
82 			const basegfx::BColor& getColor() const { return maColor; }
83 			const FillGradientAttribute& getGradient() const { return maGradient; }
84 			const FillHatchAttribute& getHatch() const { return maHatch; }
85 			const SdrFillBitmapAttribute& getBitmap() const { return maBitmap; }
86 
87             // compare operator
88 			bool operator==(const ImpSdrFillAttribute& rCandidate) const
89             {
90                 return(getTransparence() == rCandidate.getTransparence()
91                     && getColor() == rCandidate.getColor()
92                     && getGradient() == rCandidate.getGradient()
93                     && getHatch() == rCandidate.getHatch()
94                     && getBitmap() == rCandidate.getBitmap());
95             }
96 
97             static ImpSdrFillAttribute* get_global_default()
98             {
99                 static ImpSdrFillAttribute* pDefault = 0;
100 
101                 if(!pDefault)
102                 {
103                     pDefault = new ImpSdrFillAttribute(
104 				        0.0,
105                         basegfx::BColor(),
106                         FillGradientAttribute(),
107 				        FillHatchAttribute(),
108                         SdrFillBitmapAttribute());
109 
110                     // never delete; start with RefCount 1, not 0
111     			    pDefault->mnRefCount++;
112                 }
113 
114                 return pDefault;
115             }
116 		};
117 
118         SdrFillAttribute::SdrFillAttribute(
119 			double fTransparence,
120             const basegfx::BColor& rColor,
121             const FillGradientAttribute& rGradient,
122 			const FillHatchAttribute& rHatch,
123             const SdrFillBitmapAttribute& rBitmap)
124 		:	mpSdrFillAttribute(new ImpSdrFillAttribute(
125                 fTransparence, rColor, rGradient, rHatch, rBitmap))
126 		{
127 		}
128 
129 		SdrFillAttribute::SdrFillAttribute()
130         :	mpSdrFillAttribute(ImpSdrFillAttribute::get_global_default())
131 		{
132 			mpSdrFillAttribute->mnRefCount++;
133 		}
134 
135         SdrFillAttribute::SdrFillAttribute(const SdrFillAttribute& rCandidate)
136 		:	mpSdrFillAttribute(rCandidate.mpSdrFillAttribute)
137 		{
138 			mpSdrFillAttribute->mnRefCount++;
139 		}
140 
141 		SdrFillAttribute::~SdrFillAttribute()
142 		{
143 			if(mpSdrFillAttribute->mnRefCount)
144 			{
145 				mpSdrFillAttribute->mnRefCount--;
146 			}
147 			else
148 			{
149 				delete mpSdrFillAttribute;
150 			}
151 		}
152 
153         bool SdrFillAttribute::isDefault() const
154         {
155             return mpSdrFillAttribute == ImpSdrFillAttribute::get_global_default();
156         }
157 
158         SdrFillAttribute& SdrFillAttribute::operator=(const SdrFillAttribute& rCandidate)
159 		{
160 			if(rCandidate.mpSdrFillAttribute != mpSdrFillAttribute)
161 			{
162 				if(mpSdrFillAttribute->mnRefCount)
163 				{
164 					mpSdrFillAttribute->mnRefCount--;
165 				}
166 				else
167 				{
168 					delete mpSdrFillAttribute;
169 				}
170 
171 				mpSdrFillAttribute = rCandidate.mpSdrFillAttribute;
172 				mpSdrFillAttribute->mnRefCount++;
173 			}
174 
175 			return *this;
176 		}
177 
178 		bool SdrFillAttribute::operator==(const SdrFillAttribute& rCandidate) const
179 		{
180 			if(rCandidate.mpSdrFillAttribute == mpSdrFillAttribute)
181 			{
182 				return true;
183 			}
184 
185 			if(rCandidate.isDefault() != isDefault())
186 			{
187 				return false;
188 			}
189 
190 			return (*rCandidate.mpSdrFillAttribute == *mpSdrFillAttribute);
191 		}
192 
193 		double SdrFillAttribute::getTransparence() const
194         {
195             return mpSdrFillAttribute->getTransparence();
196         }
197 
198 		const basegfx::BColor& SdrFillAttribute::getColor() const
199         {
200             return mpSdrFillAttribute->getColor();
201         }
202 
203 		const FillGradientAttribute& SdrFillAttribute::getGradient() const
204         {
205             return mpSdrFillAttribute->getGradient();
206         }
207 
208 		const FillHatchAttribute& SdrFillAttribute::getHatch() const
209         {
210             return mpSdrFillAttribute->getHatch();
211         }
212 
213 		const SdrFillBitmapAttribute& SdrFillAttribute::getBitmap() const
214         {
215             return mpSdrFillAttribute->getBitmap();
216         }
217     } // end of namespace attribute
218 } // end of namespace drawinglayer
219 
220 //////////////////////////////////////////////////////////////////////////////
221 // eof
222