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