--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/src/HuiBrushArray.cpp Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,259 @@
+/*
+* 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/HuiBrushArray.h"
+#include "uiacceltk/HuiVisual.h"
+#include "uiacceltk/HuiGc.h"
+#include "uiacceltk/HuiPanic.h"
+
+
+EXPORT_C CHuiBrushArray* CHuiBrushArray::NewL()
+ {
+ CHuiBrushArray* self = NewLC();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+EXPORT_C CHuiBrushArray* CHuiBrushArray::NewLC()
+ {
+ CHuiBrushArray* self = new (ELeave) CHuiBrushArray();
+ CleanupStack::PushL(self);
+ return self;
+ }
+
+
+CHuiBrushArray::CHuiBrushArray()
+ {
+ }
+
+
+EXPORT_C CHuiBrushArray::~CHuiBrushArray()
+ {
+ Reset();
+ }
+
+
+EXPORT_C void CHuiBrushArray::Reset()
+ {
+ iElements.ResetAndDestroy();
+ }
+
+
+EXPORT_C void CHuiBrushArray::AppendL(CHuiBrush* aBrush, THuiOwnership aOwnership)
+ {
+ if (!aBrush) // RArrayElement can't handle null ptr correctly in all cases
+ {
+ User::Leave(KErrArgument);
+ }
+
+ RArrayElement* element = new (ELeave) RArrayElement();
+ CleanupStack::PushL(element);
+ User::LeaveIfError(iElements.Append(element));
+ CleanupStack::Pop(element);
+
+ element->Set(aBrush, aOwnership);
+ }
+
+
+EXPORT_C void CHuiBrushArray::InsertL(TInt aPos, CHuiBrush* aBrush,
+ THuiOwnership aOwnership)
+ {
+ if (!aBrush) // RArrayElement can't handle null ptr correctly in all cases
+ {
+ User::Leave(KErrArgument);
+ }
+
+ RArrayElement* element = new (ELeave) RArrayElement();
+ CleanupStack::PushL(element);
+ User::LeaveIfError(iElements.Insert(element, aPos));
+ CleanupStack::Pop(element);
+
+ element->Set(aBrush, aOwnership);
+ }
+
+
+EXPORT_C void CHuiBrushArray::Remove(TInt aPos)
+ {
+ if ( aPos >= Count() )
+ {
+ // if does not exist, just return
+ return;
+ }
+ delete iElements[aPos];
+ iElements.Remove(aPos);
+ }
+
+
+EXPORT_C TInt CHuiBrushArray::Count() const
+ {
+ return iElements.Count();
+ }
+
+
+EXPORT_C CHuiBrush& CHuiBrushArray::operator [] (TInt aPos)
+ {
+ return iElements[aPos]->Ref();
+ }
+
+
+EXPORT_C CHuiBrush& CHuiBrushArray::At(TInt aPos)
+ {
+ return iElements[aPos]->Ref();
+ }
+
+
+EXPORT_C void CHuiBrushArray::Draw(THuiBrushLayer aLayer, CHuiGc& aGc,
+ const MHuiBrushGuide& aGuide) const
+ {
+ TInt layerBrushCount = LayerBrushCount(aLayer);
+ TInt depth = 0;
+
+ if(!layerBrushCount)
+ {
+ // Nothing on this layer.
+ return;
+ }
+
+ if(aLayer == EHuiBrushLayerBackground)
+ {
+ depth = -layerBrushCount - 1;
+ }
+
+ for(TInt i = 0; i < Count(); ++i)
+ {
+ CHuiBrush& brush = iElements[i]->Ref();
+
+ if(brush.Layer() == aLayer)
+ {
+ // Polygon depth offset to avoid Z-conflicts.
+ if(aLayer == EHuiBrushLayerBackground ||
+ aLayer == EHuiBrushLayerForeground)
+ {
+ ++depth;
+ }
+ aGc.SetDepthOffset(-depth);
+
+ brush.BeginDraw(aGc, aGuide);
+ brush.Draw(aGc, aGuide);
+ brush.EndDraw(aGc, aGuide);
+ }
+ }
+
+ // Reset depth offset back to zero.
+ aGc.SetDepthOffset(0);
+ }
+
+
+EXPORT_C TInt CHuiBrushArray::LayerBrushCount(THuiBrushLayer aLayer) const
+ {
+ TInt count = 0;
+
+ for(TInt i = 0; i < Count(); ++i)
+ {
+ if(iElements[i]->Ref().Layer() == aLayer)
+ {
+ ++count;
+ }
+ }
+
+ return count;
+ }
+EXPORT_C TInt CHuiBrushArray::BrushWithTypeCount(TInt aBrushType) const
+ {
+ TInt count = 0;
+ TInt num = Count();
+ for(TInt i=0;i<num;i++)
+ {
+ if (iElements[i]->Ref().Type2()==aBrushType)
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+EXPORT_C CHuiBrush *CHuiBrushArray::BrushWithTypeAt(TInt aBrushType, TInt aIndex)
+ {
+ TInt count = 0;
+ TInt num = Count();
+ for(TInt i=0;i<num;i++)
+ {
+ if (iElements[i]->Ref().Type2()==aBrushType)
+ {
+ if (count == aIndex)
+ {
+ return &iElements[i]->Ref();
+ }
+ count++;
+ }
+ }
+ return 0;
+ }
+
+
+TBool CHuiBrushArray::Changed() const
+ {
+ for(TInt i = 0; i < iElements.Count(); ++i)
+ {
+ if(iElements[i]->Ref().Changed())
+ {
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+
+void CHuiBrushArray::ClearChanged()
+ {
+ for(TInt i = 0; i < Count(); ++i)
+ {
+ iElements[i]->Ref().ClearChanged();
+ }
+ }
+
+
+void CHuiBrushArray::ExpandVisualRect(TRect& aRect) const
+ {
+ TRect original = aRect;
+
+ for(TInt i = 0; i < Count(); ++i)
+ {
+ CHuiBrush& brush = iElements[i]->Ref();
+
+ // If the drawing of the brush is clipped to visual contents,
+ // there is no need to expand the rectangle.
+ if(!brush.ClipToVisual())
+ {
+ TRect expanded = original;
+ brush.ExpandVisualRect(expanded);
+ aRect.BoundingRect(expanded);
+ }
+ }
+ }
+
+
+void CHuiBrushArray::ActivateBrushGuide(const CHuiVisual* aNewGuide) const
+ {
+ for(TInt i = 0; i < Count(); ++i)
+ {
+ CHuiBrush& brush = iElements[i]->Ref();
+ brush.ActivateBrushGuide(aNewGuide);
+ }
+ }