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