layouts/aknlayout2/src/AknLayout2Adaptation.cpp
changeset 0 05e9090e2422
--- /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 <CdlEngine.h>
+
+#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;
+	}