fontservices/textbase/sgdi/FontArabic.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) 2003-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
662fa7de7023 201024_05
hgs
parents:
diff changeset
    22
//#include <textbase.h>
662fa7de7023 201024_05
hgs
parents:
diff changeset
    23
#include <gdi.h>
662fa7de7023 201024_05
hgs
parents:
diff changeset
    24
#include "FontArabic.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    25
#include "TextBasePanic.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    26
662fa7de7023 201024_05
hgs
parents:
diff changeset
    27
662fa7de7023 201024_05
hgs
parents:
diff changeset
    28
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    29
// Arabic Presentation Forms.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    30
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    31
662fa7de7023 201024_05
hgs
parents:
diff changeset
    32
662fa7de7023 201024_05
hgs
parents:
diff changeset
    33
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
    34
 The contextual forms of each character in the range 0621 - 064A, in
662fa7de7023 201024_05
hgs
parents:
diff changeset
    35
 the order final, initial, medial; followed by the forms of
662fa7de7023 201024_05
hgs
parents:
diff changeset
    36
 the lam-alef ligatures (lam with 0622, 0623, 0625 and 0627);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    37
 followed by the forms of the characters in the range 0671 - 06D3
662fa7de7023 201024_05
hgs
parents:
diff changeset
    38
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    39
LOCAL_D const TUint16 TheArabicShapeTable[] =
662fa7de7023 201024_05
hgs
parents:
diff changeset
    40
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    41
	// Contextual forms for standard Arabic letters
662fa7de7023 201024_05
hgs
parents:
diff changeset
    42
	0x621, 0x621, 0x621,			// 621
662fa7de7023 201024_05
hgs
parents:
diff changeset
    43
	0xfe82, 0x622, 0x622,			// 622
662fa7de7023 201024_05
hgs
parents:
diff changeset
    44
	0xfe84, 0x623, 0x623,			// 623
662fa7de7023 201024_05
hgs
parents:
diff changeset
    45
	0xfe86, 0x624, 0x624,			// 624
662fa7de7023 201024_05
hgs
parents:
diff changeset
    46
	0xfe88, 0x625, 0x625,			// 625
662fa7de7023 201024_05
hgs
parents:
diff changeset
    47
	0xfe8a, 0xfe8b, 0xfe8c,			// 626
662fa7de7023 201024_05
hgs
parents:
diff changeset
    48
	0xfe8e, 0x627,	0x627,			// 627
662fa7de7023 201024_05
hgs
parents:
diff changeset
    49
	0xfe90, 0xfe91, 0xfe92,			// 628
662fa7de7023 201024_05
hgs
parents:
diff changeset
    50
	0xfe94, 0x629, 0x629,			// 629
662fa7de7023 201024_05
hgs
parents:
diff changeset
    51
	0xfe96, 0xfe97, 0xfe98,			// 62a
662fa7de7023 201024_05
hgs
parents:
diff changeset
    52
	0xfe9a, 0xfe9b, 0xfe9c,			// 62b
662fa7de7023 201024_05
hgs
parents:
diff changeset
    53
	0xfe9e, 0xfe9f, 0xfea0,			// 62c
662fa7de7023 201024_05
hgs
parents:
diff changeset
    54
	0xfea2, 0xfea3, 0xfea4,			// 62d
662fa7de7023 201024_05
hgs
parents:
diff changeset
    55
	0xfea6, 0xfea7, 0xfea8,			// 62e
662fa7de7023 201024_05
hgs
parents:
diff changeset
    56
	0xfeaa, 0x62f, 0x62f,			// 62f
662fa7de7023 201024_05
hgs
parents:
diff changeset
    57
	0xfeac, 0x630, 0x630,			// 630
662fa7de7023 201024_05
hgs
parents:
diff changeset
    58
	0xfeae, 0x631, 0x631,			// 631
662fa7de7023 201024_05
hgs
parents:
diff changeset
    59
	0xfeb0, 0x632, 0x632,			// 632
