os/textandloc/fontservices/textbase/sgdi/FontIndic.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
/**
sl@0
    17
 @file
sl@0
    18
 @internalComponent
sl@0
    19
*/
sl@0
    20
sl@0
    21
//#include <gdi.h>
sl@0
    22
#include <DisplayMode.h>
sl@0
    23
#include "FontIndic.h"
sl@0
    24
//#include <textbase.h>
sl@0
    25
#include "GlyphSel.h"
sl@0
    26
#include "ShapeInfo.h"
sl@0
    27
#include "gdiinline.inl"
sl@0
    28
sl@0
    29
// State machine for determining syllable boundaries.
sl@0
    30
// Key: D = Dependent vowel. V = Virama. N = Nukta
sl@0
    31
// I = Independent Vowel. S = Candrabindu/Anusvara/Visarga
sl@0
    32
// C = Consonant. J = zero-width joiner. X = Other
sl@0
    33
// A = Addak (double the following constant)
sl@0
    34
enum TSyllableState
sl@0
    35
	{
sl@0
    36
	EReject = -1,
sl@0
    37
	// Begin + I: add and move to IndependentVowel
sl@0
    38
	// Begin + C: add and move to Consonant
sl@0
    39
	// Begin + V/N/D/S/J/X: add and close syllable
sl@0
    40
	EBegin = 0,
sl@0
    41
	// Consonant + D: add and move to ConsonantVowel
sl@0
    42
	// Consonant + N: add
sl@0
    43
	// Consonant + V: add and move to Virama
sl@0
    44
	// Consonant + S: add and close syllable
sl@0
    45
	// Consonant + C/I/J/X: close syllable
sl@0
    46
	EConsonant = 1,
sl@0
    47
	// Consonant2 + D: add and move to ConsonantVowel
sl@0
    48
	// Consonant2 + N: add
sl@0
    49
	// Consonant2 + V: add and move to Virama2
sl@0
    50
	// Consonant2 + S: add and close syllable
sl@0
    51
	// Consonant2 + C/I/J/X: close syllable
sl@0
    52
	EConsonant2 = 2,
sl@0
    53
	// Consonant3 + D: add and move to ConsonantVowel
sl@0
    54
	// Consonant3 + N: add
sl@0
    55
	// Consonant3 + V: add and move to Virama3
sl@0
    56
	// Consonant3 + S: add and close syllable
sl@0
    57
	// Consonant3 + C/I/J/X: close syllable
sl@0
    58
	EConsonant3 = 3,
sl@0
    59
	// Consonant + D: add and move to ConsonantVowel
sl@0
    60
	// Consonant + N: add
sl@0
    61
	// Consonant + V: add and close syllable
sl@0
    62
	// Consonant + S: add and close syllable
sl@0
    63
	// Consonant + C/I/J/X: close syllable
sl@0
    64
	EConsonant4 = 4,
sl@0
    65
	// IndependentVowel + S: add
sl@0
    66
	// IndependentVowel + D/V/N/I/C/J/X: close syllable
sl@0
    67
	EIndependentVowel = 5,
sl@0
    68
	// Virama + C: add and move to Consonant
sl@0
    69
	// Virama + J: add and close syllable
sl@0
    70
	// Virama + N/V/D/I/S/X: close syllable
sl@0
    71
	EVirama = 6,
sl@0
    72
	// Virama2 + C: add and move to Consonant3
sl@0
    73
	// Virama2 + J: add and close syllable
sl@0
    74
	// Virama2 + N/V/D/I/S/X: close syllable
sl@0
    75
	EVirama2 = 7,
sl@0
    76
	// Virama3 + C: add and move to Consonant4
sl@0
    77
	// Virama3 + J: add and close syllable
sl@0
    78
	// Virama3 + N/V/D/I/S/X: close syllable
sl@0
    79
	EVirama3 = 8,
sl@0
    80
	// Virama4 + J: add and close syllable
sl@0
    81
	// Virama4 + CN/V/D/I/S/X: close syllable
sl@0
    82
	EVirama4 = 9,
sl@0
    83
	// ConsonantVowel + S: add
sl@0
    84
	// ConsonantVowel + D/V/N/I/C/J/X: close syllable
sl@0
    85
	EConsonantVowel = 10,
sl@0
    86
	// NuktaConsonant + D/V: add
sl@0
    87
	// NuktaConsonant + S/N/I/C/J/X: close syllable
sl@0
    88
	ENuktaConsonant = 11,
sl@0
    89
	// NuktaConsonant + D/V: add
sl@0
    90
	// NuktaConsonant + S/N/I/C/J/X: close syllable
sl@0
    91
	ENuktaConsonant2 = 12,
sl@0
    92
	// NuktaConsonant + D/V: add
sl@0
    93
	// NuktaConsonant + S/N/I/C/J/X: close syllable
sl@0
    94
	ENuktaConsonant3 = 13,
sl@0
    95
	// NuktaConsonant + D: add
sl@0
    96
	// NuktaConsonant + V/S/N/I/C/J/X: close syllable
sl@0
    97
	ENuktaConsonant4 = 14,
sl@0
    98
	// IndependentVowelA + CANDRA E: add
sl@0
    99
	// IndependentVowelA + anything else: close syllable
sl@0
   100
	EIndependentVowelA = 15,
sl@0
   101
	// ZeroWidthJoinerC + V: add
sl@0
   102
	// ZeroWidthJoinerC + C/S/N/I/J/X/D: close syllable
sl@0
   103
	EZeroWidthJoinerC = 16,
sl@0
   104
	// ZeroWidthJoinerA + CANDRA E: add
sl@0
   105
	// ZeroWidthJoinerA +anything else: close syllable
sl@0
   106
	EZeroWidthJoinerA = 17,
sl@0
   107
	// ZeroWidthJoinerV + C/N: add
sl@0
   108
	// ZeroWidthJoinerV + anything else: close syllable
sl@0
   109
	EZeroWidthJoinerV = 18,
sl@0
   110
	// ZeroWidthJoinerV2 + C/N: add
sl@0
   111
	// ZeroWidthJoinerV2 + anything else: close syllable
sl@0
   112
	EZeroWidthJoinerV2 = 19,
sl@0
   113
	// ZeroWidthJoinerV3 + C/N: add
sl@0
   114
	// ZeroWidthJoinerV3 + anything else: close syllable
sl@0
   115
	EZeroWidthJoinerV3 =20,
sl@0
   116
	// EKannadaRa + C/N/V/ZWJ(C): add
sl@0
   117
	EKannadaRa = 21,
sl@0
   118
	// ESplitVowel1 + SV2: add and close syllable
sl@0
   119
	// ESPlitVowel1 + anything else: close syllable
sl@0
   120
	ESplitVowel1 = 22,
sl@0
   121
	//EGurBearerA + EIndicCodeGurDependentVowelA: add and move to EIndependentVowel
sl@0
   122
	//EGurBearerA + modifier: add and close syllable
sl@0
   123
	//EGurBearerA + anything else: close syllable
sl@0
   124
	EGurBearerA = 23,
sl@0
   125
	//EGurBearerU + EIndicCodeGurDependentVowelU: add and move to EIndependentVowel
sl@0
   126
	//EGurBearerU + anything else: close syllable
sl@0
   127
	EGurBearerU = 24,
sl@0
   128
	//EGurBearerI + EIndicCodeGurDependentVowelI: add and move to EIndependentVowel
sl@0
   129
	//EGurBearerI + anything else: close syllable	
sl@0
   130
	EGurBearerI = 25,
sl@0
   131
	
sl@0
   132
	EConsonantMalaChillu = 26,
sl@0
   133
	EConsonantMalaChillu2 = 27,
sl@0
   134
	EConsonantMalaChillu3 = 28,
sl@0
   135
	EViramaMalaChillu = 29,
sl@0
   136
	EViramaMalaChillu2 = 30,
sl@0
   137
	EViramaMalaChillu3 = 31,
sl@0
   138
	EConsonantMalaChilluNA = 32,
sl@0
   139
	EConsonantMalaChilluNA2 = 33,
sl@0
   140
	EConsonantMalaChilluNA3 = 34,
sl@0
   141
	EViramaMalaChilluNA = 35,
sl@0
   142
	EViramaMalaChilluNA2 = 36,
sl@0
   143
	EViramaMalaChilluNA3 = 37,
sl@0
   144
	EZeroWidthJoinerMalaChilluNA = 38,
sl@0
   145
	EZeroWidthJoinerMalaChilluNA2 = 39,
sl@0
   146
	EZeroWidthJoinerMalaChilluNA3 = 40,
sl@0
   147
	// Add and close acceptances go here.
sl@0
   148
	EAccept = 41
sl@0
   149
	};
