fontservices/textbase/inc/BIDI.H
author hgs
Mon, 12 Jul 2010 14:38:26 +0800
changeset 45 662fa7de7023
permissions -rw-r--r--
201024_05
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
662fa7de7023 201024_05
hgs
parents:
diff changeset
     1
/*
662fa7de7023 201024_05
hgs
parents:
diff changeset
     2
* Copyright (c) 2003-2010 Nokia Corporation and/or its subsidiary(-ies).
662fa7de7023 201024_05
hgs
parents:
diff changeset
     3
* All rights reserved.
662fa7de7023 201024_05
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
662fa7de7023 201024_05
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
662fa7de7023 201024_05
hgs
parents:
diff changeset
     8
*
662fa7de7023 201024_05
hgs
parents:
diff changeset
     9
* Initial Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    11
*
662fa7de7023 201024_05
hgs
parents:
diff changeset
    12
* Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    13
*
662fa7de7023 201024_05
hgs
parents:
diff changeset
    14
* Description:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    15
* Definitions for bidirectional text reordering.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    16
* 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    17
*
662fa7de7023 201024_05
hgs
parents:
diff changeset
    18
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    19
662fa7de7023 201024_05
hgs
parents:
diff changeset
    20
662fa7de7023 201024_05
hgs
parents:
diff changeset
    21
662fa7de7023 201024_05
hgs
parents:
diff changeset
    22
#ifndef BIDI_H_
662fa7de7023 201024_05
hgs
parents:
diff changeset
    23
#define BIDI_H_
662fa7de7023 201024_05
hgs
parents:
diff changeset
    24
662fa7de7023 201024_05
hgs
parents:
diff changeset
    25
#include <e32std.h>
662fa7de7023 201024_05
hgs
parents:
diff changeset
    26
662fa7de7023 201024_05
hgs
parents:
diff changeset
    27
class RWriteStream;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    28
class RReadStream;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    29
662fa7de7023 201024_05
hgs
parents:
diff changeset
    30
662fa7de7023 201024_05
hgs
parents:
diff changeset
    31
class TBidirectionalState
662fa7de7023 201024_05
hgs
parents:
diff changeset
    32
/** 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    33
The bidirectional state class. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    34
This class contains functions that implement the Unicode Bidirectional Algorithm, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    35
which changes text from logical order to display order for the correct display 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    36
of right-to-left scripts, like Arabic and Hebrew. A TBidirectionalState object 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    37
carries the embedding level and stack from one line to the next. On construction 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    38
it is in its 'start of paragraph' state. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    39
@publishedAll
662fa7de7023 201024_05
hgs
parents:
diff changeset
    40
@released
662fa7de7023 201024_05
hgs
parents:
diff changeset
    41
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    42
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    43
	friend class CTBiDi;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    44
	
662fa7de7023 201024_05
hgs
parents:
diff changeset
    45
public:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    46
	
662fa7de7023 201024_05
hgs
parents:
diff changeset
    47
	class TRunInfo
662fa7de7023 201024_05
hgs
parents:
diff changeset
    48
	/** 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    49
	Information about a run of characters with the same bidirectional 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    50
	category. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    51
662fa7de7023 201024_05
hgs
parents:
diff changeset
    52
	An array of these representing a line is passed into, and reordered by, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    53
	ReorderLine(). 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    54
	@publishedAll
662fa7de7023 201024_05
hgs
parents:
diff changeset
    55
	@released
662fa7de7023 201024_05
hgs
parents:
diff changeset
    56
	*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    57
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    58
		public:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    59
		/** Category of a run of text: passed to ReorderLine(); these are 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    60
		passed in as TChar::TBdCategory values but are modified for internal 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    61
		use. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    62
		TUint iCategory;		
662fa7de7023 201024_05
hgs
parents:
diff changeset
    63
		/** Embedding level of this run: used internally by ReorderLine(). */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    64
		TUint8 iEmbeddingLevel;	
