Add workaround for Bug 2339, and add minigui-stripped.oby and minigui_syborg.oby
// Copyright (c) 2003-2009 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://#ifndef __TBIDI_H__#define __TBIDI_H__#include "TGraphicsHarness.h"inline TBool IsSupplementary(TUint aChar)/**@param aChar The 32-bit code point value of a Unicode character.@return True, if aChar is supplementary character; false, otherwise.*/ { return (aChar > 0xFFFF); }inline TBool IsHighSurrogate(TText16 aInt16)/**@return True, if aText16 is high surrogate; false, otherwise.*/ { return (aInt16 & 0xFC00) == 0xD800; }inline TBool IsLowSurrogate(TText16 aInt16)/**@return True, if aText16 is low surrogate; false, otherwise.*/ { return (aInt16 & 0xFC00) == 0xDC00; }inline TUint JoinSurrogate(TText16 aHighSurrogate, TText16 aLowSurrogate)/**Combine a high surrogate and a low surrogate into a supplementary character.@return The 32-bit code point value of the generated Unicode supplementary character.*/ { return ((aHighSurrogate - 0xD7F7) << 10) + aLowSurrogate; }inline TText16 GetHighSurrogate(TUint aChar)/**Retrieve the high surrogate of a supplementary character.@param aChar The 32-bit code point value of a Unicode character.@return High surrogate of aChar, if aChar is a supplementary character; aChar itself, if aChar is not a supplementary character.*/ { return STATIC_CAST(TText16, 0xD7C0 + (aChar >> 10)); }inline TText16 GetLowSurrogate(TUint aChar)/**Retrieve the low surrogate of a supplementary character.@param aChar The 32-bit code point value of a Unicode character.@return Low surrogate of aChar, if aChar is a supplementary character; zero, if aChar is not a supplementary character.*/ { return STATIC_CAST(TText16, 0xDC00 | (aChar & 0x3FF)); }void AppendCharacter(HBufC *aDes, TUint aChar);void AppendCharacter(TBuf<24> *aDes, TUint aChar);// Class to implement a wrapping iterator meant for extracting 16 bit characters// from a block of text// This class can handle surrogate pairs correctly.class TextIterator {public: TextIterator(const TText16* aData, const TInt aLength) : iData(aData), iLength(aLength), iIndex(0), iWrapped(EFalse), iCombineSurrogatePairs(ETrue) { } TextIterator(const TText16* aData, const TInt aLength, const TInt aIndex) : iData(aData), iLength(aLength), iIndex(aIndex), iWrapped(EFalse), iCombineSurrogatePairs(ETrue) { } TextIterator(const TText16* aData, const TInt aLength, const TInt aIndex, TBool aCombineSurrogatePairs) : iData(aData), iLength(aLength), iIndex(aIndex), iWrapped(EFalse), iCombineSurrogatePairs(aCombineSurrogatePairs) { } // Next character from data - wrap pointer to keep within data. // Get current char, then move the internal pointer forward to next char. TUint NextChar() { TUint ch = Char(); if (iCombineSurrogatePairs && IsSupplementary(ch)) iIndex += 2; else iIndex += 1; // wrap if (iIndex >= iLength) { iIndex = 0; iWrapped = ETrue; } return ch; } // Move the internal pointer backward, then return the char pointed by internal char. // Panic if iIndex already = 0. TUint PreviousChar() { ASSERT(iIndex > 0); iIndex--; if (iCombineSurrogatePairs && IsLowSurrogate(iData[iIndex])) { ASSERT(iIndex > 0); iIndex--; ASSERT(IsHighSurrogate(iData[iIndex])); } else if (iCombineSurrogatePairs && IsHighSurrogate(iData[iIndex])) { ASSERT(EFalse); } else { // do nothing } return Char(); } //Reset the iterator to the original values void Reset() { iIndex = 0; iWrapped = EFalse; } void SetIndex(const TInt aIndex) { iIndex = aIndex; iWrapped = EFalse; } //Has the iterator wrapped back to the start of the buffer at least once? TBool Wrapped() const { return iWrapped; } //Where is the current buffer index? TInt Index() const { return iIndex; } //Return pointer to data const TText16* Ptr() const { return iData; } //Get length of data TInt Length() const { return iLength; } //Get character at current index TUint Char() const { TUint ch = 0xFFFF; TText16 i16 = iData[iIndex]; if (iCombineSurrogatePairs && IsHighSurrogate(i16)) { ASSERT(iIndex+1 < iLength); TText16 low = iData[iIndex+1]; ch = JoinSurrogate(i16, low); } else if (iCombineSurrogatePairs && IsLowSurrogate(i16)) { ASSERT(EFalse); } else { ch = i16; } return ch; } // Fill aBuffer with a char, fill at aIndex, guarded by aMaxIndex (excluded). // After return, aIndex points to the next position, if aUpdate_aIndex=ETrue. // aUpdate_aIndex: do you want to update the parameter aIndex? // aUpdate_iIndex: do you want to update the member variable iIndex? // aChar: [out] current char TBool NextCharInto(TDes &aBuffer, TInt &aIndex, TInt aMaxIndex=-1, TBool aUpdate_aIndex=ETrue, TBool aUpdate_iIndex=ETrue, TUint *aChar=NULL) { if (aMaxIndex < 0) aMaxIndex = aBuffer.Length(); if (aIndex >= aMaxIndex) return EFalse; TUint ch = Char(); if (iCombineSurrogatePairs && IsSupplementary(ch)) { if (aIndex+1 >= aMaxIndex) return EFalse; aBuffer[aIndex] = GetHighSurrogate(ch); aBuffer[aIndex+1] = GetLowSurrogate(ch); if (aUpdate_aIndex) aIndex += 2; } else { aBuffer[aIndex] = (TText16)ch; if (aUpdate_aIndex) aIndex++; } if (aChar) *aChar = ch; if (aUpdate_iIndex) { if (iCombineSurrogatePairs && IsSupplementary(ch)) iIndex += 2; else iIndex += 1; if (iIndex >= iLength) { iIndex = 0; iWrapped = ETrue; } } return ETrue; } // Fill aBuffer from aIndex to aMaxIndex (excluded). // aMaxIndex=-1 means fill to index=aBuffer.Length. // After return, aIndex points to the next position, if aUpdate_aIndex=ETrue. TBool FillInto(TDes &aBuffer, TInt &aIndex, TInt aMaxIndex=-1) { if (aMaxIndex == -1) aMaxIndex = aBuffer.Length(); while (aIndex < aMaxIndex) { TBool b = NextCharInto(aBuffer, aIndex, aMaxIndex); if (!b) { return ETrue; } } return ETrue; }private: const TText16* iData; TInt iLength; TInt iIndex; TBool iWrapped; TBool iCombineSurrogatePairs; // ETrue = combine surrogates; EFalse = take single surrogate as character };class CTBiDiStep : public CTGraphicsStep {public: CTBiDiStep();protected: //from CTGraphicsStep virtual CTGraphicsBase* CreateTestL(); };_LIT(KTBiDiStep,"TBiDi");#endif