diff -r 000000000000 -r 05e9090e2422 uigraphics/AknIcon/src/AknIconLocationInfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uigraphics/AknIcon/src/AknIconLocationInfo.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2002 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: +* +*/ + + + +// INCLUDE FILES + +#include +#include +#include "AknIconLocationInfo.h" +#include "AknIconLoader.h" + + +// CONSTANTS + +// ================= MEMBER FUNCTIONS ========================================== + +CAknIconLocationInfo::CAknIconLocationInfo() + { + } + +CAknIconLocationInfo::CAknIconLocationInfo( const TDesC& aFileName ) + { + // This constructor is used when the object is instantiated in stack, + // so CBase's zero initialization is not done. + Mem::FillZ( this, sizeof( CAknIconLocationInfo ) ); + iFileNameRef = &aFileName; + } + +CAknIconLocationInfo::~CAknIconLocationInfo() + { + delete iFileName; + delete [] iLocations; + delete iSharedOffsets; + } + +CAknIconLocationInfo* CAknIconLocationInfo::NewL( + const TDesC& aFileName, + MifHeader::CInstance& aOffsets ) + { + CAknIconLocationInfo* item = new( ELeave ) CAknIconLocationInfo; + CleanupStack::PushL( item ); + item->ConstructL( aFileName, aOffsets ); + CleanupStack::Pop(); + return item; + } + +CAknIconLocationInfo* CAknIconLocationInfo::NewL( + const TDesC& aFileName, + const TDesC8& aOffsetArray ) + { + CAknIconLocationInfo* item = new( ELeave ) CAknIconLocationInfo; + CleanupStack::PushL( item ); + item->ConstructL( aFileName, aOffsetArray ); + CleanupStack::Pop(); + return item; + } + +CAknIconLocationInfo* CAknIconLocationInfo::NewL( + const TDesC& aFileName ) + { + CAknIconLocationInfo* item = new( ELeave ) CAknIconLocationInfo; + CleanupStack::PushL( item ); + item->ConstructL( aFileName ); + CleanupStack::Pop(); + return item; + } + +void CAknIconLocationInfo::ConstructL( + const TDesC& aFileName, + MifHeader::CInstance& aOffsets ) + { + iFileName = aFileName.AllocL(); + + iSharedOffsets = MifHeader::CInstance::NewL(aOffsets.Ref()); + iCount = iSharedOffsets->indicies().Count(); + } + +void CAknIconLocationInfo::ConstructL( + const TDesC& aFileName, + const TDesC8& aOffsetArray ) + { + iFileName = aFileName.AllocL(); + + if ( aOffsetArray.Size() % sizeof( TMifBitmapOffsetElement ) ) + { + User::Leave( KErrCorrupt ); + } + + iCount = aOffsetArray.Size() / sizeof(TMifBitmapOffsetElement); + + // iCount must always be even number + if (iCount % 2) + { + User::Leave( KErrCorrupt ); + } + + iLocations = new( ELeave ) TInt[iCount]; + + TMifBitmapOffsetElement* ptr = (TMifBitmapOffsetElement*)aOffsetArray.Ptr(); + + for ( TInt i = 0 ; i < iCount ; i++ ) + { + iLocations[i] = ptr->iOffset; // copy the offset variable in iLocations + ptr++; + } + } + +void CAknIconLocationInfo::ConstructL( const TDesC& aFileName ) + { + iFileName = aFileName.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CAknIconLocationInfo::LinearOrder +// ----------------------------------------------------------------------------- +// +TInt CAknIconLocationInfo::LinearOrder( + const CAknIconLocationInfo& aFirst, + const CAknIconLocationInfo& aSecond ) + { + const TDesC* firstFileName = aFirst.iFileNameRef ? + aFirst.iFileNameRef : aFirst.iFileName; + + const TDesC* secondFileName = aSecond.iFileNameRef ? + aSecond.iFileNameRef : aSecond.iFileName; + + return firstFileName->CompareF( *secondFileName ); + } + +// ----------------------------------------------------------------------------- +// CAknIconLocationInfo::GetIconLocation +// ----------------------------------------------------------------------------- +// +TInt CAknIconLocationInfo::GetIconLocation( + TInt16& aBitmapId, TInt16& aMaskId ) const + { + if ( !iLocations && !iSharedOffsets ) + { + // V1 MIF file. IDs do not need to be changed. + return KErrNone; + } + + TInt16 bitmapId; + + // MBG indexes start from KMifIdFirst. + TInt bitmapIndex = aBitmapId - KMifIdFirst; + + if ( bitmapIndex < 0 || + bitmapIndex >= iCount ) + { + return KErrEof; + } + + TInt offset; + if (iLocations) + { + // Fetch the icon offset info from the offset array that is + // retrieved from the MIF file + offset = iLocations[bitmapIndex]; + } + else + { + // Fetch the icon offset info from the offset array that is + // stored in the shared MifHeader instance + offset = iSharedOffsets->indicies()[bitmapIndex].iOffset; + } + + // Negative or zero offset means that it is a MBM icon, + // and the real icon index is then that offset changed to positive. + if ( offset <= 0 ) + { + bitmapId = -offset; + } + // Positive offset means that it is a MIF icon, + // the original icon index (from MBG file) should be used in that case. + else + { + bitmapId = aBitmapId; + } + + // Mask used? + if ( aMaskId >= 0 ) + { + // MBG indexes start from KMifIdFirst. + TInt maskIndex = aMaskId - KMifIdFirst; + + if ( maskIndex < 0 || + maskIndex >= iCount ) + { + return KErrEof; + } + + if (iLocations) + offset = iLocations[maskIndex]; + else + offset = iSharedOffsets->indicies()[maskIndex].iOffset; + + if ( offset <= 0 ) + { + aMaskId = -offset; + } + } + + aBitmapId = bitmapId; + return KErrNone; + } + +// End of File