662fa7de7023 201024_05
hgs
parents:
diff changeset
    65
		/** Resolved direction of this run: 0 for left to right, 1 for right 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    66
		to left. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    67
		TUint8 iDirection;		
662fa7de7023 201024_05
hgs
parents:
diff changeset
    68
		/** Index of this run after reordering. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    69
		TInt iIndex;			
662fa7de7023 201024_05
hgs
parents:
diff changeset
    70
		/** Start of text; returned by ReorderText(). */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    71
		TInt iStart;			
662fa7de7023 201024_05
hgs
parents:
diff changeset
    72
		/** Length of text; returned by ReorderText(). */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    73
		TInt iLength;			
662fa7de7023 201024_05
hgs
parents:
diff changeset
    74
		};
662fa7de7023 201024_05
hgs
parents:
diff changeset
    75
662fa7de7023 201024_05
hgs
parents:
diff changeset
    76
	IMPORT_C TBidirectionalState();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    77
	IMPORT_C void ReorderLine(TRunInfo* aRunInfo,TInt aRuns,TBool aParStart,TBool aParEnd,TBool aParRightToLeft,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    78
					 TChar::TBdCategory aNextCategory,TChar::TBdCategory aNextStrongCategory,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    79
					 TBool& aVisualEndIsAmbiguous);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    80
	IMPORT_C void ReorderLine(TRunInfo* aRunInfo,TInt aRuns,TBool aParStart,TBool aParEnd,TBool aParRightToLeft,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    81
					 TChar::TBdCategory aNextCategory,TChar::TBdCategory aNextStrongCategory);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    82
	IMPORT_C static TInt ReorderText(const TText* aText,TInt aLength,TBool aParRightToLeft,TText*& aNewText);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    83
	IMPORT_C static void ReverseGroups(TText* aStart,TInt aLength);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    84
	IMPORT_C void Reset();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    85
	IMPORT_C TBool IsDefault() const;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    86
	IMPORT_C TBool operator==(const TBidirectionalState& aState) const;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    87
	IMPORT_C void ExternalizeL(RWriteStream& aDest);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    88
	IMPORT_C void InternalizeL(RReadStream& aSource);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    89
	TBool ParRightToLeft() const { return iStack[0].iEmbeddingLevel & 1; }
662fa7de7023 201024_05
hgs
parents:
diff changeset
    90
662fa7de7023 201024_05
hgs
parents:
diff changeset
    91
private:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    92
	// Bidirectional categories coded as bit flags
662fa7de7023 201024_05
hgs
parents:
diff changeset
    93
	enum TCategory
662fa7de7023 201024_05
hgs
parents:
diff changeset
    94
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    95
		ELeftToRight = 1 << TChar::ELeftToRight, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    96
		ELeftToRightEmbedding = 1 << TChar::ELeftToRightEmbedding,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    97
		ELeftToRightOverride = 1 << TChar::ELeftToRightOverride,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    98
		ERightToLeft = 1 << TChar::ERightToLeft,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    99
		ERightToLeftArabic = 1 << TChar::ERightToLeftArabic,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   100
		ERightToLeftEmbedding = 1 << TChar::ERightToLeftEmbedding, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   101
		ERightToLeftOverride = 1 << TChar::ERightToLeftOverride,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   102
		EPopDirectionalFormat = 1 << TChar::EPopDirectionalFormat, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   103
		EEuropeanNumber = 1 << TChar::EEuropeanNumber, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   104
		EEuropeanNumberSeparator = 1 << TChar::EEuropeanNumberSeparator, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   105
		EEuropeanNumberTerminator = 1 << TChar::EEuropeanNumberTerminator, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   106
		EArabicNumber = 1 << TChar::EArabicNumber,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   107
		ECommonNumberSeparator = 1 << TChar::ECommonNumberSeparator, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   108
		ENonSpacingMark = 1 << TChar::ENonSpacingMark, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   109
		EBoundaryNeutral = 1 << TChar::EBoundaryNeutral, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   110
		EParagraphSeparator = 1 << TChar::EParagraphSeparator, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   111
		ESegmentSeparator = 1 << TChar::ESegmentSeparator, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   112
		EWhitespace = 1 << TChar::EWhitespace, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   113
		EOtherNeutral = 1 << TChar::EOtherNeutral,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   114