sl@0
   150
sl@0
   151
/** Defines the transitions for a state machine for determining syllable
sl@0
   152
boundaries. The machine starts in state 0. On receiving a character of type t
sl@0
   153
while in state s, moves to state KStateResponse[s][t]. */
sl@0
   154
const TSyllableState KStateResponse[42][24] =
sl@0
   155
	{
sl@0
   156
	// EBegin -- nothing added yet
sl@0
   157
	{EAccept, EAccept, EIndependentVowel, EConsonant, EAccept, EAccept, EAccept, EAccept, ENuktaConsonant, EIndependentVowelA, EAccept, EKannadaRa, EAccept, EAccept, EAccept, EGurBearerA, EGurBearerU, EGurBearerI, EAccept, EAccept, EAccept, EConsonantMalaChillu,EConsonantMalaChilluNA,EConsonant},
sl@0
   158
	// EConsonant -- seen a consonant either at the start or after virama
sl@0
   159
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama, ENuktaConsonant, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   160
	// EConsonant2 -- seen a consonant after virama
sl@0
   161
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama2, ENuktaConsonant2, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   162
	// EConsonant3 -- seen a consonant after virama2 
sl@0
   163
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama3, ENuktaConsonant3, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   164
	// EConsonant4 -- seen a consonant after virama3
sl@0
   165
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama4, ENuktaConsonant4, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   166
	// EIndependentVowel -- possibly nasalized. I haven't bothered to distinguish between
sl@0
   167
	// nasalization and visarga.
sl@0
   168
	{EReject, EAccept, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonantVowel, EReject, EReject, EReject, EReject, EReject, EReject, EReject,EReject,EReject},
sl@0
   169
	// EVirama -- just seen a virama in a legal context. Must be consonant or ZWJ next
sl@0
   170
	{EReject, EReject, EReject, EConsonant2, EReject, EReject, EReject, EZeroWidthJoinerV, ENuktaConsonant2, EReject, EReject, EConsonant2, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonantMalaChillu2,EConsonantMalaChilluNA2,EConsonant2},
sl@0
   171
	// EVirama2 -- just seen a virama in a legal context. Must be consonant2
sl@0
   172
	{EReject, EReject, EReject, EConsonant3, EReject, EReject, EReject, EZeroWidthJoinerV2, ENuktaConsonant3, EReject, EReject, EConsonant3, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonantMalaChillu3,EConsonantMalaChilluNA3,EConsonant3},
sl@0
   173
	// EVirama3 -- just seen a virama in a legal context. Must be consonant3
sl@0
   174
	{EReject, EReject, EReject, EConsonant4, EReject, EReject, EReject, EZeroWidthJoinerV3, ENuktaConsonant4, EReject, EReject, EConsonant4, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonant4,EConsonant4,EConsonant4},
sl@0
   175
	// EVirama4 -- just seen a virama in a legal context. Must be consonant4
sl@0
   176
	{EReject, EReject, EReject, EReject, EReject, EReject, EReject, EAccept, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject,EReject,EReject},
sl@0
   177
	// EConsonantVowel -- Just seen a consonant with matra. Can only nasalize or visarg
sl@0
   178
	{EReject, EAccept, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject,EReject,EReject},
sl@0
   179
	// ENuktaConsonant -- Just seen a consonant with Nukta. Can only accept a dependant vowel or a Virama at this stage.
sl@0
   180
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama, EReject, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   181
	// ENuktaConsonant2 -- Just seen a consonant with Nukta after a virama.
sl@0
   182
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama2, EReject, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   183
	// ENuktaConsonant3 -- Just seen a consonant with Nukta after Virama2.
sl@0
   184
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama3, EReject, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   185
	// ENuktaConsonant4 -- Just seen a consonant with Nukta after Virama3.
sl@0
   186
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama4, EReject, EReject, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   187
	// EIndependentVowelA -- Special case Devanagari independent vowel
sl@0
   188
	{EReject, EAccept, EReject, EReject, EReject, EReject, EReject, EZeroWidthJoinerA, EReject, EReject, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   189
	// EZeroWidthJoinerC -- Just seen a ZWJ after a consonant
sl@0
   190
	{EReject, EReject, EReject, EReject, EReject, EVirama, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject,EReject,EReject},
sl@0
   191
	// EZeroWidthJoinerA -- Just seen a ZWJ after the dependent Vowel A
sl@0
   192
	{EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EAccept, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject,EReject,EReject},
sl@0
   193
	// EZeroWidthJoinerV -- Just seen the ZWJ after the first pair of consonant + virama
sl@0
   194
	{EReject, EAccept, EReject, EConsonant2, EReject, EReject, EReject, EReject, ENuktaConsonant2, EReject, EReject, EConsonant2, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonantMalaChillu2,EConsonantMalaChilluNA2,EConsonant2},
sl@0
   195
	// EZeroWidthJoinerV2 -- Just seen the ZWJ after consonant + virama + consonant + virama
sl@0
   196
	{EReject, EAccept, EReject, EConsonant3, EReject, EReject, EReject, EReject, ENuktaConsonant3, EReject, EReject, EConsonant3, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonantMalaChillu3,EConsonantMalaChilluNA3,EConsonant3},
sl@0
   197
	// EZeroWidthJoinerV3 -- Just seen the ZWJ after consonant + virama + consonant + virama + consonant + virama
sl@0
   198
	{EReject, EAccept, EReject, EConsonant4, EReject, EReject, EReject, EReject, ENuktaConsonant4, EReject, EReject, EConsonant4, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonant4,EConsonant4,EConsonant4},
sl@0
   199
	// EKannadaRa -- Special case consonant
sl@0
   200
	{EReject, EAccept, EReject, EReject, EConsonantVowel, EVirama, ENuktaConsonant, EZeroWidthJoinerC, EReject, EReject, EConsonantVowel, EReject, ESplitVowel1, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EConsonantVowel, EReject,EReject,EReject},
sl@0
   201
	// ESplitVowel1 -- Just seen a consonant with first part of a split vowel. Can only nasalize, visarg or add second part of splt vowel
sl@0
   202
	{EReject, EAccept, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EConsonantVowel, EConsonantVowel, EReject, EReject, EReject, EReject, EReject, EReject, EReject,EReject,EReject},
sl@0
   203
	// EGurBearerA -- Just seen a dependent Vowel EIndicCodeGurDependentVowelA and modifier
sl@0
   204
	{EReject, EAccept, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EIndependentVowel, EReject, EReject, EReject,EReject,EReject},
sl@0
   205
	// EGurBearerU -- Just seen a dependent Vowel EIndicCodeGurDependentVowelU
sl@0
   206
	{EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EIndependentVowel, EReject, EReject,EReject,EReject},
sl@0
   207
	// EGurBearerI -- Just seen a dependent Vowel EIndicCodeGurDependentVowelI
sl@0
   208
	{EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EIndependentVowel, EReject,EReject,EReject},
sl@0
   209
	
sl@0
   210
	{EReject,EAccept,EReject,EReject,EConsonantVowel,EViramaMalaChillu,EReject,EReject,EReject,EReject,EReject,EReject,ESplitVowel1,EConsonantVowel,EConsonantVowel,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject},
sl@0
   211
	{EReject,EAccept,EReject,EReject,EConsonantVowel,EViramaMalaChillu2,EReject,EReject,EReject,EReject,EReject,EReject,ESplitVowel1,EConsonantVowel,EConsonantVowel,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject},
sl@0
   212
	{EReject,EAccept,EReject,EReject,EConsonantVowel,EViramaMalaChillu3,EReject,EReject,EReject,EReject,EReject,EReject,ESplitVowel1,EConsonantVowel,EConsonantVowel,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject},
sl@0
   213
	{EReject,EReject,EReject,EConsonant2,EReject,EReject,EReject,EAccept,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonantMalaChillu2,EConsonantMalaChilluNA2,EConsonant2},
sl@0
   214
	{EReject,EReject,EReject,EConsonant3,EReject,EReject,EReject,EAccept,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonantMalaChillu3,EConsonantMalaChilluNA3,EConsonant3},
sl@0
   215
	{EReject,EReject,EReject,EConsonant4,EReject,EReject,EReject,EAccept,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonant4,EConsonant4,EConsonant4},
sl@0
   216
	{EReject,EAccept,EReject,EReject,EConsonantVowel,EViramaMalaChilluNA,EReject,EReject,EReject,EReject,EReject,EReject,ESplitVowel1,EConsonantVowel,EConsonantVowel,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject},
sl@0
   217
	{EReject,EAccept,EReject,EReject,EConsonantVowel,EViramaMalaChilluNA2,EReject,EReject,EReject,EReject,EReject,EReject,ESplitVowel1,EConsonantVowel,EConsonantVowel,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject},
sl@0
   218
	{EReject,EAccept,EReject,EReject,EConsonantVowel,EViramaMalaChilluNA3,EReject,EReject,EReject,EReject,EReject,EReject,ESplitVowel1,EConsonantVowel,EConsonantVowel,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject},
sl@0
   219
	{EReject,EReject,EReject,EConsonant2,EReject,EReject,EReject,EZeroWidthJoinerMalaChilluNA,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonantMalaChillu2,EConsonantMalaChilluNA2,EConsonant2},
sl@0
   220
	{EReject,EReject,EReject,EConsonant3,EReject,EReject,EReject,EZeroWidthJoinerMalaChilluNA2,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonantMalaChillu3,EConsonantMalaChilluNA3,EConsonant3},
sl@0
   221
	{EReject,EReject,EReject,EConsonant4,EReject,EReject,EReject,EZeroWidthJoinerMalaChilluNA3,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonant4,EConsonant4,EConsonant4},
sl@0
   222
	{EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonant2},
sl@0
   223
	{EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonant3},
sl@0
   224
	{EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EReject,EConsonant4},
sl@0
   225
	
sl@0
   226
	// EAccept -- this one is added but anything further is rejected
sl@0
   227
	{EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject, EReject}
sl@0
   228
	};
sl@0
   229
sl@0
   230
TIndicCodeType CodeType(TInt aCode, const TIndicCodeMapping aCodeMap[], TInt aMapLen)
sl@0
   231
	{
sl@0
   232
	TInt start = 0;
sl@0
   233
	TInt end = aMapLen - 1;
sl@0
   234
	while (start != end)
sl@0
   235
		{
sl@0
   236
		const TInt mid = (start + end + 1) >> 1;
sl@0
   237
		if (aCodeMap[mid].iFirstCodeInRange <= aCode)
sl@0
   238
			start = mid;
sl@0
   239
		else
sl@0
   240
			end = mid - 1;
sl@0
   241
		}
sl@0
   242
	return static_cast<TIndicCodeType>(aCodeMap[start].iCodeType);
sl@0
   243
	}
sl@0
   244
sl@0
   245
const TText16* SyllableEnd(const TText16* aCurrentPosition,
sl@0
   246
	const TText16* aEnd, const TIndicCodeMapping aCodeMap[], TInt aMapLen)
sl@0
   247
	{
sl@0
   248
	TSyllableState state = EBegin;
sl@0
   249
	while (aCurrentPosition != aEnd)
sl@0
   250
		{
sl@0
   251
		const TIndicCodeType ct = CodeType(*aCurrentPosition, aCodeMap, aMapLen);
sl@0
   252
		state = KStateResponse[state][ct];
sl@0
   253
		if (state == EReject)
sl@0
   254
			return aCurrentPosition;
sl@0
   255
		++aCurrentPosition;
sl@0
   256
		}
sl@0
   257
	return aCurrentPosition;
sl@0
   258
	}
sl@0
   259
sl@0
   260
/**
sl@0
   261
Common function for all Indic scripts. 
sl@0
   262
Performs the shaping operation on Indic script text up to KMaxTextToShape.
sl@0
   263
*/	
sl@0
   264
TInt IndicShapingProcess(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo, 
sl@0
   265
						const TIndicCodeMapping aCodeMap[], TInt aMapLen, const TUint aHighChar, 
sl@0
   266
						const TUint aLowChar, const TUint32 aScript, const TUint32 aLang)
sl@0
   267
	{
sl@0
   268
	const TText16* startCharacter = aGss.iParam.iText.Ptr();
sl@0
   269
	const TText16* endCharacter = startCharacter + aGss.iParam.iText.Length();
sl@0
   270
	const TText16* currentCharacter = aGss.iText.CurrentPosition();
sl@0
   271
	TInt currentPosition = currentCharacter - startCharacter;
sl@0
   272
sl@0
   273
	// Do some new shaping
sl@0
   274
	
sl@0
   275
	// First close the existing RShapeInfo
sl@0
   276
	if(aShapeInfo.IsOpen())
sl@0
   277
		aShapeInfo.Close();
sl@0
   278
	
sl@0
   279
	// Find the end of Indic text whilst limiting the amount of text to be shaped to 
sl@0
   280
	// KMaxTextToShape. When finding the end of end position of the text to be shaped,
sl@0
   281
	// include numerals, punctuations and other control characters.
sl@0
   282
	const TText16* endIndic = currentCharacter;
sl@0
   283
	TChar endIndicChar = *endIndic;
sl@0
   284
	while((endIndic <= endCharacter || endIndic - currentCharacter <= KMaxTextToShape) &&
sl@0
   285
		 ((*endIndic >= aLowChar && *endIndic <= aHighChar) || 
sl@0
   286
		 	((endIndicChar.IsDigit() || endIndicChar.IsPunctuation()) && !QuoteOrBracketPair(*endIndic))))
sl@0
   287
		{
sl@0
   288
		if (endIndic == endCharacter || endIndic - currentCharacter > KMaxTextToShape)
sl@0
   289
			break;
sl@0
   290
		endIndic = SyllableEnd(endIndic, endCharacter, aCodeMap, aMapLen);	
sl@0
   291
		endIndicChar = *endIndic;
sl@0
   292
		}
sl@0
   293
	
sl@0
   294
	TInt endPosForShaping = endIndic - startCharacter;
sl@0
   295
	
sl@0
   296
	//Now shape from current position to the end of Hindi
sl@0
   297
	return aShapeInfo.Open(aGss.iFont, aGss.iParam.iText,
sl@0
   298
						currentPosition, endPosForShaping, aScript, aLang);
sl@0
   299
	}
sl@0
   300
sl@0
   301
/**
sl@0
   302
Common function for all Indic scripts. Adds the shaped glyphs to the glyph cluster.
sl@0
   303
This function is called regardless of whether shaping was done or skipped in this 
sl@0
   304
iteration of the Default Process
sl@0
   305
*/
sl@0
   306
TBool IndicPostShapingProcess(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo, 
sl@0
   307
							TInt aCurrPos, TInt aSyllEndPos, const TText16* aSyllableEnd)
sl@0
   308
	{
sl@0
   309
	// Now get all the shaped values
sl@0
   310
	// Get the number of glyphs, glyphs, positions and indices after shaping.
sl@0
   311
	TInt numGlyphs = aShapeInfo.GlyphCount();
sl@0
   312
	const TInt32* glyph = aShapeInfo.Glyphs();
sl@0
   313
	const RShapeInfo::TPoint16* position = aShapeInfo.GlyphPositions();
sl@0
   314
	const TInt16* indices = aShapeInfo.Indices();
sl@0
   315
	TPoint origin;
sl@0
   316
	
sl@0
   317
	// Shift the indices and positions until the current poisition is reached. This done so that the 
sl@0
   318
	// origin can be set back to the original co-ordinates at the start of this Hindi text
sl@0
   319
	while (*indices < aCurrPos)
sl@0
   320
		{
sl@0
   321
		position++;
sl@0
   322
		indices++;
sl@0
   323
		}
sl@0
   324
	// Set the origin back by subtracting the current position co-ordinates from the current pen position	
sl@0
   325
	origin.iX = aGss.iParam.iPen.iX - position->iX;
sl@0
   326
	origin.iY = aGss.iParam.iPen.iY - position->iY;
sl@0
   327
	
sl@0
   328
	// No re-initialise the indices and positions to start appending the glyphs to clusters from the beginning
sl@0
   329
	indices = aShapeInfo.Indices();
sl@0
   330
	position = aShapeInfo.GlyphPositions();
sl@0
   331
	
sl@0
   332
	// Now do some post shaping syllable chopping
sl@0
   333
	for (TInt i = 0; i < numGlyphs; i++, glyph++, position++, indices++)
sl@0
   334
		{
sl@0
   335
		if(*indices >= aSyllEndPos)
sl@0
   336
			break;
sl@0
   337
		if(*indices >= aCurrPos && *indices < aSyllEndPos)
sl@0
   338
			{
sl@0
   339
			aGss.iParam.iPen.iX = origin.iX + position->iX;
sl@0
   340
			aGss.iParam.iPen.iY = origin.iY + position->iY;
sl@0
   341
			
sl@0
   342
			//Just skip the non-existing glyph and continue handling other glyphs if AppendGlyphToCluster return false.
sl@0
   343
			// The "continue" statement is for avoiding the potential risk of handling the non-existing glyph.
sl@0
   344
			if (!aGss.AppendGlyphToCluster(0x80000000UL | *glyph))
sl@0
   345
				continue;
sl@0
   346
			}
sl@0
   347
		}
sl@0
   348
	
sl@0
   349
	// We'll do pen advance ourselves, thanks.
sl@0
   350
	aGss.iPen = TGlyphSelectionState::EPenAdvance_No;
sl@0
   351
	aGss.iParam.iPen.iX = origin.iX + position->iX;
sl@0
   352
	aGss.iParam.iPen.iY = origin.iY + position->iY;
sl@0
   353
	aGss.iClusterState = TGlyphSelectionState::EGClusterComplete;
sl@0
   354
	aGss.iText.SetCurrentPosition(aSyllableEnd);
sl@0
   355
	return ETrue;
sl@0
   356
	}
sl@0
   357
sl@0
   358
/**
sl@0
   359
Common function for all Indic scripts.
sl@0
   360
Performs shaping and Rasterizing operation on Indic script text 
sl@0
   361
*/
sl@0
   362
TBool DoProcess(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo, const TIndicScriptProcessorParameters& aScriptSpecificParameters){
sl@0
   363
	const TText16* startCharacter = aGss.iParam.iText.Ptr();
sl@0
   364
	const TText16* endCharacter = startCharacter + aGss.iParam.iText.Length();
sl@0
   365
	const TText16* currentCharacter = aGss.iText.CurrentPosition();
sl@0
   366
	TInt currentPosition = currentCharacter - startCharacter;
sl@0
   367
		
sl@0
   368
	// Get the logical end of the syllable from the input text. We will use this later to chop
sl@0
   369
	// syllables from the glyph values we get.
sl@0
   370
	const TText16* syllableEnd = SyllableEnd(currentCharacter, endCharacter, aScriptSpecificParameters.iCodeMap,
sl@0
   371
			aScriptSpecificParameters.iMapLen);
sl@0
   372
	TInt syllableEndPos = syllableEnd - startCharacter;
sl@0
   373
			
sl@0
   374
	TInt ret = KErrNone;
sl@0
   375
	if(currentPosition >= aShapeInfo.EndOfShapedText())	
sl@0
   376
		ret = IndicShapingProcess(aGss, aShapeInfo, aScriptSpecificParameters.iCodeMap, aScriptSpecificParameters.iMapLen, 
sl@0
   377
				aScriptSpecificParameters.iUCHigh, aScriptSpecificParameters.iUCLow, aScriptSpecificParameters.iScriptCode, aScriptSpecificParameters.iLanguageCode);
sl@0
   378
		
sl@0
   379
	// If an RShapeInfo could not be opened, call the default process
sl@0
   380
	if (ret != KErrNone)
sl@0
   381
		return GlyphSelector_Default::Process(aGss, aShapeInfo);	
sl@0
   382
	
sl@0
   383
	// Now call the post shaping process to add glyphs to the glyph cluster
sl@0
   384
	return IndicPostShapingProcess(aGss, aShapeInfo, currentPosition, syllableEndPos, syllableEnd);
sl@0
   385
}
sl@0
   386
sl@0
   387
/*************************************************** D E V A N A G A R I ***************************************************/
sl@0
   388
TBool GlyphSelector_Devanagari::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)
sl@0
   389
	{
sl@0
   390
	return DoProcess(aGss, aShapeInfo, KIndicDevParameters);
sl@0
   391
	}