662fa7de7023 201024_05
hgs
parents:
diff changeset
    60
	0xfeb2, 0xfeb3, 0xfeb4,			// 633
662fa7de7023 201024_05
hgs
parents:
diff changeset
    61
	0xfeb6, 0xfeb7, 0xfeb8,			// 634
662fa7de7023 201024_05
hgs
parents:
diff changeset
    62
	0xfeba, 0xfebb, 0xfebc,			// 635
662fa7de7023 201024_05
hgs
parents:
diff changeset
    63
	0xfebe, 0xfebf, 0xfec0,			// 636
662fa7de7023 201024_05
hgs
parents:
diff changeset
    64
	0xfec2, 0xfec3, 0xfec4,			// 637
662fa7de7023 201024_05
hgs
parents:
diff changeset
    65
	0xfec6, 0xfec7, 0xfec8,			// 638
662fa7de7023 201024_05
hgs
parents:
diff changeset
    66
	0xfeca, 0xfecb, 0xfecc,			// 639
662fa7de7023 201024_05
hgs
parents:
diff changeset
    67
	0xfece, 0xfecf, 0xfed0,			// 63a
662fa7de7023 201024_05
hgs
parents:
diff changeset
    68
	0x63b, 0x63b, 0x63b,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    69
	0x63c, 0x63c, 0x63c,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    70
	0x63d, 0x63d, 0x63d,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    71
	0x63e, 0x63e, 0x63e,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    72
	0x63f, 0x63f, 0x63f,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    73
	0x640, 0x640, 0x640,			// 640
662fa7de7023 201024_05
hgs
parents:
diff changeset
    74
	0xfed2, 0xfed3, 0xfed4,			// 641
662fa7de7023 201024_05
hgs
parents:
diff changeset
    75
	0xfed6, 0xfed7, 0xfed8,			// 642
662fa7de7023 201024_05
hgs
parents:
diff changeset
    76
	0xfeda, 0xfedb, 0xfedc,			// 643
662fa7de7023 201024_05
hgs
parents:
diff changeset
    77
	0xfede, 0xfedf, 0xfee0,			// 644
662fa7de7023 201024_05
hgs
parents:
diff changeset
    78
	0xfee2, 0xfee3, 0xfee4,			// 645
662fa7de7023 201024_05
hgs
parents:
diff changeset
    79
	0xfee6, 0xfee7, 0xfee8,			// 646
662fa7de7023 201024_05
hgs
parents:
diff changeset
    80
	0xfeea, 0xfeeb, 0xfeec,			// 647
662fa7de7023 201024_05
hgs
parents:
diff changeset
    81
	0xfeee, 0x648, 0x648,			// 648
662fa7de7023 201024_05
hgs
parents:
diff changeset
    82
	0xfef0, 0xfbe8, 0xfbe9,			// 649
662fa7de7023 201024_05
hgs
parents:
diff changeset
    83
	0xfef2, 0xfef3, 0xfef4,			// 64A
662fa7de7023 201024_05
hgs
parents:
diff changeset
    84
662fa7de7023 201024_05
hgs
parents:
diff changeset
    85
	// Contextual forms for lam-alef ligatures
662fa7de7023 201024_05
hgs
parents:
diff changeset
    86
	0xfef6, 0xfef5, 0xfef5,			// 644 + 622
662fa7de7023 201024_05
hgs
parents:
diff changeset
    87
	0xfef8, 0xfef7, 0xfef7,			// 644 + 623
662fa7de7023 201024_05
hgs
parents:
diff changeset
    88
	0xfefa, 0xfef9, 0xfef9,			// 644 + 625
662fa7de7023 201024_05
hgs
parents:
diff changeset
    89
	0xfefc, 0xfefb, 0xfefb,			// 644 + 627
662fa7de7023 201024_05
hgs
parents:
diff changeset
    90
662fa7de7023 201024_05
hgs
parents:
diff changeset
    91
	// Contextual forms for extended Arabic letters for Persian, Urdu, Sindhi, etc.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    92
	0xfb51, 0x0671, 0x0671,			// 671
