diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/src/HuiBorderBrush.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/coretoolkit/src/HuiBorderBrush.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,227 @@ +/* +* 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 CHuiBorderBrush class - a brush that draws +* a border at the edges of visuals. +* +*/ + + + +#include "uiacceltk/HuiBorderBrush.h" // Class definition +#include "uiacceltk/HuiDrawing.h" +#include "uiacceltk/HuiVisual.h" + + +EXPORT_C CHuiBorderBrush* CHuiBorderBrush::NewL( + TInt aThicknessWidth, TInt aThicknessHeight, + TInt aEdgeOffsetX, TInt aEdgeOffsetY) + { + CHuiBorderBrush* self = NewLC(aThicknessWidth, aThicknessHeight, + aEdgeOffsetX, aEdgeOffsetY); + CleanupStack::Pop(); + return self; + } + + +EXPORT_C CHuiBorderBrush* CHuiBorderBrush::NewLC( + TInt aThicknessWidth, TInt aThicknessHeight, + TInt aEdgeOffsetX, TInt aEdgeOffsetY) + { + CHuiBorderBrush* self = new (ELeave) + CHuiBorderBrush(aThicknessWidth, aThicknessHeight, + aEdgeOffsetX, aEdgeOffsetY); + CleanupStack::PushL(self); + return self; + } + + +CHuiBorderBrush::CHuiBorderBrush(TInt aThicknessWidth, TInt aThicknessHeight, + TInt aEdgeOffsetX, TInt aEdgeOffsetY) + : CHuiBrush(), + iColor(KRgbWhite), + iThickness( TReal32(aThicknessWidth), TReal32(aThicknessHeight)), + iEdgeOffset( TReal32(aEdgeOffsetX), TReal32(aEdgeOffsetY)) + { + SetClipToVisual(EFalse); + } + +EXPORT_C CHuiBorderBrush* CHuiBorderBrush::NewL(const THuiXYMetric& aThickness, + const THuiXYMetric& aEdgeOffset) + { + CHuiBorderBrush* self = NewLC(aThickness, aEdgeOffset); + CleanupStack::Pop(); + return self; + } + + +EXPORT_C CHuiBorderBrush* CHuiBorderBrush::NewLC(const THuiXYMetric& aThickness, + const THuiXYMetric& aEdgeOffset) + { + CHuiBorderBrush* self = new (ELeave) + CHuiBorderBrush(aThickness, aEdgeOffset); + CleanupStack::PushL(self); + return self; + } + + +CHuiBorderBrush::CHuiBorderBrush(const THuiXYMetric& aThickness, + const THuiXYMetric& aEdgeOffset) + : CHuiBrush(), + iColor(KRgbWhite), + iThickness(aThickness.iX.iMagnitude, aThickness.iY.iMagnitude), + iEdgeOffset(aEdgeOffset.iX.iMagnitude, aEdgeOffset.iY.iMagnitude), + iThicknessMetric(aThickness), + iEdgeOffsetMetric(aEdgeOffset) + { + SetClipToVisual(EFalse); + } + + +CHuiBorderBrush::~CHuiBorderBrush() + { + } + + +EXPORT_C void CHuiBorderBrush::SetImage(const THuiImage& aImage) + { + iImage = aImage; + SetChanged(); + } + + +EXPORT_C void CHuiBorderBrush::SetColor(const TRgb& aColor) + { + iColor = aColor; + SetChanged(); + } + +EXPORT_C void CHuiBorderBrush::SetThickness(const THuiXYMetric& aThickness) + { + iThicknessMetric = aThickness; + iThickness.iX.Set(aThickness.iX.iMagnitude); + iThickness.iY.Set(aThickness.iY.iMagnitude); + } + +EXPORT_C void CHuiBorderBrush::SetEdgeOffset(const THuiXYMetric& aEdgeOffset) + { + iEdgeOffsetMetric = aEdgeOffset; + iEdgeOffset.iX.Set(aEdgeOffset.iX.iMagnitude); + iEdgeOffset.iY.Set(aEdgeOffset.iY.iMagnitude); + } + +EXPORT_C void CHuiBorderBrush::SetImageOffset(const THuiXYMetric& aImageOffset) + { + iImageOffsetMetric = aImageOffset; + iImageOffset.iX.Set(aImageOffset.iX.iMagnitude); + iImageOffset.iY.Set(aImageOffset.iY.iMagnitude); + } + + +TBool CHuiBorderBrush::Changed() const + { + if ( CHuiBrush::Changed() ) + { + return ETrue; + } + return iThickness.Changed() || iEdgeOffset.Changed() || iImageOffset.Changed() || iImage.Changed(); + } + +void CHuiBorderBrush::ClearChanged() + { + CHuiBrush::ClearChanged(); + iThickness.ClearChanged(); + iEdgeOffset.ClearChanged(); + iImageOffset.ClearChanged(); + iImage.ClearChanged(); + } + +void CHuiBorderBrush::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. + THuiRealPoint edgeOffsetInPixels = EdgeOffsetInPixels(BrushGuide()); + aRect.Grow((TInt)edgeOffsetInPixels.iX, + (TInt)edgeOffsetInPixels.iY); + } + + +void CHuiBorderBrush::Draw(CHuiGc& aGc, const MHuiBrushGuide& aGuide) const + { + THuiRealRect content = aGuide.BrushRect(); + TReal32 opacity = aGuide.BrushOpacity() * iOpacity.Now(); + + THuiRealPoint edgeOffsetInPixels = EdgeOffsetInPixels(BrushGuide()); + THuiRealPoint thicknessInPixels = ThicknessInPixels(BrushGuide()); + THuiRealPoint imageOffsetInPixels = ImageOffsetInPixels(BrushGuide()); + + aGc.SetPenColor(iColor); + aGc.SetPenAlpha(TInt(opacity * 255)); + + if(iImage.HasTexture()) + { + aGc.Enable(CHuiGc::EFeatureTexturing); + iImage.Texture().Bind(); + } + else + { + aGc.Disable(CHuiGc::EFeatureTexturing); + } + aGc.Enable(CHuiGc::EFeatureBlending); + + // Apply the texture offset manually. + aGc.Push(EHuiGcMatrixTexture); + aGc.LoadIdentity(EHuiGcMatrixTexture); + aGc.Translate(EHuiGcMatrixTexture, + -imageOffsetInPixels.iX, -imageOffsetInPixels.iY, 0.f); + + content.Grow(edgeOffsetInPixels.iX, edgeOffsetInPixels.iY); + + aGc.DrawBorders(content.Round(), + thicknessInPixels.iX, thicknessInPixels.iX, + thicknessInPixels.iY, thicknessInPixels.iY, + CHuiGc::EBorderFixedCorners, + &iImage); + + aGc.Pop(EHuiGcMatrixTexture); + } + +THuiRealPoint CHuiBorderBrush::ThicknessInPixels(const CHuiVisual* aVisual) const + { + return PointInPixels(aVisual, iThickness, iThicknessMetric); + } + +THuiRealPoint CHuiBorderBrush::EdgeOffsetInPixels(const CHuiVisual* aVisual) const + { + return PointInPixels(aVisual, iEdgeOffset, iEdgeOffsetMetric); + } + +THuiRealPoint CHuiBorderBrush::ImageOffsetInPixels(const CHuiVisual* aVisual) const + { + return PointInPixels(aVisual, iImageOffset, iImageOffsetMetric); + } + +THuiRealPoint CHuiBorderBrush::PointInPixels(const CHuiVisual* aVisual, const THuiTimedPoint& aPoint, const THuiXYMetric& aMetric) const + { + THuiRealPoint pointInPixels = aPoint.RealNow(); // Init, if no visual available for conversion then defaults to pixels + if (aVisual) + { + THuiXYMetric metric = aMetric; + metric.iX.iMagnitude = pointInPixels.iX; + metric.iY.iMagnitude = pointInPixels.iY; + pointInPixels = aVisual->MetricToPixels(metric); // Convert metric width in pixels + } + return pointInPixels; + }