diff -r 000000000000 -r 05e9090e2422 layouts/aknlayout2/src/AknLayout2Adaptation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layouts/aknlayout2/src/AknLayout2Adaptation.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,238 @@ +/* +* Copyright (c) 2002-2004 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 "AknLayout2AdaptationDataDef.h" +#include + +#define AKNLAYOUT_DEFINE_BYTECODE(name,byte) const TUint8 name = byte; +#include "AknLayoutByteCodes.h" + +enum TLayoutPanic + { + ENegativeOffset, + EOffsetOutOfRange, + EIllegalLineIndex, + EMultiLineOffsetOutOfRange, + EDecodeNotSupported + }; + +void Panic(TLayoutPanic aCode) + { + _LIT(KLayoutPanic, "Layout panic"); + User::Panic(KLayoutPanic, aCode); + } + +// local functions + + +// +// class AknLayoutAdaptationDecodeSupport +// + +TUint16 AknLayoutAdaptationDecodeSupport::DecodeBytes(const TUint8*& aPtr) + { + TUint8 ch = *aPtr++; + switch (ch) + { + case KByteWord: + { + TUint16 high = *aPtr++; + TUint16 low = *aPtr++; + return TUint16((high<<8) | low); + } + case KByteEmpty: + return TUint16(ELayoutEmpty); + case KByteP1: + { + TInt8 offset = *aPtr++; + return TUint16(p+offset); + } + case KByteP2: + { + TInt16 high = *aPtr++; + TUint16 low = *aPtr++; + return TUint16(p+((high<<8) | low)); + } + default: + return ch; + } + } + +const TUint* AknLayoutAdaptationDecodeSupport::DecodeTable(const TUint* aDataLookup, TInt aLineIndex) + { + const TUint* pApiId = aDataLookup + CdlEngine::LastApiId(); + const TUint8* pLimits = (const TUint8*)(pApiId-1); + __ASSERT_ALWAYS(pLimits[1] <= aLineIndex && aLineIndex <= pLimits[0], Panic(EIllegalLineIndex)); + return (TUint*)aDataLookup[(*pApiId) + aLineIndex]; + } + +const TUint8* AknLayoutAdaptationDecodeSupport::DataPtr(const SImplData* aImplData) + { + return aImplData->iByteCodedData + aImplData->iDataLookup[CdlEngine::LastApiId()]; + } + +void AknLayoutAdaptationDecodeSupport::DecodeMultiLineTextLine( + TAknTextLineLayout& aLine, const TUint* aDataLookup, const TUint8* aMultiInfo, TInt aNumParams, TInt aIndex1, TInt aIndex2, TInt aIndex3, TInt aIndex4, TInt aIndex_B) + { + // insert our desired index_B into the correct place + TInt numberOfLines = DecodeNumberOfLinesShown(aMultiInfo, aIndex1, aIndex2, aIndex3, aIndex4, aIndex_B); + + // now just call straight through to the adaptation layer + switch(aNumParams) + { + case 0: {aLine = ((TextLine0f_sig*)aDataLookup)(); break;} + case 1: {aLine = ((TextLine1f_sig*)aDataLookup)(aIndex1); break;} + case 2: {aLine = ((TextLine2f_sig*)aDataLookup)(aIndex1, aIndex2); break;} + case 3: {aLine = ((TextLine3f_sig*)aDataLookup)(aIndex1, aIndex2, aIndex3); break;} + } + + aLine.iNumberOfLinesShown = numberOfLines; + } + + +TInt AknLayoutAdaptationDecodeSupport::DecodeNumberOfLinesShown( + const TUint8* aParamPtr, TInt& aIndex1, TInt& aIndex2, TInt& aIndex3, TInt& aIndex4, TInt aIndex_B) + { + // For multiline APIs, the parameter order may be changed + TInt numberOfLinesShownParamNumber = aParamPtr[0]; + TInt numberOfLinesShown; + switch (numberOfLinesShownParamNumber) + { + case 0: + numberOfLinesShown = aIndex1; + break; + case 1: + numberOfLinesShown = aIndex2; + break; + case 2: + numberOfLinesShown = aIndex3; + break; + default: + numberOfLinesShown = aIndex4; + break; + } + + // index_B will have been removed from the multiline API, so insert desired index_B where it + // would have been, and shift up the other parameters. + TInt indexBParamNumber = aParamPtr[1]; + switch (indexBParamNumber) + { + case 0: + aIndex4 = aIndex3; + aIndex3 = aIndex2; + aIndex2 = aIndex1; + aIndex1 = aIndex_B; + break; + case 1: + aIndex4 = aIndex3; + aIndex3 = aIndex2; + aIndex2 = aIndex_B; + break; + case 2: + aIndex4 = aIndex3; + aIndex3 = aIndex_B; + break; + case 3: + aIndex4 = aIndex_B; + break; + default: + break; + } + + return numberOfLinesShown; + } + +EXPORT_C void AknLayoutAdaptationDecodeSupport::MultiLineTextLine( + TAknTextLineLayout& aLine, const TUint* aDataLookup, TInt aNumParams, TInt aIndex1, TInt aIndex2, TInt aIndex3, TInt aIndex4) + { + TInt lastApiId = CdlEngine::LastApiId(); + const TUint8* pMultiInfo = (const TUint8*)(aDataLookup + lastApiId); + const TUint* data = (TUint*)aDataLookup[lastApiId - 1]; + + // use index_B = 0 for our return value + // and use index_B = 1 to calculate baseline skip + TAknTextLineLayout line1; + DecodeMultiLineTextLine(aLine, data, pMultiInfo, aNumParams, aIndex1, aIndex2, aIndex3, aIndex4, 0); + DecodeMultiLineTextLine(line1, data, pMultiInfo, aNumParams, aIndex1, aIndex2, aIndex3, aIndex4, 1); + + aLine.iBaselineSkip = aLine.iB - line1.iB; + } + + +EXPORT_C void AknLayoutAdaptationDecodeSupport::MultiLineTextLine( + TAknTextLineLayout& /*aLine*/, const TUint* /*aDataLookup*/, const TRect& /*aRect*/, TInt /*aNumParams*/, TInt /*aIndex1*/, TInt /*aIndex2*/, TInt /*aIndex3*/, TInt /*aIndex4*/) + { + // no requirements for multiline texts that take a parent rect + Panic(EDecodeNotSupported); + } + +EXPORT_C void AknLayoutAdaptationDecodeSupport::WindowTable( + TAknWindowLineLayout& aLine, const TUint* aDataLookup, TInt aLineIndex, TInt aNumParams, TInt aIndex1, TInt aIndex2, TInt aIndex3, TInt /*aIndex4*/) + { + const TUint* data = DecodeTable(aDataLookup, aLineIndex); + switch(aNumParams) + { + case 0: {aLine = ((WindowLine0f_sig*)data)(); break;} + case 1: {aLine = ((WindowLine1f_sig*)data)(aIndex1); break;} + case 2: {aLine = ((WindowLine2f_sig*)data)(aIndex1, aIndex2); break;} + case 3: {aLine = ((WindowLine3f_sig*)data)(aIndex1, aIndex2, aIndex3); break;} + case 4: {/*aLine = ((WindowLine4f_sig*)data)(aIndex1, aIndex2, aIndex3, aIndex4);*/ Panic(EDecodeNotSupported); break;} + } + } + +EXPORT_C void AknLayoutAdaptationDecodeSupport::WindowTable( + TAknWindowLineLayout& aLine, const TUint* aDataLookup, TInt aLineIndex, const TRect& aRect, TInt aNumParams, TInt aIndex1, TInt aIndex2, TInt aIndex3, TInt /*aIndex4*/) + { + const TUint* data = DecodeTable(aDataLookup, aLineIndex); + switch(aNumParams) + { + case 0: {aLine = ((WindowLine0t_sig*)data)(aRect); break;} + case 1: {aLine = ((WindowLine1t_sig*)data)(aRect, aIndex1); break;} + case 2: {aLine = ((WindowLine2t_sig*)data)(aRect, aIndex1, aIndex2); break;} + case 3: {aLine = ((WindowLine3t_sig*)data)(aRect, aIndex1, aIndex2, aIndex3); break;} + case 4: {/*aLine = ((WindowLine4t_sig*)data)(aRect, aIndex1, aIndex2, aIndex3, aIndex4);*/ Panic(EDecodeNotSupported); break;} + } + } + +EXPORT_C void AknLayoutAdaptationDecodeSupport::TextTable( + TAknTextLineLayout& aLine, const TUint* aDataLookup, TInt aLineIndex, TInt aNumParams, TInt aIndex1, TInt aIndex2, TInt aIndex3, TInt aIndex4) + { + const TUint* data = DecodeTable(aDataLookup, aLineIndex); + switch(aNumParams) + { + case 0: {aLine = ((TextLine0f_sig*)data)(); break;} + case 1: {aLine = ((TextLine1f_sig*)data)(aIndex1); break;} + case 2: {aLine = ((TextLine2f_sig*)data)(aIndex1, aIndex2); break;} + case 3: {aLine = ((TextLine3f_sig*)data)(aIndex1, aIndex2, aIndex3); break;} + case 4: {aLine = ((TextLine4f_sig*)data)(aIndex1, aIndex2, aIndex3, aIndex4); break;} + } + } + +EXPORT_C void AknLayoutAdaptationDecodeSupport::TextTable( + TAknTextLineLayout& /*aLine*/, const TUint* /*aDataLookup*/, TInt /*aLineIndex*/, const TRect& /*aRect*/, TInt /*aNumParams*/, TInt /*aIndex1*/, TInt /*aIndex2*/, TInt /*aIndex3*/, TInt /*aIndex4*/) + { + // no requirements for text tables that take a parent rect + Panic(EDecodeNotSupported); + } + +EXPORT_C TAknLayoutTableLimits AknLayoutAdaptationDecodeSupport::TableLimits(const TUint* aDataLookup) + { + TUint8* encoded = (TUint8*)(aDataLookup + CdlEngine::LastApiId()); + TAknLayoutTableLimits limits = { encoded[1], encoded[0] }; + return limits; + }