662fa7de7023 201024_05
hgs
parents:
diff changeset
    93
	0x0672, 0x0672, 0x0672,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    94
	0x0673, 0x0673, 0x0673,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    95
	0x0674, 0x0674, 0x0674,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    96
	0x0675, 0x0675, 0x0675,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    97
	0x0676, 0x0676, 0x0676,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    98
	0x0677, 0x0677, 0x0677,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
    99
	0x0678, 0x0678, 0x0678,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   100
	0xfb67, 0xfb68, 0xfb69,			// 679
662fa7de7023 201024_05
hgs
parents:
diff changeset
   101
	0xfb5f, 0xfb60, 0xfb61,			// 67a
662fa7de7023 201024_05
hgs
parents:
diff changeset
   102
	0xfb53, 0xfb54, 0xfb55,			// 67b
662fa7de7023 201024_05
hgs
parents:
diff changeset
   103
	0x067c, 0x067c, 0x067c,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   104
	0x067d, 0x067d, 0x067d,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   105
	0xfb57, 0xfb58, 0xfb59,			// 67e
662fa7de7023 201024_05
hgs
parents:
diff changeset
   106
	0xfb63, 0xfb64, 0xfb65,			// 67f
662fa7de7023 201024_05
hgs
parents:
diff changeset
   107
662fa7de7023 201024_05
hgs
parents:
diff changeset
   108
	0xfb5b, 0xfb5c, 0xfb5d,			// 680
662fa7de7023 201024_05
hgs
parents:
diff changeset
   109
	0x0681, 0x0681, 0x0681,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   110
	0x0682, 0x0682, 0x0682,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   111
	0xfb77, 0xfb78, 0xfb79,			// 683
662fa7de7023 201024_05
hgs
parents:
diff changeset
   112
	0xfb73, 0xfb74, 0xfb75,			// 684
662fa7de7023 201024_05
hgs
parents:
diff changeset
   113
	0x0685, 0x0685, 0x0685,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   114
	0xfb7b, 0xfb7c, 0xfb7d,			// 686
662fa7de7023 201024_05
hgs
parents:
diff changeset
   115
	0xfb7f, 0xfb80, 0xfb81,			// 687
662fa7de7023 201024_05
hgs
parents:
diff changeset
   116
	0xfb89, 0x0688, 0x0688,			// 688
662fa7de7023 201024_05
hgs
parents:
diff changeset
   117
	0x0689, 0x0689, 0x0689,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   118
	0x068a, 0x068a, 0x068a,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   119
	0x068b, 0x068b, 0x068b,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   120
	0xfb85, 0x068c, 0x068c,			// 68c
662fa7de7023 201024_05
hgs
parents:
diff changeset
   121
	0xfb83, 0x068d, 0x068d,			// 68d
662fa7de7023 201024_05
hgs
parents:
diff changeset
   122
	0xfb87, 0x068e, 0x068e,			// 68e
662fa7de7023 201024_05
hgs
parents:
diff changeset
   123
	0x068f, 0x068f, 0x068f,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   124
662fa7de7023 201024_05
hgs
parents:
diff changeset
   125
	0x0690, 0x0690, 0x0690,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   126
	0xfb8d, 0x0691, 0x0691,			// 691
662fa7de7023 201024_05
hgs
parents:
diff changeset
   127
	0x0692, 0x0692, 0x0692,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   128
	0x0693, 0x0693, 0x0693,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   129
	0x0694, 0x0694, 0x0694,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   130
	0x0695, 0x0695, 0x0695,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   131
	0x0696, 0x0696, 0x0696,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   132
	0x0697, 0x0697, 0x0697,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   133
	0xfb8b, 0x0698, 0x0698,			// 698
662fa7de7023 201024_05
hgs
parents:
diff changeset
   134
	0x0699, 0x0699, 0x0699,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   135
	0x069a, 0x069a, 0x069a,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   136
	0x069b, 0x069b, 0x069b,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   137
	0x069c, 0x069c, 0x069c,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   138
	0x069d, 0x069d, 0x069d,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   139
	0x069e, 0x069e, 0x069e,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   140
	0x069f, 0x069f, 0x069f,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   141
