os/graphics/graphicsdeviceinterface/gdi/sgdi/FontIndic.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #ifndef __FONTINDIC_H__
    17 #define __FONTINDIC_H__
    18 
    19 #include "GlyphSel.h"
    20 
    21 /** Defines the maximum ammount of text thats can be shaped at one time.
    22 Change this number to suit optimisation, as increasing it or decreasing it may 
    23 make Devanagari text faster/slower.*/
    24 const TInt KMaxTextToShape = 16;
    25 
    26 enum TIndicCodeType
    27 	{
    28 	// These values must not change without also changing
    29 	// KStateResponse table accordingly
    30 	EIndicCodeOther = 0,
    31 	EIndicCodeCombiningSign = 1,
    32 	EIndicCodeIndependentVowel = 2,
    33 	EIndicCodeConsonant = 3,
    34 	EIndicCodeDependentVowel = 4,
    35 	EIndicCodeVirama = 5,
    36 	EIndicCodeNukta = 6,
    37 	EIndicCodeZWJ = 7,
    38 	EIndicCodeNuktaConsonant = 8,
    39 	EIndicCodeIndependentVowelA = 9,
    40 	EIndicCodeDependentVowelCandraE = 10,
    41 	EIndicCodeConsonantKannadaBengaliRa = 11,
    42 	EIndicCodeSplitVowel1 = 12,
    43 	EIndicCodeSplitVowel2 = 13,
    44 	EIndicCodeTamilLengthMarkAU = 14,
    45 	//Gurmukhi specific types: EIndicCodeGurBeraer* for specific bearer
    46 	//EIndicCodeGurDependentVowel* for dependent vowles which can be combined 
    47 	//with corresponding bearer to form an independent vowlel
    48 	EIndicCodeGurBearerA = 15,
    49 	EIndicCodeGurBearerU = 16,
    50 	EIndicCodeGurBearerI = 17,
    51 	EIndicCodeGurDependentVowelA = 18,
    52 	EIndicCodeGurDependentVowelU = 19,
    53 	EIndicCodeGurDependentVowelI = 20,
    54 	EIndicCodeConsonantMalaChillu = 21,
    55 	EIndicCodeConsonantMalaChilluNA = 22,
    56 	EIndicCodeConsonantMalaRRA = 23
    57 	};
    58 	
    59 struct TIndicCodeMapping
    60 	{
    61 	TInt16 iFirstCodeInRange;
    62 	TInt16 iCodeType;	// From TIndicCodeType
    63 	};
    64 
    65 /** Holds the types of all the symbols in the devanagari range, so that we can
    66 work out where the syllable boundaries begin and end. */
    67 static const TIndicCodeMapping KDevCodeMap[] =
    68 	{
    69 	{0, EIndicCodeOther},
    70 	{0x901, EIndicCodeCombiningSign},
    71 	{0x904, EIndicCodeIndependentVowel},
    72 	{0x905, EIndicCodeIndependentVowelA},
    73 	{0x906, EIndicCodeIndependentVowel},
    74 	{0x915, EIndicCodeConsonant},
    75 	{0x929, EIndicCodeNuktaConsonant},
    76 	{0x92A, EIndicCodeConsonant},
    77 	{0x931, EIndicCodeNuktaConsonant},
    78 	{0x932, EIndicCodeConsonant},
    79 	{0x934, EIndicCodeNuktaConsonant},
    80 	{0x935, EIndicCodeConsonant},
    81 	{0x93A, EIndicCodeOther},
    82 	{0x93C, EIndicCodeNukta},
    83 	{0x93D, EIndicCodeOther},
    84 	{0x93E, EIndicCodeDependentVowel},
    85 	{0x945, EIndicCodeDependentVowelCandraE},
    86 	{0x946, EIndicCodeDependentVowel},
    87 	{0x94D, EIndicCodeVirama},
    88 	{0x94E, EIndicCodeOther},
    89 	{0x951, EIndicCodeCombiningSign},
    90 	{0x955, EIndicCodeConsonant},
    91 	{0x958, EIndicCodeNuktaConsonant},
    92 	{0x960, EIndicCodeIndependentVowel},
    93 	{0x962, EIndicCodeDependentVowel},
    94 	{0x964, EIndicCodeOther},
    95 	{0x200D, EIndicCodeZWJ},
    96 	{0x200E, EIndicCodeOther}
    97 	};
    98 	
    99 /** Holds the types of all the symbols in the Kannada range, so that we can
   100 work out where the syllable boundaries begin and end. */
   101 static const TIndicCodeMapping KKanCodeMap[] =
   102 	{
   103 	{0, EIndicCodeOther},
   104 	{0xC82, EIndicCodeCombiningSign},
   105 	{0xC85, EIndicCodeIndependentVowel},
   106 	{0xC95, EIndicCodeConsonant},
   107 	{0xCB0, EIndicCodeConsonantKannadaBengaliRa},
   108 	{0xCB1, EIndicCodeConsonant},
   109 	{0xCB4, EIndicCodeOther},
   110 	{0xCB5, EIndicCodeConsonant},
   111 	{0xCBA, EIndicCodeOther},
   112 	{0xCBC, EIndicCodeNukta},
   113 	{0xCBD, EIndicCodeOther},
   114 	{0xCBE, EIndicCodeDependentVowel},
   115 	{0xCC5, EIndicCodeOther},
   116 	{0xCC6, EIndicCodeDependentVowel},
   117 	{0xCCD, EIndicCodeVirama},
   118 	{0xCD5, EIndicCodeCombiningSign},
   119 	{0xCDE, EIndicCodeConsonant},
   120 	{0xCE0, EIndicCodeIndependentVowel},
   121 	{0xCE2, EIndicCodeDependentVowel},
   122 	{0xCE4, EIndicCodeOther},
   123 	{0x200D, EIndicCodeZWJ},
   124 	{0x200E, EIndicCodeOther}
   125 	};
   126 
   127 /** Holds the types of all the symbols in the Gujarati range, so that we can
   128 work out where the syllable boundaries begin and end. */
   129 static const TIndicCodeMapping KGujCodeMap[] =
   130 	{
   131 	{0, EIndicCodeOther},
   132 	{0xA81, EIndicCodeCombiningSign},
   133 	{0xA85, EIndicCodeIndependentVowel},
   134 	{0xA8E, EIndicCodeOther},
   135 	{0xA8F, EIndicCodeIndependentVowel},
   136 	{0xA92, EIndicCodeOther},
   137 	{0xA93, EIndicCodeIndependentVowel},
   138 	{0xA95, EIndicCodeConsonant},
   139 	{0xAA9, EIndicCodeOther},
   140 	{0xAAA, EIndicCodeConsonant},
   141 	{0xAB1, EIndicCodeOther},
   142 	{0xAB2, EIndicCodeConsonant},
   143 	{0xAB4, EIndicCodeOther},
   144 	{0xAB5, EIndicCodeConsonant},
   145 	{0xABC, EIndicCodeNukta},
   146 	{0xABD, EIndicCodeOther},
   147 	{0xABE, EIndicCodeDependentVowel},
   148 	{0xAC6, EIndicCodeOther},
   149 	{0xAC7, EIndicCodeDependentVowel},
   150 	{0xACA, EIndicCodeOther},
   151 	{0xACB, EIndicCodeDependentVowel},
   152 	{0xACD, EIndicCodeVirama},
   153 	{0xACE, EIndicCodeOther},
   154 	{0xAE0, EIndicCodeIndependentVowel},
   155 	{0xAE2, EIndicCodeDependentVowel},
   156 	{0xAE4, EIndicCodeOther},
   157 	{0x200D, EIndicCodeZWJ},
   158 	{0x200E, EIndicCodeOther}
   159 	};
   160 	
   161 /** Holds the types of all the symbols in the Gurmukhi range, so that we can
   162 work out where the syllable boundaries begin and end. */
   163 static const TIndicCodeMapping KGurCodeMap[] =
   164 	{
   165 	{0, EIndicCodeOther},
   166 	{0xA01, EIndicCodeCombiningSign},
   167 	{0xA04, EIndicCodeOther},
   168 	{0xA05, EIndicCodeGurBearerA},
   169 	{0xA06, EIndicCodeIndependentVowel},
   170 	{0xA0B, EIndicCodeOther},
   171 	{0xA0F, EIndicCodeIndependentVowel},
   172 	{0xA11, EIndicCodeOther},
   173 	{0xA13, EIndicCodeIndependentVowel},
   174 	{0xA15, EIndicCodeConsonant},
   175 	{0xA29, EIndicCodeOther},
   176 	{0xA2A, EIndicCodeConsonant},
   177 	{0xA31, EIndicCodeOther},
   178 	{0xA32, EIndicCodeConsonant},
   179 	{0xA33, EIndicCodeNuktaConsonant},
   180 	{0xA34, EIndicCodeOther},
   181 	{0xA35, EIndicCodeConsonant},
   182 	{0xA36, EIndicCodeNuktaConsonant},
   183 	{0xA37, EIndicCodeOther},
   184 	{0xA38, EIndicCodeConsonant},
   185 	{0xA3A, EIndicCodeOther},
   186 	{0xA3C, EIndicCodeNukta},
   187 	{0xA3D, EIndicCodeOther},
   188 	{0xA3E, EIndicCodeGurDependentVowelA},
   189 	{0xA3F, EIndicCodeGurDependentVowelI},
   190 	{0xA41, EIndicCodeGurDependentVowelU},
   191 	{0xA43, EIndicCodeOther},
   192 	{0xA47, EIndicCodeGurDependentVowelI},
   193 	{0xA48, EIndicCodeGurDependentVowelA},
   194 	{0xA49, EIndicCodeOther},
   195 	{0xA4B, EIndicCodeGurDependentVowelU},
   196 	{0xA4C, EIndicCodeGurDependentVowelA},
   197 	{0xA4D, EIndicCodeVirama},
   198 	{0xA4E, EIndicCodeOther},
   199 	{0xA59, EIndicCodeNuktaConsonant},
   200 	{0xA5C, EIndicCodeConsonant},
   201 	{0xA5D, EIndicCodeOther},
   202 	{0xA5E, EIndicCodeNuktaConsonant},
   203 	{0xA5F, EIndicCodeOther},
   204 	{0xA70, EIndicCodeCombiningSign},
   205 	{0xA71, EIndicCodeCombiningSign},
   206 	{0xA72, EIndicCodeGurBearerI},
   207 	{0xA73, EIndicCodeGurBearerU},
   208 	{0xA74, EIndicCodeOther},
   209 	{0x200D, EIndicCodeZWJ},
   210 	{0x200E, EIndicCodeOther}
   211 	};
   212 
   213 /** Holds the types of all the symbols in the Bengali range, so that we can
   214 work out where the syllable boundaries begin and end. */
   215 static const TIndicCodeMapping KBenCodeMap[] =
   216 	{
   217 	{0, EIndicCodeOther},
   218 	{0x981 , EIndicCodeCombiningSign},
   219 	{0x985 , EIndicCodeIndependentVowel},
   220 	{0x995 , EIndicCodeConsonant},
   221 	{0x9B0 , EIndicCodeConsonantKannadaBengaliRa},
   222 	{0x9B1 , EIndicCodeConsonant},
   223 	{0x9BA , EIndicCodeOther},
   224 	{0x9BC , EIndicCodeNukta},
   225 	{0x9BD , EIndicCodeOther},
   226 	{0x9BE , EIndicCodeDependentVowel},
   227 	{0x9C9 , EIndicCodeOther},
   228 	{0x9CB , EIndicCodeDependentVowel},
   229 	{0x9CD , EIndicCodeVirama},
   230 	{0x9CE , EIndicCodeOther},
   231 	{0x9D7 , EIndicCodeDependentVowel},
   232 	{0x9DC , EIndicCodeConsonant},
   233 	{0x9E0 , EIndicCodeIndependentVowel},
   234 	{0x9E2 , EIndicCodeDependentVowel},
   235 	{0x9E4 , EIndicCodeOther},
   236 	{0x200D, EIndicCodeZWJ},
   237 	{0x200E, EIndicCodeOther}
   238 	};
   239 
   240 /** Holds the types of all the symbols in the Tamil range, so that we can
   241 work out where the syllable boundaries begin and end. */
   242 static const TIndicCodeMapping KTamCodeMap[] =
   243 	{
   244 	{0, EIndicCodeOther},
   245 	{0xB82 , EIndicCodeCombiningSign},
   246 	{0xB83 , EIndicCodeIndependentVowel},
   247 	{0xB84 , EIndicCodeOther},
   248 	{0xB85 , EIndicCodeIndependentVowel},
   249 	{0xB92 , EIndicCodeIndependentVowelA},
   250 	{0xB93 , EIndicCodeIndependentVowel},
   251 	{0xB95 , EIndicCodeConsonant},
   252 	{0xBBE , EIndicCodeSplitVowel2},
   253 	{0xBBF , EIndicCodeDependentVowel},
   254 	{0xBC6 , EIndicCodeSplitVowel1},
   255 	{0xBC8 , EIndicCodeDependentVowel},
   256 	{0xBCD , EIndicCodeVirama},
   257 	{0xBCE , EIndicCodeOther},
   258 	{0xBD7 , EIndicCodeTamilLengthMarkAU},
   259 	{0xBE4 , EIndicCodeOther},
   260 	{0x200D, EIndicCodeZWJ},
   261 	{0x200E, EIndicCodeOther}
   262 	};
   263 
   264 /** Holds the types of all the symbols in the Telugu range, so that we can
   265 work out where the syllable boundaries begin and end. */
   266 static const TIndicCodeMapping KTelCodeMap[] =
   267 	{
   268 	{0, EIndicCodeOther},
   269 	{0xC01, EIndicCodeCombiningSign},
   270 	{0xC04, EIndicCodeOther},
   271 	{0xC05, EIndicCodeIndependentVowel},
   272 	{0xC15, EIndicCodeConsonant},
   273 	{0xC3A, EIndicCodeOther},
   274 	{0xC3E, EIndicCodeDependentVowel},
   275 	{0xC4D, EIndicCodeVirama},
   276 	{0xC4E, EIndicCodeOther},
   277 	{0xC55, EIndicCodeDependentVowel},
   278 	{0xC57, EIndicCodeOther},
   279 	{0xC60, EIndicCodeIndependentVowel},
   280 	{0xC62, EIndicCodeOther}
   281 	};
   282 
   283 /** Holds the types of all the symbols in the Malayalam range, so that we can
   284 work out where the syllable boundaries begin and end. */
   285 static const TIndicCodeMapping KMalaCodeMap[] =
   286 	{
   287 	{0, EIndicCodeOther}, // NOT USED D00 - D01
   288 	{0xD02, EIndicCodeCombiningSign}, // Modifiers
   289 	{0xD04, EIndicCodeOther}, // NOT USED
   290 	{0xD05, EIndicCodeIndependentVowel},
   291 //	{0xD0D, EIndicCodeOther}, // Reserved
   292 //	{0xD0E, EIndicCodeIndependentVowel},
   293 //	{0xD11, EIndicCodeOther}, // Reserved
   294 //	{0xD12, EIndicCodeIndependentVowel},
   295 	{0xD15, EIndicCodeConsonant},
   296 	{0xD23, EIndicCodeConsonantMalaChillu}, // NNA
   297 	{0xD24, EIndicCodeConsonant},
   298 	{0xD28, EIndicCodeConsonantMalaChilluNA}, // NA
   299 	{0xD29, EIndicCodeOther}, // Reserved
   300 	{0xD2A, EIndicCodeConsonant},
   301 	{0xD30, EIndicCodeConsonantMalaChillu}, // RA
   302 	{0xD31, EIndicCodeConsonantMalaRRA}, // RRA
   303 	{0xD32, EIndicCodeConsonantMalaChillu}, // LA,  LLA
   304 	{0xD34, EIndicCodeConsonant},
   305 	{0xD3A, EIndicCodeOther}, // NOT USED D3A - D3D
   306 	{0xD3E, EIndicCodeSplitVowel2},
   307 	{0xD3F, EIndicCodeDependentVowel},
   308 //	{0xD44, EIndicCodeOther}, // Reserved D44 - D45
   309 	{0xD46, EIndicCodeSplitVowel1},
   310 	{0xD48, EIndicCodeDependentVowel},
   311 //	{0xD49, EIndicCodeOther}, // Reserved D49
   312 //	{0xD4A, EIndicCodeDependentVowel},
   313 	{0xD4D, EIndicCodeVirama},
   314 	{0xD4E, EIndicCodeOther}, //Reserved D4E - D56
   315 	{0xD57, EIndicCodeTamilLengthMarkAU}, // EIndicCodeDependentVowel for Telugu ???
   316 	{0xD58, EIndicCodeOther}, // NOT USED D58 - D5F
   317 	{0xD60, EIndicCodeIndependentVowel}, // RR, LL
   318 	{0xD62, EIndicCodeOther}, // NOT USED D62 - D65, digits D66 - D6F	
   319 	{0x200D, EIndicCodeZWJ},
   320 	{0x200E, EIndicCodeOther}
   321 	};
   322 
   323 /* Holds all parameters specific to scripts */
   324 struct TIndicScriptProcessorParameters{
   325 	TUint32 iLanguageCode;
   326 	TUint32 iScriptCode;
   327 	TUint iUCLow;
   328 	TUint iUCHigh;
   329 	TUint iMapLen;
   330 	const TIndicCodeMapping *iCodeMap;
   331 };
   332 
   333 static const TIndicScriptProcessorParameters KIndicDevParameters = {
   334 	0x48494E20, //KHindiLanguageCode,	
   335 	0x64657661, //KDevanagariScriptCode,	
   336 	0x0900, //KDevLow,
   337 	0x0970, //KDevHigh,	
   338 	sizeof(KDevCodeMap)/sizeof(KDevCodeMap[0]),
   339 	KDevCodeMap
   340 };
   341 
   342 static const TIndicScriptProcessorParameters KIndicKanParameters = {
   343 	0x4B414E20, //KKannadaLanguageCode,	
   344 	0x6B6E6461, //KKannadaScriptCode,	
   345 	0x0C80, //KKanLow,
   346 	0x0CFF, //KKanHigh,	
   347 	sizeof(KKanCodeMap)/sizeof(KKanCodeMap[0]),
   348 	KKanCodeMap
   349 };
   350 
   351 static const TIndicScriptProcessorParameters KIndicGujParameters = {
   352 	0x47554A20, //KGujaratiLanguageCode,	
   353 	0x67756A72, //KGujaratiScriptCode,	
   354 	0x0A80, //KGujLow,
   355 	0x0AFF, //KGujHigh,	
   356 	sizeof(KGujCodeMap)/sizeof(KGujCodeMap[0]),
   357 	KGujCodeMap
   358 };
   359 
   360 static const TIndicScriptProcessorParameters KIndicBenParameters = {
   361 	0x42454E20, //KBengaliLanguageCode,	
   362 	0x62656E67, //KBengaliScriptCode,	
   363 	0x0980, //KBenLow,
   364 	0x09FF, //KBenHigh,	
   365 	sizeof(KBenCodeMap)/sizeof(KBenCodeMap[0]),
   366 	KBenCodeMap
   367 };
   368 
   369 static const TIndicScriptProcessorParameters KIndicTamParameters = {
   370 	0x54414D20, //KTamilLanguageCode,	
   371 	0x74616D6C, //KTamilScriptCode,
   372 	0x0B80, //KTamLow,
   373 	0x0BFF, //KTamHigh,	
   374 	sizeof(KTamCodeMap)/sizeof(KTamCodeMap[0]),
   375 	KTamCodeMap
   376 };
   377 
   378 static const TIndicScriptProcessorParameters KIndicTelParameters = {
   379 	0x54454C20, //KTeluguLanguageCode,	
   380 	0x74656C75, //KTeluguScriptCode,
   381 	0x0C00, //KTelLow,
   382 	0x0C7F, //KTelHigh,	
   383 	sizeof(KTelCodeMap)/sizeof(KTelCodeMap[0]),
   384 	KTelCodeMap
   385 };
   386 
   387 static const TIndicScriptProcessorParameters KIndicGurParameters = {
   388 	0x00000000,	//KGurmukhiLanguageCode,
   389 	0x67757275, //KGurmukhiScriptCode,
   390 	0x0A00, //KGurLow,
   391 	0x0A7F, //KGurHigh,
   392 	sizeof(KGurCodeMap)/sizeof(KGurCodeMap[0]),
   393 	KGurCodeMap
   394 };
   395 
   396 static const TIndicScriptProcessorParameters KIndicMalParameters = {
   397 	0x4D4C5220, //KMalayalamLanguageCode,	
   398 	0x6D6C796D, //KMalayalamScriptCode,
   399 	0x0D00, //KMalaLow,
   400 	0x0D7F, //KMalaHigh,	
   401 	sizeof(KMalaCodeMap)/sizeof(KMalaCodeMap[0]),
   402 	KMalaCodeMap
   403 };
   404 
   405 /** This is the default glyph selector class for Devanagari characters in the
   406 range 0x0900..0x097F.
   407 @internalComponent
   408 */
   409 class GlyphSelector_Devanagari
   410 	{
   411 public:
   412 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   413 	};
   414 
   415 
   416 /** This is the default glyph selector class for Kannada characters in the
   417 range 0x0C80..0x0CFF.
   418 @internalComponent
   419 */
   420 class GlyphSelector_Kannada
   421 	{
   422 public:
   423 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   424 	};
   425 	
   426 
   427 /** This is the default glyph selector class for Gujarati characters in the
   428 range 0x0A80..0x0AFF.
   429 @internalComponent
   430 */
   431 class GlyphSelector_Gujarati
   432 	{
   433 public:
   434 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   435 	};
   436 	
   437 /** This is the default glyph selector class for Bengali characters in the
   438 range 0x0980..0x09FF.
   439 @internalComponent
   440 */
   441 class GlyphSelector_Bengali
   442 	{
   443 public:
   444 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   445 	};
   446 	
   447 /** This is the default glyph selector class for Tamil characters in the
   448 range 0x0B80..0x0BFF.
   449 @internalComponent
   450 */
   451 class GlyphSelector_Tamil
   452 	{
   453 public:
   454 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   455 	};
   456 
   457 /** This is the default glyph selector class for Telugu characters in the
   458 range 0x0C00..0x0C7F.
   459 @internalComponent
   460 */
   461 class GlyphSelector_Telugu
   462 	{
   463 public:
   464 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   465 	};
   466 
   467 /** This is the default glyph selector class for Gurmukhi characters in the
   468 range 0x0A00..0x0A7F.
   469 @internalComponent
   470 */
   471 class GlyphSelector_Gurmukhi
   472 	{
   473 public:
   474 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   475 	};
   476 
   477 /** This is the default glyph selector class for Malayalam characters in the
   478 range 0x0D00..0x0D7F.
   479 @internalComponent
   480 */
   481 class GlyphSelector_Malayalam
   482 	{
   483 public:
   484 	static TBool Process(TGlyphSelectionState& aGss, RShapeInfo&);
   485 	};
   486 
   487 #endif