diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/src/HuiDropShadowBrush.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/coretoolkit/src/HuiDropShadowBrush.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,202 @@ +/* +* Copyright (c) 2006-2007 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: ?Description +* +*/ + + + +#include "uiacceltk/HuiDropShadowBrush.h" // Class definition +#include "uiacceltk/HuiDrawing.h" +#include "uiacceltk/HuiVisual.h" +#include "uiacceltk/HuiUtil.h" + + +/** Default shadow softness. */ +const TReal32 KHuiDropShadowBrushSoftness = 3.f; + +/** Default shadow opacity. */ +const TReal32 KHuiDropShadowBrushOpacity = 100.f/255.f; + + +EXPORT_C CHuiDropShadowBrush* CHuiDropShadowBrush::NewL(const THuiMetric& aDepth) + { + CHuiDropShadowBrush* self = NewLC(aDepth); + CleanupStack::Pop(); + return self; + } + + +EXPORT_C CHuiDropShadowBrush* CHuiDropShadowBrush::NewLC(const THuiMetric& aDepth) + { + CHuiDropShadowBrush* self = new (ELeave) CHuiDropShadowBrush(aDepth); + CleanupStack::PushL(self); + return self; + } + + +EXPORT_C CHuiDropShadowBrush* CHuiDropShadowBrush::NewL(TInt aDepth) + { + CHuiDropShadowBrush* self = NewLC(aDepth); + CleanupStack::Pop(); + return self; + } + + +EXPORT_C CHuiDropShadowBrush* CHuiDropShadowBrush::NewLC(TInt aDepth) + { + CHuiDropShadowBrush* self = new (ELeave) CHuiDropShadowBrush(aDepth); + CleanupStack::PushL(self); + return self; + } + +CHuiDropShadowBrush::CHuiDropShadowBrush(const THuiMetric& aDepth) + : CHuiBrush(), + iSoftness(KHuiDropShadowBrushSoftness), + iDepth(aDepth.iMagnitude), + iDepthMetric(aDepth), + iSoftnessMetric(KHuiDropShadowBrushSoftness), + iColor(TRgb(0, 0, 110)) + { + SetClipToVisual(EFalse); + iOpacity.Set(KHuiDropShadowBrushOpacity); + } + +CHuiDropShadowBrush::CHuiDropShadowBrush(TInt aDepth) + : CHuiBrush(), + iSoftness(KHuiDropShadowBrushSoftness), + iDepth(TReal32(aDepth)), + iDepthMetric(aDepth), + iSoftnessMetric(KHuiDropShadowBrushSoftness), + iColor(TRgb(0, 0, 110)) + { + SetClipToVisual(EFalse); + iOpacity.Set(KHuiDropShadowBrushOpacity); + } + + +CHuiDropShadowBrush::~CHuiDropShadowBrush() + { + } + +TBool CHuiDropShadowBrush::Changed() const + { + if ( CHuiBrush::Changed() ) + { + return ETrue; + } + return iSoftness.Changed() || iDepth.Changed(); + } + +void CHuiDropShadowBrush::ClearChanged() + { + CHuiBrush::ClearChanged(); + iSoftness.ClearChanged(); + iDepth.ClearChanged(); + } + +void CHuiDropShadowBrush::Draw(CHuiGc& aGc, const MHuiBrushGuide& aGuide) const + { + THuiRealRect realRect = aGuide.BrushRect(); + TReal32 opacity = aGuide.BrushOpacity() * iOpacity.Now(); + TReal32 distanceInPixels = DepthInPixels(BrushGuide()); + TReal32 softnessInPixels = SoftnessInPixels(BrushGuide()); + + TReal32 borderWidth = (softnessInPixels + distanceInPixels/2.f); //distance; + + aGc.Push(EHuiGcMatrixModel); + aGc.Translate(EHuiGcMatrixModel, distanceInPixels, distanceInPixels, 0.0f); + + borderWidth = Min( borderWidth, realRect.Width()/2.f ); + borderWidth = Min( borderWidth, realRect.Height()/2.f ); + + aGc.SetPenColor(iColor); + aGc.SetPenAlpha(TInt(opacity * 255)); + + const CHuiTexture* shadowTexture = NULL; + TInt err = aGuide.BrushSkin().GetTexture(EHuiSkinShadowTexture, shadowTexture); + if (err!=KErrNone) + { + ASSERT(EFalse); // failed to get the shadow texture - unable to proceed! + return; + } + THuiImage dropShadowImage(*shadowTexture); + + aGc.Disable(CHuiGc::EFeatureDepthWrite); + + TRect roundedRect = realRect.Round(); + // draw drop shadow borders + aGc.DrawBorders(roundedRect, borderWidth, borderWidth, borderWidth, borderWidth, + CHuiGc::EBorderImage, &dropShadowImage); + + aGc.Disable(CHuiGc::EFeatureTexturing); + roundedRect.Shrink( HUI_ROUND_FLOAT_TO_INT(borderWidth), HUI_ROUND_FLOAT_TO_INT(borderWidth)); + aGc.DrawRect(roundedRect); + aGc.Enable(CHuiGc::EFeatureDepthWrite); + + aGc.Pop(EHuiGcMatrixModel); + } + + +void CHuiDropShadowBrush::ExpandVisualRect(TRect& aRect) const + { + TReal32 depthInPixels = DepthInPixels(BrushGuide()); + + if ( depthInPixels > 0 ) + { + // Currently support only drop shadow on the bottom right of the visual + aRect.iBr.iX += HUI_ROUND_FLOAT_TO_INT( depthInPixels ); + aRect.iBr.iY += HUI_ROUND_FLOAT_TO_INT( depthInPixels ); + } + } + +EXPORT_C void CHuiDropShadowBrush::SetDepth(const THuiMetric& aDepth) + { + iDepthMetric = aDepth; + iDepth.Set(aDepth.iMagnitude); + } + +EXPORT_C void CHuiDropShadowBrush::SetSoftness(const THuiMetric& aSoftness) + { + iSoftnessMetric = aSoftness; + iSoftness.Set(aSoftness.iMagnitude); + } + +EXPORT_C void CHuiDropShadowBrush::SetColor(const TRgb& aColor) + { + iColor = aColor; + } + +TReal32 CHuiDropShadowBrush::DepthInPixels(const CHuiVisual* aVisual) const + { + return ValueInPixels(aVisual, iDepth); + } + +TReal32 CHuiDropShadowBrush::SoftnessInPixels(const CHuiVisual* aVisual) const + { + return ValueInPixels(aVisual, iSoftness); + } + +TReal32 CHuiDropShadowBrush::ValueInPixels(const CHuiVisual* aVisual, const THuiTimedValue& aValue) const + { + TReal32 valueInPixels = aValue.Now(); // Default to old pixel width + if (aVisual) + { + THuiMetric metric = iDepthMetric; + metric.iMagnitude = valueInPixels; + valueInPixels = aVisual->MetricToPixels(THuiXYMetric(metric, metric)).iX; // Calculate metric width in pixels + } + return valueInPixels; + } +