662fa7de7023 201024_05
hgs
parents:
diff changeset
   142
	0x06a0, 0x06a0, 0x06a0,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   143
	0x06a1, 0x06a1, 0x06a1,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   144
	0x06a2, 0x06a2, 0x06a2,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   145
	0x06a3, 0x06a3, 0x06a3,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   146
	0xfb6b, 0xfb6c, 0xfb6d,			// 6a4
662fa7de7023 201024_05
hgs
parents:
diff changeset
   147
	0x06a5, 0x06a5, 0x06a5,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   148
	0xfb6f, 0xfb70, 0xfb71,			// 6a6
662fa7de7023 201024_05
hgs
parents:
diff changeset
   149
	0x06a7, 0x06a7, 0x06a7,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   150
	0x06a8, 0x06a8, 0x06a8,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   151
	0xfb8f, 0xfb90, 0xfb91,			// 6a9
662fa7de7023 201024_05
hgs
parents:
diff changeset
   152
	0x06aa, 0x06aa, 0x06aa,			// 6aa
662fa7de7023 201024_05
hgs
parents:
diff changeset
   153
	0x06ab, 0x06ab, 0x06ab,			// 6ab
662fa7de7023 201024_05
hgs
parents:
diff changeset
   154
	0x06ac, 0x06ac, 0x06ac,			// 6ac
662fa7de7023 201024_05
hgs
parents:
diff changeset
   155
	0xfbd4, 0xfbd5, 0xfbd6,			// 6ad
662fa7de7023 201024_05
hgs
parents:
diff changeset
   156
	0x06ae, 0x06ae, 0x06ae,			// 6ae
662fa7de7023 201024_05
hgs
parents:
diff changeset
   157
	0xfb93, 0xfb94, 0xfb95,			// 6af
662fa7de7023 201024_05
hgs
parents:
diff changeset
   158
662fa7de7023 201024_05
hgs
parents:
diff changeset
   159
	0x06b0, 0x06b0, 0x06b0,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   160
	0xfb9b, 0xfb9c, 0xfb9d,			// 6b1
662fa7de7023 201024_05
hgs
parents:
diff changeset
   161
	0x06b2, 0x06b2, 0x06b2,			// 6b2
662fa7de7023 201024_05
hgs
parents:
diff changeset
   162
	0xfb97, 0xfb98, 0xfb99,			// 6b3
662fa7de7023 201024_05
hgs
parents:
diff changeset
   163
	0x06b4, 0x06b4, 0x06b4,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   164
	0x06b5, 0x06b5, 0x06b5,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   165
	0x06b6, 0x06b6, 0x06b6,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   166
	0x06b7, 0x06b7, 0x06b7,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   167
	0x06b8, 0x06b8, 0x06b8,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   168
	0x06b9, 0x06b9, 0x06b9,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   169
	0xfb9f, 0x06ba, 0x06ba,			// 6ba
662fa7de7023 201024_05
hgs
parents:
diff changeset
   170
	0xfba1, 0xfba2, 0xfba3,			// 6bb
662fa7de7023 201024_05
hgs
parents:
diff changeset
   171
	0x06bc, 0x06bc, 0x06bc,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   172
	0x06bd, 0x06bd, 0x06bd,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   173
	0xfbab, 0xfbac, 0xfbad,			// 6be
662fa7de7023 201024_05
hgs
parents:
diff changeset
   174
	0x06bf, 0x06bf, 0x06bf,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   175
662fa7de7023 201024_05
hgs
parents:
diff changeset
   176
	0xfba5, 0x06c0, 0x06c0,			// 6c0
662fa7de7023 201024_05
hgs
parents:
diff changeset
   177
	0xfba7, 0xfba8, 0xfba9,			// 6c1
