Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <tools/stream.hxx>
22 : #include <tools/vcompat.hxx>
23 : #include <tools/debug.hxx>
24 :
25 : #include <vcl/bitmapex.hxx>
26 : #include <vcl/gradient.hxx>
27 : #include <vcl/wall.hxx>
28 : #include <vcl/svapp.hxx>
29 :
30 : #include <wall2.hxx>
31 :
32 :
33 : DBG_NAME( Wallpaper )
34 :
35 : // -----------------------------------------------------------------------
36 :
37 25293 : ImplWallpaper::ImplWallpaper() :
38 25293 : maColor( COL_TRANSPARENT )
39 : {
40 25293 : mnRefCount = 1;
41 25293 : mpBitmap = NULL;
42 25293 : mpCache = NULL;
43 25293 : mpGradient = NULL;
44 25293 : mpRect = NULL;
45 25293 : meStyle = WALLPAPER_NULL;
46 25293 : }
47 :
48 : // -----------------------------------------------------------------------
49 :
50 2156 : ImplWallpaper::ImplWallpaper( const ImplWallpaper& rImplWallpaper ) :
51 2156 : maColor( rImplWallpaper.maColor )
52 : {
53 2156 : mnRefCount = 1;
54 2156 : meStyle = rImplWallpaper.meStyle;
55 :
56 2156 : if ( rImplWallpaper.mpBitmap )
57 0 : mpBitmap = new BitmapEx( *rImplWallpaper.mpBitmap );
58 : else
59 2156 : mpBitmap = NULL;
60 2156 : if( rImplWallpaper.mpCache )
61 0 : mpCache = new BitmapEx( *rImplWallpaper.mpCache );
62 : else
63 2156 : mpCache = NULL;
64 2156 : if ( rImplWallpaper.mpGradient )
65 0 : mpGradient = new Gradient( *rImplWallpaper.mpGradient );
66 : else
67 2156 : mpGradient = NULL;
68 2156 : if ( rImplWallpaper.mpRect )
69 0 : mpRect = new Rectangle( *rImplWallpaper.mpRect );
70 : else
71 2156 : mpRect = NULL;
72 2156 : }
73 :
74 : // -----------------------------------------------------------------------
75 :
76 21671 : ImplWallpaper::~ImplWallpaper()
77 : {
78 21671 : delete mpBitmap;
79 21671 : delete mpCache;
80 21671 : delete mpGradient;
81 21671 : delete mpRect;
82 21671 : }
83 :
84 : // -----------------------------------------------------------------------
85 :
86 0 : void ImplWallpaper::ImplSetCachedBitmap( BitmapEx& rBmp )
87 : {
88 0 : if( !mpCache )
89 0 : mpCache = new BitmapEx( rBmp );
90 : else
91 0 : *mpCache = rBmp;
92 0 : }
93 :
94 : // -----------------------------------------------------------------------
95 :
96 2156 : void ImplWallpaper::ImplReleaseCachedBitmap()
97 : {
98 2156 : delete mpCache;
99 2156 : mpCache = NULL;
100 2156 : }
101 :
102 : // -----------------------------------------------------------------------
103 :
104 0 : SvStream& operator>>( SvStream& rIStm, ImplWallpaper& rImplWallpaper )
105 : {
106 0 : VersionCompat aCompat( rIStm, STREAM_READ );
107 : sal_uInt16 nTmp16;
108 :
109 0 : delete rImplWallpaper.mpRect;
110 0 : rImplWallpaper.mpRect = NULL;
111 :
112 0 : delete rImplWallpaper.mpGradient;
113 0 : rImplWallpaper.mpGradient = NULL;
114 :
115 0 : delete rImplWallpaper.mpBitmap;
116 0 : rImplWallpaper.mpBitmap = NULL;
117 :
118 : // version 1
119 0 : rIStm >> rImplWallpaper.maColor;
120 0 : rIStm >> nTmp16; rImplWallpaper.meStyle = (WallpaperStyle) nTmp16;
121 :
122 : // version 2
123 0 : if( aCompat.GetVersion() >= 2 )
124 : {
125 : sal_Bool bRect, bGrad, bBmp, bDummy;
126 :
127 0 : rIStm >> bRect >> bGrad >> bBmp >> bDummy >> bDummy >> bDummy;
128 :
129 0 : if( bRect )
130 : {
131 0 : rImplWallpaper.mpRect = new Rectangle;
132 0 : rIStm >> *rImplWallpaper.mpRect;
133 : }
134 :
135 0 : if( bGrad )
136 : {
137 0 : rImplWallpaper.mpGradient = new Gradient;
138 0 : rIStm >> *rImplWallpaper.mpGradient;
139 : }
140 :
141 0 : if( bBmp )
142 : {
143 0 : rImplWallpaper.mpBitmap = new BitmapEx;
144 0 : rIStm >> *rImplWallpaper.mpBitmap;
145 : }
146 :
147 : // version 3 (new color format)
148 0 : if( aCompat.GetVersion() >= 3 )
149 : {
150 0 : rImplWallpaper.maColor.Read( rIStm, sal_True );
151 : }
152 : }
153 :
154 0 : return rIStm;
155 : }
156 :
157 : // -----------------------------------------------------------------------
158 :
159 0 : SvStream& operator<<( SvStream& rOStm, const ImplWallpaper& rImplWallpaper )
160 : {
161 0 : VersionCompat aCompat( rOStm, STREAM_WRITE, 3 );
162 0 : sal_Bool bRect = ( rImplWallpaper.mpRect != NULL );
163 0 : sal_Bool bGrad = ( rImplWallpaper.mpGradient != NULL );
164 0 : sal_Bool bBmp = ( rImplWallpaper.mpBitmap != NULL );
165 0 : sal_Bool bDummy = sal_False;
166 :
167 : // version 1
168 0 : rOStm << rImplWallpaper.maColor << (sal_uInt16) rImplWallpaper.meStyle;
169 :
170 : // version 2
171 0 : rOStm << bRect << bGrad << bBmp << bDummy << bDummy << bDummy;
172 :
173 0 : if( bRect )
174 0 : rOStm << *rImplWallpaper.mpRect;
175 :
176 0 : if( bGrad )
177 0 : rOStm << *rImplWallpaper.mpGradient;
178 :
179 0 : if( bBmp )
180 0 : rOStm << *rImplWallpaper.mpBitmap;
181 :
182 : // version 3 (new color format)
183 0 : ( (Color&) rImplWallpaper.maColor ).Write( rOStm, sal_True );
184 :
185 0 : return rOStm;
186 : }
187 :
188 : // -----------------------------------------------------------------------
189 :
190 4312 : inline void Wallpaper::ImplMakeUnique( sal_Bool bReleaseCache )
191 : {
192 : // Falls noch andere Referenzen bestehen, dann kopieren
193 4312 : if ( mpImplWallpaper->mnRefCount != 1 )
194 : {
195 2156 : if ( mpImplWallpaper->mnRefCount )
196 0 : mpImplWallpaper->mnRefCount--;
197 2156 : mpImplWallpaper = new ImplWallpaper( *(mpImplWallpaper) );
198 : }
199 :
200 4312 : if( bReleaseCache )
201 2156 : mpImplWallpaper->ImplReleaseCachedBitmap();
202 4312 : }
203 :
204 : // -----------------------------------------------------------------------
205 :
206 23609 : Wallpaper::Wallpaper()
207 : {
208 : DBG_CTOR( Wallpaper, NULL );
209 :
210 23609 : static ImplWallpaper aStaticImplWallpaper;
211 :
212 23609 : aStaticImplWallpaper.mnRefCount = 0;
213 23609 : mpImplWallpaper = &aStaticImplWallpaper;
214 23609 : }
215 :
216 : // -----------------------------------------------------------------------
217 :
218 1559 : Wallpaper::Wallpaper( const Wallpaper& rWallpaper )
219 : {
220 : DBG_CTOR( Wallpaper, NULL );
221 : DBG_CHKOBJ( &rWallpaper, Wallpaper, NULL );
222 : DBG_ASSERT( rWallpaper.mpImplWallpaper->mnRefCount < 0xFFFFFFFE, "Wallpaper: RefCount overflow" );
223 :
224 : // Instance Daten uebernehmen und Referenzcounter erhoehen
225 1559 : mpImplWallpaper = rWallpaper.mpImplWallpaper;
226 : // RefCount == 0 fuer statische Objekte
227 1559 : if ( mpImplWallpaper->mnRefCount )
228 1559 : mpImplWallpaper->mnRefCount++;
229 1559 : }
230 :
231 : // -----------------------------------------------------------------------
232 :
233 25232 : Wallpaper::Wallpaper( const Color& rColor )
234 : {
235 : DBG_CTOR( Wallpaper, NULL );
236 :
237 25232 : mpImplWallpaper = new ImplWallpaper;
238 25232 : mpImplWallpaper->maColor = rColor;
239 25232 : mpImplWallpaper->meStyle = WALLPAPER_TILE;
240 25232 : }
241 :
242 : // -----------------------------------------------------------------------
243 :
244 0 : Wallpaper::Wallpaper( const BitmapEx& rBmpEx )
245 : {
246 : DBG_CTOR( Wallpaper, NULL );
247 :
248 0 : mpImplWallpaper = new ImplWallpaper;
249 0 : mpImplWallpaper->mpBitmap = new BitmapEx( rBmpEx );
250 0 : mpImplWallpaper->meStyle = WALLPAPER_TILE;
251 0 : }
252 :
253 : // -----------------------------------------------------------------------
254 :
255 35 : Wallpaper::Wallpaper( const Gradient& rGradient )
256 : {
257 : DBG_CTOR( Wallpaper, NULL );
258 :
259 35 : mpImplWallpaper = new ImplWallpaper;
260 35 : mpImplWallpaper->mpGradient = new Gradient( rGradient );
261 35 : mpImplWallpaper->meStyle = WALLPAPER_TILE;
262 35 : }
263 :
264 : // -----------------------------------------------------------------------
265 :
266 41069 : Wallpaper::~Wallpaper()
267 : {
268 : DBG_DTOR( Wallpaper, NULL );
269 :
270 : // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
271 : // die letzte Referenz ist, sonst Referenzcounter decrementieren
272 41069 : if ( mpImplWallpaper->mnRefCount )
273 : {
274 36803 : if ( mpImplWallpaper->mnRefCount == 1 )
275 7601 : delete mpImplWallpaper;
276 : else
277 29202 : mpImplWallpaper->mnRefCount--;
278 : }
279 41069 : }
280 :
281 : // -----------------------------------------------------------------------
282 :
283 0 : void Wallpaper::SetColor( const Color& rColor )
284 : {
285 : DBG_CHKTHIS( Wallpaper, NULL );
286 :
287 0 : ImplMakeUnique();
288 0 : mpImplWallpaper->maColor = rColor;
289 :
290 0 : if( WALLPAPER_NULL == mpImplWallpaper->meStyle || WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle )
291 0 : mpImplWallpaper->meStyle = WALLPAPER_TILE;
292 0 : }
293 :
294 : // -----------------------------------------------------------------------
295 :
296 42650 : const Color& Wallpaper::GetColor() const
297 : {
298 : DBG_CHKTHIS( Wallpaper, NULL );
299 :
300 42650 : return mpImplWallpaper->maColor;
301 : }
302 :
303 : // -----------------------------------------------------------------------
304 :
305 2156 : void Wallpaper::SetStyle( WallpaperStyle eStyle )
306 : {
307 : DBG_CHKTHIS( Wallpaper, NULL );
308 :
309 2156 : ImplMakeUnique( sal_False );
310 :
311 2156 : if( eStyle == WALLPAPER_APPLICATIONGRADIENT )
312 : // set a dummy gradient, the correct gradient
313 : // will be created dynamically in GetGradient()
314 2156 : SetGradient( ImplGetApplicationGradient() );
315 :
316 2156 : mpImplWallpaper->meStyle = eStyle;
317 2156 : }
318 :
319 : // -----------------------------------------------------------------------
320 :
321 29912 : WallpaperStyle Wallpaper::GetStyle() const
322 : {
323 : DBG_CHKTHIS( Wallpaper, NULL );
324 :
325 29912 : return mpImplWallpaper->meStyle;
326 : }
327 :
328 : // -----------------------------------------------------------------------
329 :
330 0 : void Wallpaper::SetBitmap( const BitmapEx& rBitmap )
331 : {
332 : DBG_CHKTHIS( Wallpaper, NULL );
333 :
334 0 : if ( !rBitmap )
335 : {
336 0 : if ( mpImplWallpaper->mpBitmap )
337 : {
338 0 : ImplMakeUnique();
339 0 : delete mpImplWallpaper->mpBitmap;
340 0 : mpImplWallpaper->mpBitmap = NULL;
341 : }
342 : }
343 : else
344 : {
345 0 : ImplMakeUnique();
346 0 : if ( mpImplWallpaper->mpBitmap )
347 0 : *(mpImplWallpaper->mpBitmap) = rBitmap;
348 : else
349 0 : mpImplWallpaper->mpBitmap = new BitmapEx( rBitmap );
350 : }
351 :
352 0 : if( WALLPAPER_NULL == mpImplWallpaper->meStyle || WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle)
353 0 : mpImplWallpaper->meStyle = WALLPAPER_TILE;
354 0 : }
355 :
356 : // -----------------------------------------------------------------------
357 :
358 0 : BitmapEx Wallpaper::GetBitmap() const
359 : {
360 : DBG_CHKTHIS( Wallpaper, NULL );
361 :
362 0 : if ( mpImplWallpaper->mpBitmap )
363 0 : return *(mpImplWallpaper->mpBitmap);
364 : else
365 : {
366 0 : BitmapEx aBmp;
367 0 : return aBmp;
368 : }
369 : }
370 :
371 : // -----------------------------------------------------------------------
372 :
373 12536 : sal_Bool Wallpaper::IsBitmap() const
374 : {
375 : DBG_CHKTHIS( Wallpaper, NULL );
376 :
377 12536 : return (mpImplWallpaper->mpBitmap != 0);
378 : }
379 :
380 :
381 : // -----------------------------------------------------------------------
382 :
383 2156 : void Wallpaper::SetGradient( const Gradient& rGradient )
384 : {
385 : DBG_CHKTHIS( Wallpaper, NULL );
386 :
387 2156 : ImplMakeUnique();
388 :
389 2156 : if ( mpImplWallpaper->mpGradient )
390 0 : *(mpImplWallpaper->mpGradient) = rGradient;
391 : else
392 2156 : mpImplWallpaper->mpGradient = new Gradient( rGradient );
393 :
394 2156 : if( WALLPAPER_NULL == mpImplWallpaper->meStyle || WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle )
395 2156 : mpImplWallpaper->meStyle = WALLPAPER_TILE;
396 2156 : }
397 :
398 : // -----------------------------------------------------------------------
399 :
400 612 : Gradient Wallpaper::GetGradient() const
401 : {
402 : DBG_CHKTHIS( Wallpaper, NULL );
403 :
404 612 : if( WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle )
405 612 : return ImplGetApplicationGradient();
406 0 : else if ( mpImplWallpaper->mpGradient )
407 0 : return *(mpImplWallpaper->mpGradient);
408 : else
409 : {
410 0 : Gradient aGradient;
411 0 : return aGradient;
412 : }
413 : }
414 :
415 : // -----------------------------------------------------------------------
416 :
417 23010 : sal_Bool Wallpaper::IsGradient() const
418 : {
419 : DBG_CHKTHIS( Wallpaper, NULL );
420 :
421 23010 : return (mpImplWallpaper->mpGradient != 0);
422 : }
423 :
424 :
425 : // -----------------------------------------------------------------------
426 :
427 2768 : Gradient Wallpaper::ImplGetApplicationGradient() const
428 : {
429 2768 : Gradient g;
430 2768 : g.SetAngle( 900 );
431 2768 : g.SetStyle( GradientStyle_LINEAR );
432 2768 : g.SetStartColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
433 : // no 'extreme' gradient when high contrast
434 2768 : if( Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
435 0 : g.SetEndColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
436 : else
437 2768 : g.SetEndColor( Application::GetSettings().GetStyleSettings().GetFaceGradientColor() );
438 2768 : return g;
439 : }
440 :
441 : // -----------------------------------------------------------------------
442 :
443 0 : void Wallpaper::SetRect( const Rectangle& rRect )
444 : {
445 : DBG_CHKTHIS( Wallpaper, NULL );
446 :
447 0 : ImplMakeUnique( sal_False );
448 :
449 0 : if ( rRect.IsEmpty() )
450 : {
451 0 : if ( mpImplWallpaper->mpRect )
452 : {
453 0 : delete mpImplWallpaper->mpRect;
454 0 : mpImplWallpaper->mpRect = NULL;
455 : }
456 : }
457 : else
458 : {
459 0 : if ( mpImplWallpaper->mpRect )
460 0 : *(mpImplWallpaper->mpRect) = rRect;
461 : else
462 0 : mpImplWallpaper->mpRect = new Rectangle( rRect );
463 : }
464 0 : }
465 :
466 : // -----------------------------------------------------------------------
467 :
468 0 : Rectangle Wallpaper::GetRect() const
469 : {
470 : DBG_CHKTHIS( Wallpaper, NULL );
471 :
472 0 : if ( mpImplWallpaper->mpRect )
473 0 : return *(mpImplWallpaper->mpRect);
474 : else
475 : {
476 0 : Rectangle aRect;
477 0 : return aRect;
478 : }
479 : }
480 :
481 : // -----------------------------------------------------------------------
482 :
483 0 : sal_Bool Wallpaper::IsRect() const
484 : {
485 : DBG_CHKTHIS( Wallpaper, NULL );
486 :
487 0 : return (mpImplWallpaper->mpRect != 0);
488 : }
489 :
490 :
491 : // -----------------------------------------------------------------------
492 :
493 0 : sal_Bool Wallpaper::IsFixed() const
494 : {
495 0 : if ( mpImplWallpaper->meStyle == WALLPAPER_NULL )
496 0 : return sal_False;
497 : else
498 0 : return (!mpImplWallpaper->mpBitmap && !mpImplWallpaper->mpGradient);
499 : }
500 :
501 : // -----------------------------------------------------------------------
502 :
503 0 : sal_Bool Wallpaper::IsScrollable() const
504 : {
505 0 : if ( mpImplWallpaper->meStyle == WALLPAPER_NULL )
506 0 : return sal_False;
507 0 : else if ( !mpImplWallpaper->mpBitmap && !mpImplWallpaper->mpGradient )
508 0 : return sal_True;
509 0 : else if ( mpImplWallpaper->mpBitmap )
510 0 : return (mpImplWallpaper->meStyle == WALLPAPER_TILE);
511 : else
512 0 : return sal_False;
513 : }
514 :
515 : // -----------------------------------------------------------------------
516 :
517 31298 : Wallpaper& Wallpaper::operator=( const Wallpaper& rWallpaper )
518 : {
519 : DBG_CHKTHIS( Wallpaper, NULL );
520 : DBG_CHKOBJ( &rWallpaper, Wallpaper, NULL );
521 : DBG_ASSERT( rWallpaper.mpImplWallpaper->mnRefCount < 0xFFFFFFFE, "Wallpaper: RefCount overflow" );
522 :
523 : // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
524 31298 : if ( rWallpaper.mpImplWallpaper->mnRefCount )
525 28371 : rWallpaper.mpImplWallpaper->mnRefCount++;
526 :
527 : // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
528 : // die letzte Referenz ist, sonst Referenzcounter decrementieren
529 31298 : if ( mpImplWallpaper->mnRefCount )
530 : {
531 14053 : if ( mpImplWallpaper->mnRefCount == 1 )
532 14044 : delete mpImplWallpaper;
533 : else
534 9 : mpImplWallpaper->mnRefCount--;
535 : }
536 :
537 31298 : mpImplWallpaper = rWallpaper.mpImplWallpaper;
538 :
539 31298 : return *this;
540 : }
541 :
542 : // -----------------------------------------------------------------------
543 :
544 0 : sal_Bool Wallpaper::operator==( const Wallpaper& rWallpaper ) const
545 : {
546 : DBG_CHKTHIS( Wallpaper, NULL );
547 : DBG_CHKOBJ( &rWallpaper, Wallpaper, NULL );
548 :
549 0 : if ( mpImplWallpaper == rWallpaper.mpImplWallpaper )
550 0 : return sal_True;
551 :
552 0 : if ( ( mpImplWallpaper->meStyle != rWallpaper.mpImplWallpaper->meStyle ) ||
553 0 : ( mpImplWallpaper->maColor != rWallpaper.mpImplWallpaper->maColor ) )
554 0 : return sal_False;
555 :
556 0 : if ( mpImplWallpaper->mpRect != rWallpaper.mpImplWallpaper->mpRect
557 0 : && ( !mpImplWallpaper->mpRect
558 0 : || !rWallpaper.mpImplWallpaper->mpRect
559 0 : || *(mpImplWallpaper->mpRect) != *(rWallpaper.mpImplWallpaper->mpRect) ) )
560 0 : return sal_False;
561 :
562 0 : if ( mpImplWallpaper->mpBitmap != rWallpaper.mpImplWallpaper->mpBitmap
563 0 : && ( !mpImplWallpaper->mpBitmap
564 0 : || !rWallpaper.mpImplWallpaper->mpBitmap
565 0 : || *(mpImplWallpaper->mpBitmap) != *(rWallpaper.mpImplWallpaper->mpBitmap) ) )
566 0 : return sal_False;
567 :
568 0 : if ( mpImplWallpaper->mpGradient != rWallpaper.mpImplWallpaper->mpGradient
569 0 : && ( !mpImplWallpaper->mpGradient
570 0 : || !rWallpaper.mpImplWallpaper->mpGradient
571 0 : || *(mpImplWallpaper->mpGradient) != *(rWallpaper.mpImplWallpaper->mpGradient) ) )
572 0 : return sal_False;
573 :
574 0 : return sal_True;
575 : }
576 :
577 : // -----------------------------------------------------------------------
578 :
579 0 : SvStream& operator>>( SvStream& rIStm, Wallpaper& rWallpaper )
580 : {
581 0 : rWallpaper.ImplMakeUnique();
582 0 : return( rIStm >> *rWallpaper.mpImplWallpaper );
583 : }
584 :
585 : // -----------------------------------------------------------------------
586 :
587 0 : SvStream& operator<<( SvStream& rOStm, const Wallpaper& rWallpaper )
588 : {
589 0 : return( rOStm << *rWallpaper.mpImplWallpaper );
590 : }
591 :
592 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|