662fa7de7023 201024_05
hgs
parents:
diff changeset
   115
		// useful groups
662fa7de7023 201024_05
hgs
parents:
diff changeset
   116
		EBdControlsGroup = ELeftToRightEmbedding | ERightToLeftEmbedding |
662fa7de7023 201024_05
hgs
parents:
diff changeset
   117
						   ELeftToRightOverride | ERightToLeftOverride | EPopDirectionalFormat,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   118
		ELeftToRightGroup = ELeftToRight | EEuropeanNumber | ELeftToRightOverride | ELeftToRightEmbedding,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   119
		ERightToLeftGroup = ERightToLeft | EArabicNumber | ERightToLeftArabic | ERightToLeftOverride |
662fa7de7023 201024_05
hgs
parents:
diff changeset
   120
							ERightToLeftEmbedding,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   121
		EStrongGroup = ELeftToRightEmbedding | ERightToLeftEmbedding
662fa7de7023 201024_05
hgs
parents:
diff changeset
   122
			| ELeftToRightOverride | ERightToLeftOverride
662fa7de7023 201024_05
hgs
parents:
diff changeset
   123
			| ELeftToRight | ERightToLeft | ERightToLeftArabic,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   124
662fa7de7023 201024_05
hgs
parents:
diff changeset
   125
		ENoCategory = 0
662fa7de7023 201024_05
hgs
parents:
diff changeset
   126
		};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   127
662fa7de7023 201024_05
hgs
parents:
diff changeset
   128
	enum
662fa7de7023 201024_05
hgs
parents:
diff changeset
   129
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   130
		EMaxExplicitLevel = 61,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   131
		EMaxLevel = 63,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   132
		EMaxStackLevels = 62
662fa7de7023 201024_05
hgs
parents:
diff changeset
   133
		};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   134
662fa7de7023 201024_05
hgs
parents:
diff changeset
   135
	enum TOverrideState
662fa7de7023 201024_05
hgs
parents:
diff changeset
   136
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   137
		ENoOverrideState = 0,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   138
		ELeftToRightOverrideState = ELeftToRightOverride,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   139
		ERightToLeftOverrideState = ERightToLeftOverride
662fa7de7023 201024_05
hgs
parents:
diff changeset
   140
		};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   141
662fa7de7023 201024_05
hgs
parents:
diff changeset
   142
	class TStackItem
662fa7de7023 201024_05
hgs
parents:
diff changeset
   143
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   144
	public:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   145
		TUint8 iEmbeddingLevel;			// embedding level
662fa7de7023 201024_05
hgs
parents:
diff changeset
   146
		TOverrideState iOverrideState;	// directional override state
662fa7de7023 201024_05
hgs
parents:
diff changeset
   147
		TCategory iStartCategory;		// category that started this level; EOtherNeutral if none
662fa7de7023 201024_05
hgs
parents:
diff changeset
   148
		};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   149
662fa7de7023 201024_05
hgs
parents:
diff changeset
   150
private:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   151
	/**	The information needed during line reordering.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   152
	WARNING: Class for internal use ONLY.  Compatibility is not guaranteed in future releases.	
662fa7de7023 201024_05
hgs
parents:
diff changeset
   153
	 */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   154
	class TReorderContext
