xref: /aoo41x/main/vcl/source/gdi/gradient.cxx (revision 9f62ea84)
1*9f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9f62ea84SAndrew Rist  * distributed with this work for additional information
6*9f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
9*9f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*9f62ea84SAndrew Rist  *
11*9f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*9f62ea84SAndrew Rist  *
13*9f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9f62ea84SAndrew Rist  * software distributed under the License is distributed on an
15*9f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9f62ea84SAndrew Rist  * specific language governing permissions and limitations
18*9f62ea84SAndrew Rist  * under the License.
19*9f62ea84SAndrew Rist  *
20*9f62ea84SAndrew Rist  *************************************************************/
21*9f62ea84SAndrew Rist 
22*9f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir #include <tools/stream.hxx>
27cdf0e10cSrcweir #include <tools/vcompat.hxx>
28cdf0e10cSrcweir #include <tools/debug.hxx>
29cdf0e10cSrcweir #include <vcl/gradient.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir // =======================================================================
32cdf0e10cSrcweir 
DBG_NAME(Gradient)33cdf0e10cSrcweir DBG_NAME( Gradient )
34cdf0e10cSrcweir 
35cdf0e10cSrcweir // -----------------------------------------------------------------------
36cdf0e10cSrcweir 
37cdf0e10cSrcweir Impl_Gradient::Impl_Gradient() :
38cdf0e10cSrcweir     maStartColor( COL_BLACK ),
39cdf0e10cSrcweir     maEndColor( COL_WHITE )
40cdf0e10cSrcweir {
41cdf0e10cSrcweir     mnRefCount          = 1;
42cdf0e10cSrcweir     meStyle             = GRADIENT_LINEAR;
43cdf0e10cSrcweir     mnAngle             = 0;
44cdf0e10cSrcweir     mnBorder            = 0;
45cdf0e10cSrcweir     mnOfsX              = 50;
46cdf0e10cSrcweir     mnOfsY              = 50;
47cdf0e10cSrcweir     mnIntensityStart    = 100;
48cdf0e10cSrcweir     mnIntensityEnd      = 100;
49cdf0e10cSrcweir     mnStepCount         = 0;
50cdf0e10cSrcweir }
51cdf0e10cSrcweir 
52cdf0e10cSrcweir // -----------------------------------------------------------------------
53cdf0e10cSrcweir 
Impl_Gradient(const Impl_Gradient & rImplGradient)54cdf0e10cSrcweir Impl_Gradient::Impl_Gradient( const Impl_Gradient& rImplGradient ) :
55cdf0e10cSrcweir     maStartColor( rImplGradient.maStartColor ),
56cdf0e10cSrcweir     maEndColor( rImplGradient.maEndColor )
57cdf0e10cSrcweir {
58cdf0e10cSrcweir     mnRefCount          = 1;
59cdf0e10cSrcweir     meStyle             = rImplGradient.meStyle;
60cdf0e10cSrcweir     mnAngle             = rImplGradient.mnAngle;
61cdf0e10cSrcweir     mnBorder            = rImplGradient.mnBorder;
62cdf0e10cSrcweir     mnOfsX              = rImplGradient.mnOfsX;
63cdf0e10cSrcweir     mnOfsY              = rImplGradient.mnOfsY;
64cdf0e10cSrcweir     mnIntensityStart    = rImplGradient.mnIntensityStart;
65cdf0e10cSrcweir     mnIntensityEnd      = rImplGradient.mnIntensityEnd;
66cdf0e10cSrcweir     mnStepCount         = rImplGradient.mnStepCount;
67cdf0e10cSrcweir }
68cdf0e10cSrcweir 
69cdf0e10cSrcweir // -----------------------------------------------------------------------
70cdf0e10cSrcweir 
MakeUnique()71cdf0e10cSrcweir void Gradient::MakeUnique()
72cdf0e10cSrcweir {
73cdf0e10cSrcweir     // Falls noch andere Referenzen bestehen, dann kopieren
74cdf0e10cSrcweir     if ( mpImplGradient->mnRefCount != 1 )
75cdf0e10cSrcweir 	{
76cdf0e10cSrcweir 		if( mpImplGradient->mnRefCount )
77cdf0e10cSrcweir 			mpImplGradient->mnRefCount--;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir         mpImplGradient = new Impl_Gradient( *mpImplGradient );
80cdf0e10cSrcweir 	}
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir // -----------------------------------------------------------------------
84cdf0e10cSrcweir 
Gradient()85cdf0e10cSrcweir Gradient::Gradient()
86cdf0e10cSrcweir {
87cdf0e10cSrcweir     DBG_CTOR( Gradient, NULL );
88cdf0e10cSrcweir 
89cdf0e10cSrcweir     mpImplGradient = new Impl_Gradient;
90cdf0e10cSrcweir }
91cdf0e10cSrcweir 
92cdf0e10cSrcweir // -----------------------------------------------------------------------
93cdf0e10cSrcweir 
Gradient(const Gradient & rGradient)94cdf0e10cSrcweir Gradient::Gradient( const Gradient& rGradient )
95cdf0e10cSrcweir {
96cdf0e10cSrcweir     DBG_CTOR( Gradient, NULL );
97cdf0e10cSrcweir     DBG_CHKOBJ( &rGradient, Gradient, NULL );
98cdf0e10cSrcweir 
99cdf0e10cSrcweir     // Instance Daten uebernehmen und Referenzcounter erhoehen
100cdf0e10cSrcweir     mpImplGradient = rGradient.mpImplGradient;
101cdf0e10cSrcweir     mpImplGradient->mnRefCount++;
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir // -----------------------------------------------------------------------
105cdf0e10cSrcweir 
Gradient(GradientStyle eStyle)106cdf0e10cSrcweir Gradient::Gradient( GradientStyle eStyle )
107cdf0e10cSrcweir {
108cdf0e10cSrcweir     DBG_CTOR( Gradient, NULL );
109cdf0e10cSrcweir 
110cdf0e10cSrcweir     mpImplGradient          = new Impl_Gradient;
111cdf0e10cSrcweir     mpImplGradient->meStyle = eStyle;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir 
114cdf0e10cSrcweir // -----------------------------------------------------------------------
115cdf0e10cSrcweir 
Gradient(GradientStyle eStyle,const Color & rStartColor,const Color & rEndColor)116cdf0e10cSrcweir Gradient::Gradient( GradientStyle eStyle,
117cdf0e10cSrcweir                     const Color& rStartColor, const Color& rEndColor )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir     DBG_CTOR( Gradient, NULL );
120cdf0e10cSrcweir 
121cdf0e10cSrcweir     mpImplGradient                  = new Impl_Gradient;
122cdf0e10cSrcweir     mpImplGradient->meStyle         = eStyle;
123cdf0e10cSrcweir     mpImplGradient->maStartColor    = rStartColor;
124cdf0e10cSrcweir     mpImplGradient->maEndColor      = rEndColor;
125cdf0e10cSrcweir }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir // -----------------------------------------------------------------------
128cdf0e10cSrcweir 
~Gradient()129cdf0e10cSrcweir Gradient::~Gradient()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir     DBG_DTOR( Gradient, NULL );
132cdf0e10cSrcweir 
133cdf0e10cSrcweir     // Wenn es die letzte Referenz ist, loeschen,
134cdf0e10cSrcweir     // sonst Referenzcounter decrementieren
135cdf0e10cSrcweir     if ( mpImplGradient->mnRefCount == 1 )
136cdf0e10cSrcweir         delete mpImplGradient;
137cdf0e10cSrcweir     else
138cdf0e10cSrcweir         mpImplGradient->mnRefCount--;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir 
141cdf0e10cSrcweir // -----------------------------------------------------------------------
142cdf0e10cSrcweir 
SetStyle(GradientStyle eStyle)143cdf0e10cSrcweir void Gradient::SetStyle( GradientStyle eStyle )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
146cdf0e10cSrcweir 
147cdf0e10cSrcweir     MakeUnique();
148cdf0e10cSrcweir     mpImplGradient->meStyle = eStyle;
149cdf0e10cSrcweir }
150cdf0e10cSrcweir 
151cdf0e10cSrcweir // -----------------------------------------------------------------------
152cdf0e10cSrcweir 
SetStartColor(const Color & rColor)153cdf0e10cSrcweir void Gradient::SetStartColor( const Color& rColor )
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
156cdf0e10cSrcweir 
157cdf0e10cSrcweir     MakeUnique();
158cdf0e10cSrcweir     mpImplGradient->maStartColor = rColor;
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir // -----------------------------------------------------------------------
162cdf0e10cSrcweir 
SetEndColor(const Color & rColor)163cdf0e10cSrcweir void Gradient::SetEndColor( const Color& rColor )
164cdf0e10cSrcweir {
165cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     MakeUnique();
168cdf0e10cSrcweir     mpImplGradient->maEndColor = rColor;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir // -----------------------------------------------------------------------
172cdf0e10cSrcweir 
SetAngle(sal_uInt16 nAngle)173cdf0e10cSrcweir void Gradient::SetAngle( sal_uInt16 nAngle )
174cdf0e10cSrcweir {
175cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
176cdf0e10cSrcweir 
177cdf0e10cSrcweir     MakeUnique();
178cdf0e10cSrcweir     mpImplGradient->mnAngle = nAngle;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir // -----------------------------------------------------------------------
182cdf0e10cSrcweir 
SetBorder(sal_uInt16 nBorder)183cdf0e10cSrcweir void Gradient::SetBorder( sal_uInt16 nBorder )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
186cdf0e10cSrcweir 
187cdf0e10cSrcweir     MakeUnique();
188cdf0e10cSrcweir     mpImplGradient->mnBorder = nBorder;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir 
191cdf0e10cSrcweir // -----------------------------------------------------------------------
192cdf0e10cSrcweir 
SetOfsX(sal_uInt16 nOfsX)193cdf0e10cSrcweir void Gradient::SetOfsX( sal_uInt16 nOfsX )
194cdf0e10cSrcweir {
195cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
196cdf0e10cSrcweir 
197cdf0e10cSrcweir     MakeUnique();
198cdf0e10cSrcweir     mpImplGradient->mnOfsX = nOfsX;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
201cdf0e10cSrcweir // -----------------------------------------------------------------------
202cdf0e10cSrcweir 
SetOfsY(sal_uInt16 nOfsY)203cdf0e10cSrcweir void Gradient::SetOfsY( sal_uInt16 nOfsY )
204cdf0e10cSrcweir {
205cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     MakeUnique();
208cdf0e10cSrcweir     mpImplGradient->mnOfsY = nOfsY;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir // -----------------------------------------------------------------------
212cdf0e10cSrcweir 
SetStartIntensity(sal_uInt16 nIntens)213cdf0e10cSrcweir void Gradient::SetStartIntensity( sal_uInt16 nIntens )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     MakeUnique();
218cdf0e10cSrcweir     mpImplGradient->mnIntensityStart = nIntens;
219cdf0e10cSrcweir }
220cdf0e10cSrcweir 
221cdf0e10cSrcweir // -----------------------------------------------------------------------
222cdf0e10cSrcweir 
SetEndIntensity(sal_uInt16 nIntens)223cdf0e10cSrcweir void Gradient::SetEndIntensity( sal_uInt16 nIntens )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
226cdf0e10cSrcweir 
227cdf0e10cSrcweir     MakeUnique();
228cdf0e10cSrcweir     mpImplGradient->mnIntensityEnd = nIntens;
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
231cdf0e10cSrcweir // -----------------------------------------------------------------------
232cdf0e10cSrcweir 
SetSteps(sal_uInt16 nSteps)233cdf0e10cSrcweir void Gradient::SetSteps( sal_uInt16 nSteps )
234cdf0e10cSrcweir {
235cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
236cdf0e10cSrcweir 
237cdf0e10cSrcweir     MakeUnique();
238cdf0e10cSrcweir     mpImplGradient->mnStepCount = nSteps;
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir // -----------------------------------------------------------------------
242cdf0e10cSrcweir 
operator =(const Gradient & rGradient)243cdf0e10cSrcweir Gradient& Gradient::operator=( const Gradient& rGradient )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
246cdf0e10cSrcweir     DBG_CHKOBJ( &rGradient, Gradient, NULL );
247cdf0e10cSrcweir 
248cdf0e10cSrcweir     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
249cdf0e10cSrcweir     rGradient.mpImplGradient->mnRefCount++;
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     // Wenn es die letzte Referenz ist, loeschen,
252cdf0e10cSrcweir     // sonst Referenzcounter decrementieren
253cdf0e10cSrcweir     if ( mpImplGradient->mnRefCount == 1 )
254cdf0e10cSrcweir         delete mpImplGradient;
255cdf0e10cSrcweir     else
256cdf0e10cSrcweir         mpImplGradient->mnRefCount--;
257cdf0e10cSrcweir     mpImplGradient = rGradient.mpImplGradient;
258cdf0e10cSrcweir 
259cdf0e10cSrcweir     return *this;
260cdf0e10cSrcweir }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir // -----------------------------------------------------------------------
263cdf0e10cSrcweir 
operator ==(const Gradient & rGradient) const264cdf0e10cSrcweir sal_Bool Gradient::operator==( const Gradient& rGradient ) const
265cdf0e10cSrcweir {
266cdf0e10cSrcweir     DBG_CHKTHIS( Gradient, NULL );
267cdf0e10cSrcweir     DBG_CHKOBJ( &rGradient, Gradient, NULL );
268cdf0e10cSrcweir 
269cdf0e10cSrcweir     if ( mpImplGradient == rGradient.mpImplGradient )
270cdf0e10cSrcweir         return sal_True;
271cdf0e10cSrcweir 
272cdf0e10cSrcweir     if ( (mpImplGradient->meStyle           == rGradient.mpImplGradient->meStyle)           ||
273cdf0e10cSrcweir          (mpImplGradient->mnAngle           == rGradient.mpImplGradient->mnAngle)           ||
274cdf0e10cSrcweir          (mpImplGradient->mnBorder          == rGradient.mpImplGradient->mnBorder)          ||
275cdf0e10cSrcweir          (mpImplGradient->mnOfsX            == rGradient.mpImplGradient->mnOfsX)            ||
276cdf0e10cSrcweir          (mpImplGradient->mnOfsY            == rGradient.mpImplGradient->mnOfsY)            ||
277cdf0e10cSrcweir          (mpImplGradient->mnStepCount       == rGradient.mpImplGradient->mnStepCount)       ||
278cdf0e10cSrcweir          (mpImplGradient->mnIntensityStart  == rGradient.mpImplGradient->mnIntensityStart)  ||
279cdf0e10cSrcweir          (mpImplGradient->mnIntensityEnd    == rGradient.mpImplGradient->mnIntensityEnd)    ||
280cdf0e10cSrcweir          (mpImplGradient->maStartColor      == rGradient.mpImplGradient->maStartColor)      ||
281cdf0e10cSrcweir          (mpImplGradient->maEndColor        == rGradient.mpImplGradient->maEndColor) )
282cdf0e10cSrcweir          return sal_True;
283cdf0e10cSrcweir     else
284cdf0e10cSrcweir         return sal_False;
285cdf0e10cSrcweir }
286cdf0e10cSrcweir 
operator >>(SvStream & rIStm,Impl_Gradient & rImpl_Gradient)287cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, Impl_Gradient& rImpl_Gradient )
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     VersionCompat	aCompat( rIStm, STREAM_READ );
290cdf0e10cSrcweir     sal_uInt16			nTmp16;
291cdf0e10cSrcweir 
292cdf0e10cSrcweir     rIStm >> nTmp16; rImpl_Gradient.meStyle = (GradientStyle) nTmp16;
293cdf0e10cSrcweir 
294cdf0e10cSrcweir     rIStm >> rImpl_Gradient.maStartColor >>
295cdf0e10cSrcweir              rImpl_Gradient.maEndColor >>
296cdf0e10cSrcweir              rImpl_Gradient.mnAngle >>
297cdf0e10cSrcweir              rImpl_Gradient.mnBorder >>
298cdf0e10cSrcweir              rImpl_Gradient.mnOfsX >>
299cdf0e10cSrcweir              rImpl_Gradient.mnOfsY >>
300cdf0e10cSrcweir              rImpl_Gradient.mnIntensityStart >>
301cdf0e10cSrcweir              rImpl_Gradient.mnIntensityEnd >>
302cdf0e10cSrcweir              rImpl_Gradient.mnStepCount;
303cdf0e10cSrcweir 
304cdf0e10cSrcweir     return rIStm;
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
307cdf0e10cSrcweir // -----------------------------------------------------------------------
308cdf0e10cSrcweir 
operator <<(SvStream & rOStm,const Impl_Gradient & rImpl_Gradient)309cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const Impl_Gradient& rImpl_Gradient )
310cdf0e10cSrcweir {
311cdf0e10cSrcweir     VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
312cdf0e10cSrcweir 
313cdf0e10cSrcweir     rOStm << (sal_uInt16) rImpl_Gradient.meStyle <<
314cdf0e10cSrcweir              rImpl_Gradient.maStartColor <<
315cdf0e10cSrcweir              rImpl_Gradient.maEndColor <<
316cdf0e10cSrcweir              rImpl_Gradient.mnAngle <<
317cdf0e10cSrcweir              rImpl_Gradient.mnBorder <<
318cdf0e10cSrcweir              rImpl_Gradient.mnOfsX <<
319cdf0e10cSrcweir              rImpl_Gradient.mnOfsY <<
320cdf0e10cSrcweir              rImpl_Gradient.mnIntensityStart <<
321cdf0e10cSrcweir              rImpl_Gradient.mnIntensityEnd <<
322cdf0e10cSrcweir              rImpl_Gradient.mnStepCount;
323cdf0e10cSrcweir 
324cdf0e10cSrcweir     return rOStm;
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
327cdf0e10cSrcweir // -----------------------------------------------------------------------
328cdf0e10cSrcweir 
operator >>(SvStream & rIStm,Gradient & rGradient)329cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, Gradient& rGradient )
330cdf0e10cSrcweir {
331cdf0e10cSrcweir     rGradient.MakeUnique();
332cdf0e10cSrcweir     return( rIStm >> *rGradient.mpImplGradient );
333cdf0e10cSrcweir }
334cdf0e10cSrcweir 
335cdf0e10cSrcweir // -----------------------------------------------------------------------
336cdf0e10cSrcweir 
operator <<(SvStream & rOStm,const Gradient & rGradient)337cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const Gradient& rGradient )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir     return( rOStm << *rGradient.mpImplGradient );
340cdf0e10cSrcweir }
341