662fa7de7023 201024_05
hgs
parents:
diff changeset
   178
	0x06c2, 0x06c2, 0x06c2,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   179
	0x06c3, 0x06c3, 0x06c3,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   180
	0x06c4, 0x06c4, 0x06c4,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   181
	0xfbe1, 0x06c5, 0x06c5,			// 6c5
662fa7de7023 201024_05
hgs
parents:
diff changeset
   182
	0xfbda, 0x06c6, 0x06c6,			// 6c6
662fa7de7023 201024_05
hgs
parents:
diff changeset
   183
	0xfbd8, 0x06c7, 0x06c7,			// 6c7
662fa7de7023 201024_05
hgs
parents:
diff changeset
   184
	0xfbdc, 0x06c8, 0x06c8,			// 6c8
662fa7de7023 201024_05
hgs
parents:
diff changeset
   185
	0xfbe3, 0x06c9, 0x06c9,			// 6c9
662fa7de7023 201024_05
hgs
parents:
diff changeset
   186
	0x06ca, 0x06ca, 0x06ca,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   187
	0xfbdf, 0x06cb, 0x06cb,			// 6cb
662fa7de7023 201024_05
hgs
parents:
diff changeset
   188
	0xfbfd, 0xfbfe, 0xfbff,			// 6cc
662fa7de7023 201024_05
hgs
parents:
diff changeset
   189
	0x06cd, 0x06cd, 0x06cd,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   190
	0x06ce, 0x06ce, 0x06ce,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   191
	0x06cf, 0x06cf, 0x06cf,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   192
662fa7de7023 201024_05
hgs
parents:
diff changeset
   193
	0xfbe5, 0xfbe6, 0xfbe7,			// 6d0
662fa7de7023 201024_05
hgs
parents:
diff changeset
   194
	0x06d1, 0x06d1, 0x06d1,			// placeholder
662fa7de7023 201024_05
hgs
parents:
diff changeset
   195
	0xfbaf, 0x06d2, 0x06d2,			// 6d2
662fa7de7023 201024_05
hgs
parents:
diff changeset
   196
	0xfbb1, 0x06d3, 0x06d3			// 6d3
662fa7de7023 201024_05
hgs
parents:
diff changeset
   197
	};
662fa7de7023 201024_05
hgs
parents:
diff changeset
   198
662fa7de7023 201024_05
hgs
parents:
diff changeset
   199
662fa7de7023 201024_05
hgs
parents:
diff changeset
   200
static const int KFinal = 0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   201
static const int KInitial = 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   202
static const int KMedial = 2;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   203
static const int KStandardShapeTableOffset = 0x621;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   204
static const int KLamAlefShapeTableStart = 0x64B - 0x621;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   205
static const int KExtendedShapeTableOffset = 0x671 - (0x64f - 0x621);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   206
662fa7de7023 201024_05
hgs
parents:
diff changeset
   207
662fa7de7023 201024_05
hgs
parents:
diff changeset
   208
static inline TInt ArabicShapeTableIndex(TInt aCode)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   209
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   210
	if (aCode >= 0x621 && aCode <= 0x64a)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   211
		return (aCode - KStandardShapeTableOffset) * 3;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   212
	if (aCode >= 0x671 && aCode <= 0x6d3)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   213
		return (aCode - KExtendedShapeTableOffset) * 3;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   214
	return KErrNotFound;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   215
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   216
662fa7de7023 201024_05
hgs
parents:
diff changeset
   217
662fa7de7023 201024_05
hgs
parents:
diff changeset
   218
static inline TBool IsArabicPoint(TInt aCode)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   219
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   220
	return (aCode >= 0x64B && aCode <= 0x655) || aCode == 0x670;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   221
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   222
662fa7de7023 201024_05
hgs
parents:
diff changeset
   223
TInt ConsumeCharsAndDeterminePresentationForm(const TUtf32Iterator& aText,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   224
	TUint aFlags, TInt& aLigaturePortionsRemaining)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   225
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
   226
 Get the Arabic or other presentation form, consuming as many characters 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   227
 as necessary. This function can cope with text that has already been 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   228
 reversed.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   229