662fa7de7023 201024_05
hgs
parents:
diff changeset
   155
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   156
	public:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   157
		void SetNextCategory(TChar::TBdCategory aCat);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   158
		void SetNextStrongCategory(TChar::TBdCategory aCat);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   159
	public:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   160
		/** Category at start of next line, or ON if at the end of the
662fa7de7023 201024_05
hgs
parents:
diff changeset
   161
		paragraph. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   162
		TCategory iNextCategory;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   163
		/** Which of L, R or AL appears first in the remainder of the
662fa7de7023 201024_05
hgs
parents:
diff changeset
   164
		paragraph, or ON if none. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   165
		TCategory iNextStrongCategory;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   166
		/** The run array for this line. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   167
		TRunInfo* iRunInfo;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   168
		/** The length of iRunInfo. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   169
		TInt iRuns;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   170
		/** Bitmap of categories currently present in iRunInfo. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   171
		TUint32 iCategories;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   172
		/** Found by the algorithm to set iPreviousStrongCategory. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
   173
		TCategory iLastStrongCategory;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   174
		};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   175
662fa7de7023 201024_05
hgs
parents:
diff changeset
   176
public:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   177
	static TInt GenerateBdRunArray(const TText* aText, TInt aLength,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   178
		TBidirectionalState::TRunInfo* aRun, TInt aMaxRuns);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   179
662fa7de7023 201024_05
hgs
parents:
diff changeset
   180
private:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   181
	const TStackItem& State() const { return iStack[iStackLevel]; }
662fa7de7023 201024_05
hgs
parents:
diff changeset
   182
	TCategory Push(TCategory aStartCategory);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   183
	TCategory Pop();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   184
662fa7de7023 201024_05
hgs
parents:
diff changeset
   185
public:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   186
	TBidirectionalState(TChar::TBdCategory aPrevCat,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   187
		TChar::TBdCategory aPrevStrongCat, TBool aParRightToLeft);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   188
	void HandleBdControls(TReorderContext& aContext); 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   189
	void ResolveWeakTypesW1W2W3(TReorderContext& aContext);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   190
	void ResolveWeakTypesW4W5W6(TReorderContext& aContext); 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   191
	void ResolveWeakTypesW7(TReorderContext& aContext); 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   192
	void ResolveNeutralTypes(TReorderContext& aContext); 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   193
	void ResolveImplicitLevels(TReorderContext& aContext); 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   194
	void PrepareForNextLine(const TReorderContext& aContext);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   195
	void ReorderRuns(TReorderContext& aContext);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   196
	static TInt CatToNumber(TInt aCat);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   197
	static TCategory CharToBdCat(TChar::TBdCategory aCat);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   198
	static TCategory UintToBdCat(TUint aCat);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   199
	static void DeneutralizeRuns(TRunInfo* aStart, TRunInfo* aEnd,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   200
		TCategory aStartCategory, TCategory aEndCategory);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   201
private:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   202
	TCategory iPreviousCategory;			// category at end of last line, or EStartOfParagraph if at start of par
662fa7de7023 201024_05
hgs
parents:
diff changeset
   203
	TCategory iPreviousStrongCategory;		// L or R; derived from embedding level if at start of par
662fa7de7023 201024_05
hgs
parents:
diff changeset
   204
	TInt16 iStackLevel;						// current stack level
662fa7de7023 201024_05
hgs
parents:
diff changeset
   205
	TInt8 iPushesBeyond60;	// number of times Push called with iStackLevel == 60 and Left-To-Right category
662fa7de7023 201024_05
hgs
parents:
diff changeset
   206
	TInt8 iPushesBeyond61;	// number of times Push called with iStackLevel == 61
662fa7de7023 201024_05
hgs
parents:
diff changeset
   207
	TStackItem iStack[EMaxStackLevels];		// the stack of embedding levels
662fa7de7023 201024_05
hgs
parents:
diff changeset
   208
	};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   209
662fa7de7023 201024_05
hgs
parents:
diff changeset
   210
#endif // BIDI_H_