uiacceltk/hitchcock/coretoolkit/src/HuiBorderBrush.cpp
changeset 0 15bf7259bb7c
--- /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;                    
+    }