| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_vcl.hxx" |
| |
| #include <tools/stream.hxx> |
| #include <tools/vcompat.hxx> |
| #include <tools/debug.hxx> |
| #include <vcl/bitmapex.hxx> |
| #include <vcl/gradient.hxx> |
| #include <vcl/wall.hxx> |
| #include <vcl/svapp.hxx> |
| #include <wall2.hxx> |
| #include <vcl/dibtools.hxx> |
| |
| DBG_NAME( Wallpaper ) |
| |
| // ----------------------------------------------------------------------- |
| |
| ImplWallpaper::ImplWallpaper() : |
| maColor( COL_TRANSPARENT ) |
| { |
| mnRefCount = 1; |
| mpBitmap = NULL; |
| mpCache = NULL; |
| mpGradient = NULL; |
| mpRect = NULL; |
| meStyle = WALLPAPER_NULL; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| ImplWallpaper::ImplWallpaper( const ImplWallpaper& rImplWallpaper ) : |
| maColor( rImplWallpaper.maColor ) |
| { |
| mnRefCount = 1; |
| meStyle = rImplWallpaper.meStyle; |
| |
| if ( rImplWallpaper.mpBitmap ) |
| mpBitmap = new BitmapEx( *rImplWallpaper.mpBitmap ); |
| else |
| mpBitmap = NULL; |
| if( rImplWallpaper.mpCache ) |
| mpCache = new BitmapEx( *rImplWallpaper.mpCache ); |
| else |
| mpCache = NULL; |
| if ( rImplWallpaper.mpGradient ) |
| mpGradient = new Gradient( *rImplWallpaper.mpGradient ); |
| else |
| mpGradient = NULL; |
| if ( rImplWallpaper.mpRect ) |
| mpRect = new Rectangle( *rImplWallpaper.mpRect ); |
| else |
| mpRect = NULL; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| ImplWallpaper::~ImplWallpaper() |
| { |
| delete mpBitmap; |
| delete mpCache; |
| delete mpGradient; |
| delete mpRect; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void ImplWallpaper::ImplSetCachedBitmap( BitmapEx& rBmp ) |
| { |
| if( !mpCache ) |
| mpCache = new BitmapEx( rBmp ); |
| else |
| *mpCache = rBmp; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void ImplWallpaper::ImplReleaseCachedBitmap() |
| { |
| delete mpCache; |
| mpCache = NULL; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvStream& operator>>( SvStream& rIStm, ImplWallpaper& rImplWallpaper ) |
| { |
| VersionCompat aCompat( rIStm, STREAM_READ ); |
| sal_uInt16 nTmp16; |
| |
| delete rImplWallpaper.mpRect; |
| rImplWallpaper.mpRect = NULL; |
| |
| delete rImplWallpaper.mpGradient; |
| rImplWallpaper.mpGradient = NULL; |
| |
| delete rImplWallpaper.mpBitmap; |
| rImplWallpaper.mpBitmap = NULL; |
| |
| // version 1 |
| rIStm >> rImplWallpaper.maColor; |
| rIStm >> nTmp16; rImplWallpaper.meStyle = (WallpaperStyle) nTmp16; |
| |
| // version 2 |
| if( aCompat.GetVersion() >= 2 ) |
| { |
| sal_Bool bRect, bGrad, bBmp, bDummy; |
| |
| rIStm >> bRect >> bGrad >> bBmp >> bDummy >> bDummy >> bDummy; |
| |
| if( bRect ) |
| { |
| rImplWallpaper.mpRect = new Rectangle; |
| rIStm >> *rImplWallpaper.mpRect; |
| } |
| |
| if( bGrad ) |
| { |
| rImplWallpaper.mpGradient = new Gradient; |
| rIStm >> *rImplWallpaper.mpGradient; |
| } |
| |
| if( bBmp ) |
| { |
| rImplWallpaper.mpBitmap = new BitmapEx; |
| ReadDIBBitmapEx(*rImplWallpaper.mpBitmap, rIStm); |
| } |
| |
| // version 3 (new color format) |
| if( aCompat.GetVersion() >= 3 ) |
| { |
| rImplWallpaper.maColor.Read( rIStm, sal_True ); |
| } |
| } |
| |
| return rIStm; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvStream& operator<<( SvStream& rOStm, const ImplWallpaper& rImplWallpaper ) |
| { |
| VersionCompat aCompat( rOStm, STREAM_WRITE, 3 ); |
| sal_Bool bRect = ( rImplWallpaper.mpRect != NULL ); |
| sal_Bool bGrad = ( rImplWallpaper.mpGradient != NULL ); |
| sal_Bool bBmp = ( rImplWallpaper.mpBitmap != NULL ); |
| sal_Bool bDummy = sal_False; |
| |
| // version 1 |
| rOStm << rImplWallpaper.maColor << (sal_uInt16) rImplWallpaper.meStyle; |
| |
| // version 2 |
| rOStm << bRect << bGrad << bBmp << bDummy << bDummy << bDummy; |
| |
| if( bRect ) |
| rOStm << *rImplWallpaper.mpRect; |
| |
| if( bGrad ) |
| rOStm << *rImplWallpaper.mpGradient; |
| |
| if( bBmp ) |
| WriteDIBBitmapEx(*rImplWallpaper.mpBitmap, rOStm); |
| |
| // version 3 (new color format) |
| ( (Color&) rImplWallpaper.maColor ).Write( rOStm, sal_True ); |
| |
| return rOStm; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| inline void Wallpaper::ImplMakeUnique( sal_Bool bReleaseCache ) |
| { |
| // Falls noch andere Referenzen bestehen, dann kopieren |
| if ( mpImplWallpaper->mnRefCount != 1 ) |
| { |
| if ( mpImplWallpaper->mnRefCount ) |
| mpImplWallpaper->mnRefCount--; |
| mpImplWallpaper = new ImplWallpaper( *(mpImplWallpaper) ); |
| } |
| |
| if( bReleaseCache ) |
| mpImplWallpaper->ImplReleaseCachedBitmap(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Wallpaper::Wallpaper() |
| { |
| DBG_CTOR( Wallpaper, NULL ); |
| |
| static ImplWallpaper aStaticImplWallpaper; |
| |
| aStaticImplWallpaper.mnRefCount = 0; |
| mpImplWallpaper = &aStaticImplWallpaper; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Wallpaper::Wallpaper( const Wallpaper& rWallpaper ) |
| { |
| DBG_CTOR( Wallpaper, NULL ); |
| DBG_CHKOBJ( &rWallpaper, Wallpaper, NULL ); |
| DBG_ASSERT( rWallpaper.mpImplWallpaper->mnRefCount < 0xFFFFFFFE, "Wallpaper: RefCount overflow" ); |
| |
| // Instance Daten uebernehmen und Referenzcounter erhoehen |
| mpImplWallpaper = rWallpaper.mpImplWallpaper; |
| // RefCount == 0 fuer statische Objekte |
| if ( mpImplWallpaper->mnRefCount ) |
| mpImplWallpaper->mnRefCount++; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Wallpaper::Wallpaper( const Color& rColor ) |
| { |
| DBG_CTOR( Wallpaper, NULL ); |
| |
| mpImplWallpaper = new ImplWallpaper; |
| mpImplWallpaper->maColor = rColor; |
| mpImplWallpaper->meStyle = WALLPAPER_TILE; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Wallpaper::Wallpaper( const BitmapEx& rBmpEx ) |
| { |
| DBG_CTOR( Wallpaper, NULL ); |
| |
| mpImplWallpaper = new ImplWallpaper; |
| mpImplWallpaper->mpBitmap = new BitmapEx( rBmpEx ); |
| mpImplWallpaper->meStyle = WALLPAPER_TILE; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Wallpaper::Wallpaper( const Gradient& rGradient ) |
| { |
| DBG_CTOR( Wallpaper, NULL ); |
| |
| mpImplWallpaper = new ImplWallpaper; |
| mpImplWallpaper->mpGradient = new Gradient( rGradient ); |
| mpImplWallpaper->meStyle = WALLPAPER_TILE; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Wallpaper::~Wallpaper() |
| { |
| DBG_DTOR( Wallpaper, NULL ); |
| |
| // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es |
| // die letzte Referenz ist, sonst Referenzcounter decrementieren |
| if ( mpImplWallpaper->mnRefCount ) |
| { |
| if ( mpImplWallpaper->mnRefCount == 1 ) |
| delete mpImplWallpaper; |
| else |
| mpImplWallpaper->mnRefCount--; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetColor( const Color& rColor ) |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| ImplMakeUnique(); |
| mpImplWallpaper->maColor = rColor; |
| |
| if( WALLPAPER_NULL == mpImplWallpaper->meStyle || WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle ) |
| mpImplWallpaper->meStyle = WALLPAPER_TILE; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| const Color& Wallpaper::GetColor() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| return mpImplWallpaper->maColor; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetStyle( WallpaperStyle eStyle ) |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| ImplMakeUnique( sal_False ); |
| |
| if( eStyle == WALLPAPER_APPLICATIONGRADIENT ) |
| // set a dummy gradient, the correct gradient |
| // will be created dynamically in GetGradient() |
| SetGradient( ImplGetApplicationGradient() ); |
| |
| mpImplWallpaper->meStyle = eStyle; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| WallpaperStyle Wallpaper::GetStyle() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| return mpImplWallpaper->meStyle; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetBitmap( const BitmapEx& rBitmap ) |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| if ( !rBitmap ) |
| { |
| if ( mpImplWallpaper->mpBitmap ) |
| { |
| ImplMakeUnique(); |
| delete mpImplWallpaper->mpBitmap; |
| mpImplWallpaper->mpBitmap = NULL; |
| } |
| } |
| else |
| { |
| ImplMakeUnique(); |
| if ( mpImplWallpaper->mpBitmap ) |
| *(mpImplWallpaper->mpBitmap) = rBitmap; |
| else |
| mpImplWallpaper->mpBitmap = new BitmapEx( rBitmap ); |
| } |
| |
| if( WALLPAPER_NULL == mpImplWallpaper->meStyle || WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle) |
| mpImplWallpaper->meStyle = WALLPAPER_TILE; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetBitmap() |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| if ( mpImplWallpaper->mpBitmap ) |
| { |
| ImplMakeUnique(); |
| delete mpImplWallpaper->mpBitmap; |
| mpImplWallpaper->mpBitmap = NULL; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| BitmapEx Wallpaper::GetBitmap() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| if ( mpImplWallpaper->mpBitmap ) |
| return *(mpImplWallpaper->mpBitmap); |
| else |
| { |
| BitmapEx aBmp; |
| return aBmp; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Wallpaper::IsBitmap() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| return (mpImplWallpaper->mpBitmap != 0); |
| } |
| |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetGradient( const Gradient& rGradient ) |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| ImplMakeUnique(); |
| |
| if ( mpImplWallpaper->mpGradient ) |
| *(mpImplWallpaper->mpGradient) = rGradient; |
| else |
| mpImplWallpaper->mpGradient = new Gradient( rGradient ); |
| |
| if( WALLPAPER_NULL == mpImplWallpaper->meStyle || WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle ) |
| mpImplWallpaper->meStyle = WALLPAPER_TILE; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetGradient() |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| if ( mpImplWallpaper->mpGradient ) |
| { |
| ImplMakeUnique(); |
| delete mpImplWallpaper->mpGradient; |
| mpImplWallpaper->mpGradient = NULL; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Gradient Wallpaper::GetGradient() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| if( WALLPAPER_APPLICATIONGRADIENT == mpImplWallpaper->meStyle ) |
| return ImplGetApplicationGradient(); |
| else if ( mpImplWallpaper->mpGradient ) |
| return *(mpImplWallpaper->mpGradient); |
| else |
| { |
| Gradient aGradient; |
| return aGradient; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Wallpaper::IsGradient() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| return (mpImplWallpaper->mpGradient != 0); |
| } |
| |
| |
| // ----------------------------------------------------------------------- |
| |
| Gradient Wallpaper::ImplGetApplicationGradient() const |
| { |
| Gradient g; |
| g.SetAngle( 900 ); |
| g.SetStyle( GRADIENT_LINEAR ); |
| g.SetStartColor( Application::GetSettings().GetStyleSettings().GetFaceColor() ); |
| // no 'extreme' gradient when high contrast |
| if( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) |
| g.SetEndColor( Application::GetSettings().GetStyleSettings().GetFaceColor() ); |
| else |
| g.SetEndColor( Application::GetSettings().GetStyleSettings().GetFaceGradientColor() ); |
| return g; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetRect( const Rectangle& rRect ) |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| ImplMakeUnique( sal_False ); |
| |
| if ( rRect.IsEmpty() ) |
| { |
| if ( mpImplWallpaper->mpRect ) |
| { |
| delete mpImplWallpaper->mpRect; |
| mpImplWallpaper->mpRect = NULL; |
| } |
| } |
| else |
| { |
| if ( mpImplWallpaper->mpRect ) |
| *(mpImplWallpaper->mpRect) = rRect; |
| else |
| mpImplWallpaper->mpRect = new Rectangle( rRect ); |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void Wallpaper::SetRect() |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| if ( mpImplWallpaper->mpRect ) |
| { |
| ImplMakeUnique( sal_False ); |
| delete mpImplWallpaper->mpRect; |
| mpImplWallpaper->mpRect = NULL; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Rectangle Wallpaper::GetRect() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| if ( mpImplWallpaper->mpRect ) |
| return *(mpImplWallpaper->mpRect); |
| else |
| { |
| Rectangle aRect; |
| return aRect; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Wallpaper::IsRect() const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| |
| return (mpImplWallpaper->mpRect != 0); |
| } |
| |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Wallpaper::IsFixed() const |
| { |
| if ( mpImplWallpaper->meStyle == WALLPAPER_NULL ) |
| return sal_False; |
| else |
| return (!mpImplWallpaper->mpBitmap && !mpImplWallpaper->mpGradient); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Wallpaper::IsScrollable() const |
| { |
| if ( mpImplWallpaper->meStyle == WALLPAPER_NULL ) |
| return sal_False; |
| else if ( !mpImplWallpaper->mpBitmap && !mpImplWallpaper->mpGradient ) |
| return sal_True; |
| else if ( mpImplWallpaper->mpBitmap ) |
| return (mpImplWallpaper->meStyle == WALLPAPER_TILE); |
| else |
| return sal_False; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| Wallpaper& Wallpaper::operator=( const Wallpaper& rWallpaper ) |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| DBG_CHKOBJ( &rWallpaper, Wallpaper, NULL ); |
| DBG_ASSERT( rWallpaper.mpImplWallpaper->mnRefCount < 0xFFFFFFFE, "Wallpaper: RefCount overflow" ); |
| |
| // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann |
| if ( rWallpaper.mpImplWallpaper->mnRefCount ) |
| rWallpaper.mpImplWallpaper->mnRefCount++; |
| |
| // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es |
| // die letzte Referenz ist, sonst Referenzcounter decrementieren |
| if ( mpImplWallpaper->mnRefCount ) |
| { |
| if ( mpImplWallpaper->mnRefCount == 1 ) |
| delete mpImplWallpaper; |
| else |
| mpImplWallpaper->mnRefCount--; |
| } |
| |
| mpImplWallpaper = rWallpaper.mpImplWallpaper; |
| |
| return *this; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_Bool Wallpaper::operator==( const Wallpaper& rWallpaper ) const |
| { |
| DBG_CHKTHIS( Wallpaper, NULL ); |
| DBG_CHKOBJ( &rWallpaper, Wallpaper, NULL ); |
| |
| if ( mpImplWallpaper == rWallpaper.mpImplWallpaper ) |
| return sal_True; |
| |
| if ( ( mpImplWallpaper->meStyle != rWallpaper.mpImplWallpaper->meStyle ) || |
| ( mpImplWallpaper->maColor != rWallpaper.mpImplWallpaper->maColor ) ) |
| return sal_False; |
| |
| if ( mpImplWallpaper->mpRect != rWallpaper.mpImplWallpaper->mpRect |
| && ( !mpImplWallpaper->mpRect |
| || !rWallpaper.mpImplWallpaper->mpRect |
| || *(mpImplWallpaper->mpRect) != *(rWallpaper.mpImplWallpaper->mpRect) ) ) |
| return sal_False; |
| |
| if ( mpImplWallpaper->mpBitmap != rWallpaper.mpImplWallpaper->mpBitmap |
| && ( !mpImplWallpaper->mpBitmap |
| || !rWallpaper.mpImplWallpaper->mpBitmap |
| || *(mpImplWallpaper->mpBitmap) != *(rWallpaper.mpImplWallpaper->mpBitmap) ) ) |
| return sal_False; |
| |
| if ( mpImplWallpaper->mpGradient != rWallpaper.mpImplWallpaper->mpGradient |
| && ( !mpImplWallpaper->mpGradient |
| || !rWallpaper.mpImplWallpaper->mpGradient |
| || *(mpImplWallpaper->mpGradient) != *(rWallpaper.mpImplWallpaper->mpGradient) ) ) |
| return sal_False; |
| |
| return sal_True; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvStream& operator>>( SvStream& rIStm, Wallpaper& rWallpaper ) |
| { |
| rWallpaper.ImplMakeUnique(); |
| return( rIStm >> *rWallpaper.mpImplWallpaper ); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| SvStream& operator<<( SvStream& rOStm, const Wallpaper& rWallpaper ) |
| { |
| return( rOStm << *rWallpaper.mpImplWallpaper ); |
| } |