sl@0
   392
	
sl@0
   393
/***************************************************** K A N N A D A ******************************************************/
sl@0
   394
TBool GlyphSelector_Kannada::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)
sl@0
   395
	{
sl@0
   396
	return DoProcess(aGss, aShapeInfo, KIndicKanParameters);
sl@0
   397
	}
sl@0
   398
sl@0
   399
/***************************************************** G U J A R A T I ******************************************************/
sl@0
   400
TBool GlyphSelector_Gujarati::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)
sl@0
   401
	{
sl@0
   402
	return DoProcess(aGss, aShapeInfo, KIndicGujParameters);
sl@0
   403
	}
sl@0
   404
sl@0
   405
/***************************************************** B E N G A L I ******************************************************/
sl@0
   406
TBool GlyphSelector_Bengali::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)
sl@0
   407
	{
sl@0
   408
	return DoProcess(aGss, aShapeInfo, KIndicBenParameters);
sl@0
   409
	}
sl@0
   410
sl@0
   411
/***************************************************** T A M I L ******************************************************/
sl@0
   412
TBool GlyphSelector_Tamil::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)
sl@0
   413
	{
sl@0
   414
	return DoProcess(aGss, aShapeInfo, KIndicTamParameters);
sl@0
   415
	}
sl@0
   416
sl@0
   417
/***************************************************** T E L U G U ******************************************************/
sl@0
   418
TBool GlyphSelector_Telugu::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)
sl@0
   419
	{
sl@0
   420
	return DoProcess(aGss, aShapeInfo, KIndicTelParameters);
sl@0
   421
	}
sl@0
   422
sl@0
   423
/***************************************************** G U R M U K H I ******************************************************/
sl@0
   424
TBool GlyphSelector_Gurmukhi::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)\
sl@0
   425
	{
sl@0
   426
	return DoProcess(aGss, aShapeInfo, KIndicGurParameters);
sl@0
   427
	}
sl@0
   428
sl@0
   429
/***************************************************** M A L A Y A L A M ******************************************************/
sl@0
   430
TBool GlyphSelector_Malayalam::Process(TGlyphSelectionState& aGss, RShapeInfo& aShapeInfo)
sl@0
   431
	{
sl@0
   432
	return DoProcess(aGss, aShapeInfo, KIndicMalParameters);
sl@0
   433
	}
sl@0
   434