diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/src/huidropshadow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/coretoolkit/src/huidropshadow.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,333 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Drop shadow handler +* +*/ + + + +#include "uiacceltk/huidropshadow.h" +#include "uiacceltk/HuiUtil.h" +#include "uiacceltk/HuiTextureProcessor.h" +#include "uiacceltk/HuiTextureManager.h" +#include "uiacceltk/HuiEnv.h" +#include +#include + +// internal flags +enum + { + EHuiDropShadowChanged = 0x01, + EHuiDropShadowColorValid = 0x02 + }; + +// ======== LOCAL FUNCTIONS ======== + +NONSHARABLE_STRUCT( CHuiDropShadow::THuiDropShadowData ) + { + THuiDropShadowData(): + iColor(KRgbBlack), + iColorSkinId(), + iColorIndex(KErrNotFound), + //iColorValid(EFalse), + //iChanged( EFalse ) + iFlags(0) + { + } + + mutable TRgb iColor; + TAknsItemID iColorSkinId; + TInt iColorIndex; + //mutable TBool iColorValid; + //TBool iChanged; + TUint8 iFlags; + }; + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +// +CHuiDropShadow::CHuiDropShadow() : + iOpacity(0.6f), + iOffset( 2.f, 2.f ), + iOffsetUnit( EHuiUnitPixel ), // magnitude is in iTimedOffset + iRadius( 1.5f ), + iScale( 1.f ) + { + } + + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CHuiDropShadow::ConstructL() + { + iData = new (ELeave) THuiDropShadowData; + } + +// --------------------------------------------------------------------------- +// Destructor +// -------------------------------------------------------------------------- +// +CHuiDropShadow::~CHuiDropShadow() + { + if ( iData ) + { + } + delete iData; + } + +// --------------------------------------------------------------------------- +// Sets the shadow offset in polar coorsinates +// --------------------------------------------------------------------------- +// +EXPORT_C void CHuiDropShadow::SetOffset( + TReal32 aAngle, + THuiMetric aDistance, + TInt aTransitionTime ) __SOFTFP + { + if ( iOffsetUnit != aDistance.iUnit && aTransitionTime ) + { + // @todo: convert current timed value into new unit + } + + // it is not that efficient to use floating point calculations here + // but this is not called often. + + TReal x; + Math::Cos( x, 2.0*KPi*aAngle/360.0 ); + x*=aDistance.iMagnitude; + + + TReal y; + Math::Sin( y, 2.0*KPi*aAngle/360.0 ); + y*=-1.0*aDistance.iMagnitude; + + iOffset.Set( THuiRealPoint(x,y), aTransitionTime ); + iOffsetUnit = aDistance.iUnit; + } + +// --------------------------------------------------------------------------- +// Sets color in RGB +// --------------------------------------------------------------------------- +// +EXPORT_C void CHuiDropShadow::SetColor( + const TRgb& aColor, + TInt /*aTransitionTime*/) + { + iData->iColor = aColor; + iData->iColorIndex = KErrNotFound; + iData->iFlags |= EHuiDropShadowChanged; + } + +// --------------------------------------------------------------------------- +// Sets color in S60 skin +// --------------------------------------------------------------------------- +// +EXPORT_C void CHuiDropShadow::SetColor( + const TAknsItemID& aID, + const TInt aIndex, + TInt /*aTransitionTime*/) + { + iData->iColorSkinId = aID; + iData->iColorIndex = aIndex; + iData->iFlags &= ~EHuiDropShadowColorValid; + iData->iFlags |= EHuiDropShadowChanged; + } + +// --------------------------------------------------------------------------- +// Returns the current color RGB value +// --------------------------------------------------------------------------- +// +TRgb CHuiDropShadow::Color() const + { + if ( iData->iColorIndex != KErrNotFound && !(iData->iFlags&EHuiDropShadowColorValid) ) + { + CHuiStatic::GetCachedColor( + iData->iColor, + iData->iColorSkinId, + iData->iColorIndex); + + iData->iFlags |= EHuiDropShadowColorValid; // What about skins change.. + } + return iData->iColor; + } + +// --------------------------------------------------------------------------- +// Returns ETrue if the drops shadow parateters have changed. +// --------------------------------------------------------------------------- +// +TBool CHuiDropShadow::Changed() const + { + if ( iData->iFlags&EHuiDropShadowChanged ) + { + return ETrue; + } + return iOpacity.Changed() || iOffset.Changed() || iRadius.Changed() || iScale.Changed(); + } + +// --------------------------------------------------------------------------- +// Clears all changed flags +// --------------------------------------------------------------------------- +// +void CHuiDropShadow::ClearChanged() + { + iData->iFlags &= ~EHuiDropShadowChanged; + iOpacity.ClearChanged(); + iOffset.ClearChanged(); + iRadius.ClearChanged(); + iScale.ClearChanged(); + } + +// --------------------------------------------------------------------------- +// Calculates the drawging size of the shadow. +// --------------------------------------------------------------------------- +// +THuiRealSize CHuiDropShadow::ShadowDrawingSize( + const TSize& aImageDrawingSize, + const TSize& aShadowTextureSize ) const + { + // Shadow texture is usually smaller than the image texture in which it is based on. + // Also, the content of the shadow texture is shrank by the blur dimension + // from all the sides. + + // round the blur dimension already because the blur filter does it as well. + const TInt blurDimension = HUI_ROUND_FLOAT_TO_INT( 2*iRadius.Now() ); + + // the content area of the texture is smaller than the the texture area + THuiRealSize shadowContentSize = aShadowTextureSize; + shadowContentSize.iWidth -= 2.f*blurDimension; + shadowContentSize.iHeight -= 2.f*blurDimension; + + // check the relation between the shadow content area and the actial drawed image + // check possible divide-by-xero case + // The default value (1) is arbitrary. It only is there to allow prevention of divide_by_zero + TReal32 xMultiplier = 1; + if ( shadowContentSize.iWidth != 0 ) + { + xMultiplier = ((TReal32)(aImageDrawingSize.iWidth)) / ((TReal32)(shadowContentSize.iWidth)); + } + + TReal32 yMultiplier = 1; + if ( shadowContentSize.iHeight != 0 ) + { + yMultiplier = ((TReal32)(aImageDrawingSize.iHeight)) / ((TReal32)(shadowContentSize.iHeight)); + } + + // apply the multiplier to the shadow texture + THuiRealSize shadowDrawingSize = aShadowTextureSize; + shadowDrawingSize.iWidth *= xMultiplier; + shadowDrawingSize.iHeight *= yMultiplier; + + // apply the scale + shadowDrawingSize.iWidth *= iScale.Now(); + shadowDrawingSize.iHeight *= iScale.Now(); + + return shadowDrawingSize; + } + +// --------------------------------------------------------------------------- +// Returns ETrue if the shadow is visible +// --------------------------------------------------------------------------- +// +TBool CHuiDropShadow::IsShadowVisible() const + { + return !HuiUtil::RealCompare( iScale.Now(), 0.f ) && + !HuiUtil::RealCompare( iOpacity.Now(), 0.f ); + } + +// --------------------------------------------------------------------------- +// Gets the CHuiTexture from the MHuiTexture is applicable +// --------------------------------------------------------------------------- +// +CHuiTexture* CHuiDropShadow::ShadowedTextureInstance( const MHuiTexture& aTextureIf ) + { + CHuiTexture* resultTexture = NULL; + + const MHuiShadowedTexture* constShadowedTexture = aTextureIf.ShadowedTexture(); + if ( constShadowedTexture ) + { + MHuiShadowedTexture* nonConstshadowedTexture = const_cast(constShadowedTexture); + resultTexture = static_cast( nonConstshadowedTexture ); + } + return resultTexture; + } + +// --------------------------------------------------------------------------- +// Returns shadow distance in pixels +// --------------------------------------------------------------------------- +// +THuiRealPoint CHuiDropShadow::DistanceInPixels( const CHuiVisual& aReferenceVisual ) const + { + return aReferenceVisual.MetricToPixels( + THuiXYMetric( + THuiMetric( + iOffset.iX.Now(), + iOffsetUnit ), + THuiMetric( + iOffset.iY.Now(), + iOffsetUnit ) + ) + ); + } + +// --------------------------------------------------------------------------- +// Returns shadow area +// --------------------------------------------------------------------------- +// +THuiRealRect CHuiDropShadow::ShadowDrawingRealRect( + const TPoint& aImageDrawingPosition, + const TSize& aImageDrawingSize, + const TSize& aShadowTextureSize, + const CHuiVisual& aReferenceVisual ) const + { + const THuiRealSize shadowDrawingSize = ShadowDrawingSize( aImageDrawingSize, aShadowTextureSize ); + THuiRealPoint shadowDrawingPos( aImageDrawingPosition ); + + const THuiRealPoint distanceInPixels = DistanceInPixels( aReferenceVisual ); + + shadowDrawingPos.iX += distanceInPixels.iX; + shadowDrawingPos.iY += distanceInPixels.iY; + + shadowDrawingPos.iX -= (shadowDrawingSize.iWidth-aImageDrawingSize.iWidth )/2.f; + shadowDrawingPos.iY -= (shadowDrawingSize.iHeight-aImageDrawingSize.iHeight )/2.f; + + return THuiRealRect( shadowDrawingPos, shadowDrawingSize ); + } + +// --------------------------------------------------------------------------- +// Returns shadow area +// --------------------------------------------------------------------------- +// +TRect CHuiDropShadow::ShadowDrawingTRect( + const TPoint& aImageDrawingPosition, + const TSize& aImageDrawingSize, + const TSize& aShadowTextureSize, + const CHuiVisual& aReferenceVisual ) const + { + const THuiRealRect realRect = ShadowDrawingRealRect( + aImageDrawingPosition, + aImageDrawingSize, + aShadowTextureSize, + aReferenceVisual ); + + return TRect( HUI_ROUND_FLOAT_TO_INT( realRect.iTl.iX ), + HUI_ROUND_FLOAT_TO_INT( realRect.iTl.iY ), + HUI_ROUND_FLOAT_TO_INT( realRect.iBr.iX ), + HUI_ROUND_FLOAT_TO_INT( realRect.iBr.iY ) ); + }