@internalComponent
662fa7de7023 201024_05
hgs
parents:
diff changeset
   230
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
   231
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   232
	TUint c = aText.Get();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   233
	TInt index = ArabicShapeTableIndex(c);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   234
	if (index != -1)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   235
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   236
		if (aLigaturePortionsRemaining != 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   237
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   238
			--aLigaturePortionsRemaining;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   239
			TEXTBASE_ASSERT_DEBUG(!aText.AtEnd(), ETextBasePanic_Invariant);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   240
			return 0xFFFF;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   241
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   242
662fa7de7023 201024_05
hgs
parents:
diff changeset
   243
		int position = -1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   244
662fa7de7023 201024_05
hgs
parents:
diff changeset
   245
		// Find previous and next character, skipping Arabic points.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   246
		TUtf32Iterator tmpText(aText);		
662fa7de7023 201024_05
hgs
parents:
diff changeset
   247
		tmpText.Prev();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   248
        TUint prev = 0xFFFF;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   249
        while (!tmpText.BeforeStart() && (prev == 0xFFFF || IsArabicPoint(prev)))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   250
            prev = tmpText.GetThenPrev();		
662fa7de7023 201024_05
hgs
parents:
diff changeset
   251
662fa7de7023 201024_05
hgs
parents:
diff changeset
   252
		tmpText = aText;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   253
		tmpText.Next();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   254
        TUint next = 0xFFFF;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   255
        while (!tmpText.AtEnd() && (next == 0xFFFF || IsArabicPoint(next)))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   256
            next = tmpText.GetThenNext();		
662fa7de7023 201024_05
hgs
parents:
diff changeset
   257
		
662fa7de7023 201024_05
hgs
parents:
diff changeset
   258
		TInt possible_lam = (aFlags & CFont::TPositionParam::EFLogicalOrder)?
662fa7de7023 201024_05
hgs
parents:
diff changeset
   259
			c : next;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   260
		TInt possible_alef = (aFlags & CFont::TPositionParam::EFLogicalOrder)?
662fa7de7023 201024_05
hgs
parents:
diff changeset
   261
			next : c;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   262
662fa7de7023 201024_05
hgs
parents:
diff changeset
   263
		// Perform lam-alef ligation if necessary.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   264
		if (possible_lam == 0x644 &&
662fa7de7023 201024_05
hgs
parents:
diff changeset
   265
			(possible_alef == 0x622 || possible_alef == 0x623 || possible_alef == 0x625 || possible_alef == 0x627))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   266
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   267
			switch(possible_alef)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   268
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   269
				case 0x622:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   270
					{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   271
					c = 0xfef5;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   272
					index = KLamAlefShapeTableStart;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   273
					break;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   274
					}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   275
				case 0x623:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   276
					{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   277
					c = 0xfef7;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   278
					index = KLamAlefShapeTableStart + 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   279
					break;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   280
					}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   281
				case 0x625:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   282
					{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   283
					c = 0xfef9;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   284
					index = KLamAlefShapeTableStart + 2;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   285
					break;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   286
					}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   287
				default:
662fa7de7023 201024_05
hgs
parents:
diff changeset
   288
					{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   289
					c = 0xfefb;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   290
					index = KLamAlefShapeTableStart + 3;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   291
					}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   292
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   293
			index *= 3;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   294
			aLigaturePortionsRemaining = 2;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   295
662fa7de7023 201024_05
hgs
parents:
diff changeset
   296
			next = 0xFFFF;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   297
			while (!tmpText.AtEnd() && (next == 0xFFFF || IsArabicPoint(next)))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   298
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   299
				next = tmpText.Get();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   300
				tmpText.Next();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   301
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   302
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   303
662fa7de7023 201024_05
hgs
parents:
diff changeset
   304
		TInt left = (aFlags & CFont::TPositionParam::EFLogicalOrder)? prev : next;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   305
		TInt right = (aFlags & CFont::TPositionParam::EFLogicalOrder)? next : prev;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   306
662fa7de7023 201024_05
hgs
parents:
diff changeset
   307
		TBool prefix = FALSE;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   308
		if (left == 0x640 || left == 0x200D) // kashida or Zero-Width Joiner
662fa7de7023 201024_05
hgs
parents:
diff changeset
   309
			prefix = TRUE;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   310
		else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   311
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   312
			TInt left_index = ArabicShapeTableIndex(left);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   313
			if (left_index != -1)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   314
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   315
				if (static_cast<TInt>(TheArabicShapeTable[left_index + KInitial]) != left ||
662fa7de7023 201024_05
hgs
parents:
diff changeset
   316
					static_cast<TInt>(TheArabicShapeTable[left_index + KMedial]) != left)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   317
					prefix = TRUE;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   318
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   319
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   320
		TBool suffix = FALSE;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   321
		if (right == 0x640 || right == 0x200D) // kashida or Zero-Width Joiner
662fa7de7023 201024_05
hgs
parents:
diff changeset
   322
			suffix = TRUE;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   323
		else 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   324
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   325
			TInt right_index = ArabicShapeTableIndex(right);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   326
			if (right_index != -1)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   327
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   328
				if (static_cast<TInt>(TheArabicShapeTable[right_index + KFinal]) != right ||
662fa7de7023 201024_05
hgs
parents:
diff changeset
   329
					static_cast<TInt>(TheArabicShapeTable[right_index + KMedial]) != right)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   330
					suffix = TRUE;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   331
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   332
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   333
		TBool medial = static_cast<TUint>(TheArabicShapeTable[index + KMedial]) != c;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   334
		if (medial)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   335
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   336
			if (prefix && suffix)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   337
				position = KMedial;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   338
			else if (prefix)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   339
				position = KFinal;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   340
			else if (suffix)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   341
				position = KInitial;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   342
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   343
		else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   344
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   345
			if (prefix)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   346
				position = KFinal;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   347
			else if (suffix)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   348
				position = KInitial;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   349
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   350
		if (position >= 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   351
			c = TheArabicShapeTable[index + position];
662fa7de7023 201024_05
hgs
parents:
diff changeset
   352
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   353
662fa7de7023 201024_05
hgs
parents:
diff changeset
   354
	return c;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   355
	}
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
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
   360
// GlyphSelector_Arabic Class definition
662fa7de7023 201024_05
hgs
parents:
diff changeset
   361
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
   362
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
   363
662fa7de7023 201024_05
hgs
parents:
diff changeset
   364
TBool GlyphSelector_Arabic::Process(TGlyphSelectionState& aGss, RShapeInfo&) 
662fa7de7023 201024_05
hgs
parents:
diff changeset
   365
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   366
	// Select glyph - use presentation form if applicable.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   367
	TInt ligaturePortions = aGss.iLigaturePortionsRemaining;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   368
	TUint flags = aGss.iParam.iFlags;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   369
	TUint code = ConsumeCharsAndDeterminePresentationForm(aGss.iText,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   370
		flags, ligaturePortions);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   371
662fa7de7023 201024_05
hgs
parents:
diff changeset
   372
	aGss.iText.Next();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   373
	aGss.iClusterState = !aGss.iText.AtEnd() &&
662fa7de7023 201024_05
hgs
parents:
diff changeset
   374
		(aGss.iText.Get().GetCategory() & 0xF0) == TChar::EMarkGroup?
662fa7de7023 201024_05
hgs
parents:
diff changeset
   375
		TGlyphSelectionState::EGClusterNotComplete
662fa7de7023 201024_05
hgs
parents:
diff changeset
   376
		: TGlyphSelectionState::EGClusterComplete;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   377
662fa7de7023 201024_05
hgs
parents:
diff changeset
   378
	// If we are beginning a new portion of a ligature, we must set the state.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   379
	if (ligaturePortions != aGss.iLigaturePortionsRemaining)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   380
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   381
		if (ligaturePortions != 1)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   382
			aGss.iClusterState = TGlyphSelectionState::EGClusterNotComplete;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   383
		aGss.iLigaturePortionFirstMark = aGss.iParam.iOutputGlyphs;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   384
		if (ligaturePortions < aGss.iLigaturePortionsRemaining)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   385
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   386
			aGss.iLigaturePortionsRemaining = ligaturePortions;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   387
			// We have just swallowed a non-initial part of the ligature, which
662fa7de7023 201024_05
hgs
parents:
diff changeset
   388
			// must not be drawn.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   389
			TEXTBASE_ASSERT_DEBUG(code == 0xFFFF, ETextBasePanic_Invariant);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   390
			return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   391
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   392
		aGss.iLigaturePortionsRemaining = ligaturePortions;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   393
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   394
662fa7de7023 201024_05
hgs
parents:
diff changeset
   395
	// In this method we always output the glyph code calculate previously.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   396
	if (!aGss.AppendGlyphToCluster(code))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   397
		return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   398
662fa7de7023 201024_05
hgs
parents:
diff changeset
   399
	if (!aGss.IsCombiningClass())
662fa7de7023 201024_05
hgs
parents:
diff changeset
   400
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   401
		aGss.iPen = TGlyphSelectionState::EPenAdvance_Yes;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   402
		return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   403
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   404
662fa7de7023 201024_05
hgs
parents:
diff changeset
   405
	// Adjust glyph's bounds further to position this character.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   406
	aGss.iPen = TGlyphSelectionState::EPenAdvance_No;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   407
	TRect baseBounds = aGss.iParam.iOutput[0].iBounds;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   408
	TInt firstMark = 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   409
	if (aGss.iLigaturePortionsRemaining != 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   410
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   411
		TInt centre = (baseBounds.iBr.iX + baseBounds.iTl.iX) >> 1;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   412
		TBool firstHalf = aGss.iLigaturePortionsRemaining == 2;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   413
		TBool rightHandSide = flags & CFont::TPositionParam::EFLogicalOrder?
662fa7de7023 201024_05
hgs
parents:
diff changeset
   414
			firstHalf : !firstHalf;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   415
		if (rightHandSide)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   416
			baseBounds.iTl.iX = centre;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   417
		else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   418
			baseBounds.iBr.iX = centre;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   419
		if (firstHalf)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   420
			aGss.iClusterState = TGlyphSelectionState::EGClusterNotComplete;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   421
		firstMark = aGss.iLigaturePortionFirstMark;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   422
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   423
	aGss.CombineLastGlyphToBase(baseBounds, firstMark);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   424
662fa7de7023 201024_05
hgs
parents:
diff changeset
   425
	return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   426
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   427
662fa7de7023 201024_05
hgs
parents:
diff changeset
   428
662fa7de7023 201024_05
hgs
parents:
diff changeset
   429
TBool GlyphSelector_Arabic::CharactersJoin(TInt aLeftCharacter, TInt aRightCharacter)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   430
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   431
	// All the characters join to the right, so we don't need to look them up.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   432
	// as long as they are there at all, it is OK.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   433
	TBool leftIsFixedJoiner = aLeftCharacter == 0x640 || aLeftCharacter == 0x200D;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   434
	if (!leftIsFixedJoiner)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   435
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   436
		TInt leftIndex = ArabicShapeTableIndex(aLeftCharacter);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   437
		if (leftIndex == -1)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   438
			return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   439
		if (static_cast<TInt>(TheArabicShapeTable[leftIndex + KFinal])
662fa7de7023 201024_05
hgs
parents:
diff changeset
   440
			== aLeftCharacter)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   441
			return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   442
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   443
	if (aRightCharacter == 0x640 || aRightCharacter == 0x200D)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   444
		return !leftIsFixedJoiner;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   445
	TInt rightIndex = ArabicShapeTableIndex(aRightCharacter);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   446
	return rightIndex != -1
662fa7de7023 201024_05
hgs
parents:
diff changeset
   447
		&& static_cast<TInt>(TheArabicShapeTable[rightIndex + KInitial])
662fa7de7023 201024_05
hgs
parents:
diff changeset
   448
			!= aRightCharacter;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   449
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   450