diff options
Diffstat (limited to 'vcl/source/gdi/gradient.cxx')
-rw-r--r-- | vcl/source/gdi/gradient.cxx | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/vcl/source/gdi/gradient.cxx b/vcl/source/gdi/gradient.cxx new file mode 100644 index 000000000000..9856e2213d85 --- /dev/null +++ b/vcl/source/gdi/gradient.cxx @@ -0,0 +1,344 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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/gradient.hxx> + +// ======================================================================= + +DBG_NAME( Gradient ) + +// ----------------------------------------------------------------------- + +Impl_Gradient::Impl_Gradient() : + maStartColor( COL_BLACK ), + maEndColor( COL_WHITE ) +{ + mnRefCount = 1; + meStyle = GRADIENT_LINEAR; + mnAngle = 0; + mnBorder = 0; + mnOfsX = 50; + mnOfsY = 50; + mnIntensityStart = 100; + mnIntensityEnd = 100; + mnStepCount = 0; +} + +// ----------------------------------------------------------------------- + +Impl_Gradient::Impl_Gradient( const Impl_Gradient& rImplGradient ) : + maStartColor( rImplGradient.maStartColor ), + maEndColor( rImplGradient.maEndColor ) +{ + mnRefCount = 1; + meStyle = rImplGradient.meStyle; + mnAngle = rImplGradient.mnAngle; + mnBorder = rImplGradient.mnBorder; + mnOfsX = rImplGradient.mnOfsX; + mnOfsY = rImplGradient.mnOfsY; + mnIntensityStart = rImplGradient.mnIntensityStart; + mnIntensityEnd = rImplGradient.mnIntensityEnd; + mnStepCount = rImplGradient.mnStepCount; +} + +// ----------------------------------------------------------------------- + +void Gradient::MakeUnique() +{ + // Falls noch andere Referenzen bestehen, dann kopieren + if ( mpImplGradient->mnRefCount != 1 ) + { + if( mpImplGradient->mnRefCount ) + mpImplGradient->mnRefCount--; + + mpImplGradient = new Impl_Gradient( *mpImplGradient ); + } +} + +// ----------------------------------------------------------------------- + +Gradient::Gradient() +{ + DBG_CTOR( Gradient, NULL ); + + mpImplGradient = new Impl_Gradient; +} + +// ----------------------------------------------------------------------- + +Gradient::Gradient( const Gradient& rGradient ) +{ + DBG_CTOR( Gradient, NULL ); + DBG_CHKOBJ( &rGradient, Gradient, NULL ); + + // Instance Daten uebernehmen und Referenzcounter erhoehen + mpImplGradient = rGradient.mpImplGradient; + mpImplGradient->mnRefCount++; +} + +// ----------------------------------------------------------------------- + +Gradient::Gradient( GradientStyle eStyle ) +{ + DBG_CTOR( Gradient, NULL ); + + mpImplGradient = new Impl_Gradient; + mpImplGradient->meStyle = eStyle; +} + +// ----------------------------------------------------------------------- + +Gradient::Gradient( GradientStyle eStyle, + const Color& rStartColor, const Color& rEndColor ) +{ + DBG_CTOR( Gradient, NULL ); + + mpImplGradient = new Impl_Gradient; + mpImplGradient->meStyle = eStyle; + mpImplGradient->maStartColor = rStartColor; + mpImplGradient->maEndColor = rEndColor; +} + +// ----------------------------------------------------------------------- + +Gradient::~Gradient() +{ + DBG_DTOR( Gradient, NULL ); + + // Wenn es die letzte Referenz ist, loeschen, + // sonst Referenzcounter decrementieren + if ( mpImplGradient->mnRefCount == 1 ) + delete mpImplGradient; + else + mpImplGradient->mnRefCount--; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetStyle( GradientStyle eStyle ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->meStyle = eStyle; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetStartColor( const Color& rColor ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->maStartColor = rColor; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetEndColor( const Color& rColor ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->maEndColor = rColor; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetAngle( USHORT nAngle ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->mnAngle = nAngle; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetBorder( USHORT nBorder ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->mnBorder = nBorder; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetOfsX( USHORT nOfsX ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->mnOfsX = nOfsX; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetOfsY( USHORT nOfsY ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->mnOfsY = nOfsY; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetStartIntensity( USHORT nIntens ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->mnIntensityStart = nIntens; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetEndIntensity( USHORT nIntens ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->mnIntensityEnd = nIntens; +} + +// ----------------------------------------------------------------------- + +void Gradient::SetSteps( USHORT nSteps ) +{ + DBG_CHKTHIS( Gradient, NULL ); + + MakeUnique(); + mpImplGradient->mnStepCount = nSteps; +} + +// ----------------------------------------------------------------------- + +Gradient& Gradient::operator=( const Gradient& rGradient ) +{ + DBG_CHKTHIS( Gradient, NULL ); + DBG_CHKOBJ( &rGradient, Gradient, NULL ); + + // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann + rGradient.mpImplGradient->mnRefCount++; + + // Wenn es die letzte Referenz ist, loeschen, + // sonst Referenzcounter decrementieren + if ( mpImplGradient->mnRefCount == 1 ) + delete mpImplGradient; + else + mpImplGradient->mnRefCount--; + mpImplGradient = rGradient.mpImplGradient; + + return *this; +} + +// ----------------------------------------------------------------------- + +BOOL Gradient::operator==( const Gradient& rGradient ) const +{ + DBG_CHKTHIS( Gradient, NULL ); + DBG_CHKOBJ( &rGradient, Gradient, NULL ); + + if ( mpImplGradient == rGradient.mpImplGradient ) + return TRUE; + + if ( (mpImplGradient->meStyle == rGradient.mpImplGradient->meStyle) || + (mpImplGradient->mnAngle == rGradient.mpImplGradient->mnAngle) || + (mpImplGradient->mnBorder == rGradient.mpImplGradient->mnBorder) || + (mpImplGradient->mnOfsX == rGradient.mpImplGradient->mnOfsX) || + (mpImplGradient->mnOfsY == rGradient.mpImplGradient->mnOfsY) || + (mpImplGradient->mnStepCount == rGradient.mpImplGradient->mnStepCount) || + (mpImplGradient->mnIntensityStart == rGradient.mpImplGradient->mnIntensityStart) || + (mpImplGradient->mnIntensityEnd == rGradient.mpImplGradient->mnIntensityEnd) || + (mpImplGradient->maStartColor == rGradient.mpImplGradient->maStartColor) || + (mpImplGradient->maEndColor == rGradient.mpImplGradient->maEndColor) ) + return TRUE; + else + return FALSE; +} + +SvStream& operator>>( SvStream& rIStm, Impl_Gradient& rImpl_Gradient ) +{ + VersionCompat aCompat( rIStm, STREAM_READ ); + UINT16 nTmp16; + + rIStm >> nTmp16; rImpl_Gradient.meStyle = (GradientStyle) nTmp16; + + rIStm >> rImpl_Gradient.maStartColor >> + rImpl_Gradient.maEndColor >> + rImpl_Gradient.mnAngle >> + rImpl_Gradient.mnBorder >> + rImpl_Gradient.mnOfsX >> + rImpl_Gradient.mnOfsY >> + rImpl_Gradient.mnIntensityStart >> + rImpl_Gradient.mnIntensityEnd >> + rImpl_Gradient.mnStepCount; + + return rIStm; +} + +// ----------------------------------------------------------------------- + +SvStream& operator<<( SvStream& rOStm, const Impl_Gradient& rImpl_Gradient ) +{ + VersionCompat aCompat( rOStm, STREAM_WRITE, 1 ); + + rOStm << (UINT16) rImpl_Gradient.meStyle << + rImpl_Gradient.maStartColor << + rImpl_Gradient.maEndColor << + rImpl_Gradient.mnAngle << + rImpl_Gradient.mnBorder << + rImpl_Gradient.mnOfsX << + rImpl_Gradient.mnOfsY << + rImpl_Gradient.mnIntensityStart << + rImpl_Gradient.mnIntensityEnd << + rImpl_Gradient.mnStepCount; + + return rOStm; +} + +// ----------------------------------------------------------------------- + +SvStream& operator>>( SvStream& rIStm, Gradient& rGradient ) +{ + rGradient.MakeUnique(); + return( rIStm >> *rGradient.mpImplGradient ); +} + +// ----------------------------------------------------------------------- + +SvStream& operator<<( SvStream& rOStm, const Gradient& rGradient ) +{ + return( rOStm << *rGradient.mpImplGradient ); +} |