--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiShadowBorderBrush.cpp Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,169 @@
+/*
+* 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: Implementation of CHuiShadowBorderBrush - Shadow borders for visuals.
+*
+*/
+
+
+
+#include "uiacceltk/HuiShadowBorderBrush.h" // Class definition
+#include "uiacceltk/HuiDrawing.h"
+#include "uiacceltk/HuiVisual.h"
+#include "uiacceltk/HuiUtil.h"
+
+/** Default shadow opacity. */
+const TReal32 KHuiShadowBorderBrushOpacity = 100.f/255.f;
+
+
+EXPORT_C CHuiShadowBorderBrush* CHuiShadowBorderBrush::NewL(TInt aWidth)
+ {
+ CHuiShadowBorderBrush* self = NewLC(aWidth);
+ CleanupStack::Pop();
+ return self;
+ }
+
+
+EXPORT_C CHuiShadowBorderBrush* CHuiShadowBorderBrush::NewLC(TInt aWidth)
+ {
+ CHuiShadowBorderBrush* self = new (ELeave) CHuiShadowBorderBrush(aWidth);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+EXPORT_C CHuiShadowBorderBrush* CHuiShadowBorderBrush::NewL(const THuiMetric& aWidth)
+ {
+ CHuiShadowBorderBrush* self = NewLC(aWidth);
+ CleanupStack::Pop();
+ return self;
+ }
+
+
+EXPORT_C CHuiShadowBorderBrush* CHuiShadowBorderBrush::NewLC(const THuiMetric& aWidth)
+ {
+ CHuiShadowBorderBrush* self = new (ELeave) CHuiShadowBorderBrush(aWidth);
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+
+CHuiShadowBorderBrush::CHuiShadowBorderBrush(TInt aWidth)
+ : CHuiBrush(),
+ iWidth(TReal32(aWidth))
+ {
+ SetClipToVisual(EFalse);
+ iOpacity.Set(KHuiShadowBorderBrushOpacity);
+ }
+
+CHuiShadowBorderBrush::CHuiShadowBorderBrush(const THuiMetric& aWidth)
+ : CHuiBrush(),
+ iWidth(aWidth.iMagnitude),
+ iMetricWidth(aWidth)
+ {
+ SetClipToVisual(EFalse);
+ iOpacity.Set(KHuiShadowBorderBrushOpacity);
+ }
+
+CHuiShadowBorderBrush::~CHuiShadowBorderBrush()
+ {
+ }
+
+
+void CHuiShadowBorderBrush::ExpandVisualRect(TRect& aRect) const
+ {
+ // We need access to visual to convert metric units into pixels,
+ // currently a pointer to visual is provided through separate
+ // method since we want to avoid breaking binary compatibility
+ // of this class.
+ TReal32 widthInPixels = WidthInPixels(BrushGuide());
+ aRect.Grow(HUI_ROUND_FLOAT_TO_INT(widthInPixels), HUI_ROUND_FLOAT_TO_INT(widthInPixels));
+ }
+
+TBool CHuiShadowBorderBrush::Changed() const
+ {
+ if ( CHuiBrush::Changed() )
+ {
+ return ETrue;
+ }
+
+ return iWidth.Changed();
+ }
+
+void CHuiShadowBorderBrush::ClearChanged()
+ {
+ CHuiBrush::ClearChanged();
+ iWidth.ClearChanged();
+ }
+
+void CHuiShadowBorderBrush::Draw(CHuiGc& aGc, const MHuiBrushGuide& aGuide) const
+ {
+ TRect content = aGuide.BrushRect().Round();
+ TReal32 opacity = aGuide.BrushOpacity() * iOpacity.Now();
+
+ if(opacity <= 0)
+ {
+ return;
+ }
+
+ aGc.SetPenAlpha(TInt(opacity * 255));
+ aGc.SetPenColor(TRgb(0, 0, 30));
+
+ 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;
+ }
+ ASSERT(shadowTexture);
+ THuiImage shadowImage(*shadowTexture);
+
+ aGc.Disable(CHuiGc::EFeatureDepthWrite);
+
+ TReal32 widthInPixels = WidthInPixels(BrushGuide());
+ content.Grow(HUI_ROUND_FLOAT_TO_INT(widthInPixels), HUI_ROUND_FLOAT_TO_INT(widthInPixels));
+
+ // ID: EHJK-7G5AHB - shadow border leaves artifacts in the display while visual is moved.
+ TReal32 offset = 0.0f; // NOTE: It was 1.f.
+
+ // Note: DrawBorders does not (yet) support different widths for every border.
+ aGc.DrawBorders(content,
+ widthInPixels-offset,
+ widthInPixels+offset,
+ widthInPixels-offset,
+ widthInPixels+offset,
+ CHuiGc::EBorderImage,
+ &shadowImage);
+
+ aGc.Enable(CHuiGc::EFeatureDepthWrite);
+ }
+
+EXPORT_C void CHuiShadowBorderBrush::SetWidth(const THuiMetric& aWidth)
+ {
+ iMetricWidth = aWidth;
+ iWidth.Set(aWidth.iMagnitude);
+ }
+
+
+TReal32 CHuiShadowBorderBrush::WidthInPixels(const CHuiVisual* aVisual) const
+ {
+ TReal32 widthInPixels = iWidth.Now(); // Default to old pixel width
+ if (aVisual)
+ {
+ THuiMetric metric = iMetricWidth;
+ metric.iMagnitude = widthInPixels;
+ widthInPixels = aVisual->MetricToPixels(THuiXYMetric(metric, metric)).iX; // Calculate metric width in pixels
+ }
+ return widthInPixels;
+ }
+