diff -r 000000000000 -r f72a12da539e menufw/hierarchynavigator/hnpresentationmodel/src/hnattrimgprovliwimage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menufw/hierarchynavigator/hnpresentationmodel/src/hnattrimgprovliwimage.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,241 @@ +/* +* Copyright (c) 2007-2008 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: image provider for liw buffer +* +*/ + + +#include +#include +#include +#include +#include +#include +#include "hnattrimgprovliwimage.h" +#include "hnextbmpiconholder.h" + +// ============================ MEMBER FUNCTIONS ============================= + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnAttrImgProvLiwImage::CHnAttrImgProvLiwImage() + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnAttrImgProvLiwImage::ConstructL( TLiwVariant*& aBitmap, + TLiwVariant*& aMaskBitmap ) + { + ASSERT( aBitmap ); + CFbsBitmap* mask = NULL; + CFbsBitmap* bitmap = CreateBitmapFromVariantL( *aBitmap ); + if ( bitmap ) + { + if( aMaskBitmap ) + { + mask = CreateBitmapFromVariantL( *aMaskBitmap ); + } + CreateIconL( bitmap, mask ); + } + else if ( aBitmap->TypeId() == LIW::EVariantTypeBuffer ) + { + CLiwBitmapBuffer* bmpBuff = + static_cast( aBitmap->AsBuffer() ); + CLiwBitmapBuffer* maskBuff = + static_cast( + aMaskBitmap ? aMaskBitmap->AsBuffer() : NULL ); + if ( bmpBuff ) + { + bitmap = bmpBuff->AsBitmap(); + } + if ( maskBuff ) + { + mask = maskBuff->AsBitmap(); + } + if ( bitmap ) + { + CreateExtIconL( bitmap, mask, bmpBuff, maskBuff ); + } + } + if ( !bitmap ) + { + //No point to keep variant as bitmap was not created + aBitmap->Reset(); + delete aBitmap; + aBitmap = NULL; + } + if ( aMaskBitmap && !mask ) + { + //No point to keep variant as bitmap was not created + aMaskBitmap->Reset(); + delete aMaskBitmap; + aMaskBitmap = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnAttrImgProvLiwImage::CreateExtIconL( CFbsBitmap* aBitmap, + CFbsBitmap* aMask, CLiwBitmapBuffer* aExtBmp, + CLiwBitmapBuffer* aExtMask ) + { + // the condition in the assertion below means: if you provide aMask then + // you must also provide aExtMask + __ASSERT_DEBUG( aBitmap && aExtBmp && ( !aMask || aExtMask ), + User::Invariant() ); + + CGulIcon* newIcon = CGulIcon::NewL( aBitmap, aMask ); + CleanupStack::PushL( newIcon ); + newIcon->SetBitmapsOwnedExternally( ETrue ); + CHnExtBmpIconHolder *newIconHolder = new (ELeave) CHnExtBmpIconHolder(); + newIconHolder->SetGulIcon( newIcon , aExtBmp, aExtMask ); + CleanupStack::Pop( newIcon ); + + if ( iIconHolder ) + { + iIconHolder->Close(); + } + iIconHolder = newIconHolder; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C CHnAttrImgProvLiwImage* CHnAttrImgProvLiwImage::NewL( + TLiwVariant*& aBitmap, TLiwVariant*& aMaskBitmap ) + { + CHnAttrImgProvLiwImage* self = NewLC( aBitmap, aMaskBitmap ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C CHnAttrImgProvLiwImage* CHnAttrImgProvLiwImage::NewLC( + TLiwVariant*& aBitmap, TLiwVariant*& aMaskBitmap ) + { + CHnAttrImgProvLiwImage* self = new( ELeave ) CHnAttrImgProvLiwImage; + CleanupStack::PushL( self ); + self->ConstructL( aBitmap, aMaskBitmap ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnAttrImgProvLiwImage::~CHnAttrImgProvLiwImage() + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnAttrImgProvLiwImage::RemoveLiwObjects() + { + if ( iIconHolder ) + { + iIconHolder->Close(); + iIconHolder = NULL; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +const TDesC8& CHnAttrImgProvLiwImage::Value( ) + { + return iValue; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CFbsBitmap* CHnAttrImgProvLiwImage::CreateBitmapFromVariantL( + const TLiwVariant& aVariant ) + { + CFbsBitmap* bitmap( NULL ); + TInt handle = 0; + + if ( ExtractBitmapHandleFromVariant( aVariant, handle ) == KErrNone ) + { + CFbsBitmap* tempBitmap = new( ELeave ) CFbsBitmap; + if ( tempBitmap->Duplicate( handle ) == KErrNone ) + { + bitmap = tempBitmap; + } + else + { + delete tempBitmap; + } + } + else if ( aVariant.TypeId() == LIW::EVariantTypeDesC8 ) + { + CFbsBitmap* tempBitmap = new ( ELeave ) CFbsBitmap; + CleanupStack::PushL( tempBitmap ); + TPtrC8 buf = aVariant.AsData(); + RDesReadStream stream( buf ); + CleanupClosePushL( stream ); + tempBitmap->InternalizeL( stream ); + CleanupStack::PopAndDestroy( &stream ); + CleanupStack::Pop( tempBitmap ); + bitmap = tempBitmap; + } + return bitmap; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnAttrImgProvLiwImage::ExtractBitmapHandleFromVariant( + const TLiwVariant& aVariant, TInt& aHandle ) + { + TInt err = KErrNone; + switch ( aVariant.TypeId() ) + { + case LIW::EVariantTypeTInt32: + aHandle = static_cast( aVariant.AsTInt32() ); + break; + case LIW::EVariantTypeTUint: + aHandle = static_cast( aVariant.AsTUint() ); + break; + case LIW::EVariantTypeTInt64: + aHandle = static_cast( aVariant.AsTInt64() ); + break; + case LIW::EVariantTypeTBool: + // Putting a TInt into a TLiwVariant will result in the variant + // storing a TBool variable. CFbsBitmap::Handle() returns TInt, so + // we can assume that the TBool stored in aVariant is in fact TInt. + aHandle = static_cast( aVariant.AsTBool() ); + break; + default: + err = KErrNotFound; + } + return err; + }