diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/src/HuiBrushArray.cpp --- /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;iRef().Type2()==aBrushType) + { + count++; + } + } + return count; + } +EXPORT_C CHuiBrush *CHuiBrushArray::BrushWithTypeAt(TInt aBrushType, TInt aIndex) + { + TInt count = 0; + TInt num = Count(); + for(TInt i=0;iRef().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); + } + }