2 *******************************************************************************
\r
3 * Copyright (C) 1998-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 * Created on Dec 09, 2003
\r
9 *******************************************************************************
\r
11 package com.ibm.icu.dev.tool.layout;
\r
13 import java.io.PrintStream;
\r
15 import com.ibm.icu.impl.Utility;
\r
17 public class ThaiCharacterClasses
\r
19 public static final int NON = 0;
\r
20 public static final int CON = 1;
\r
21 public static final int COA = 2;
\r
22 public static final int COD = 3;
\r
23 public static final int LVO = 4;
\r
24 public static final int FV1 = 5;
\r
25 public static final int FV2 = 6;
\r
26 public static final int FV3 = 7;
\r
27 public static final int BV1 = 8;
\r
28 public static final int BV2 = 9;
\r
29 public static final int BDI = 10;
\r
30 public static final int TON = 11;
\r
31 public static final int AD1 = 12;
\r
32 public static final int AD2 = 13;
\r
33 public static final int AD3 = 14;
\r
34 public static final int NIK = 15;
\r
35 public static final int AV1 = 16;
\r
36 public static final int AV2 = 17;
\r
37 public static final int AV3 = 18;
\r
38 public static final int cCount = 19;
\r
40 // Indexed by unicode - '\u0E00'
\r
41 // FIXME: MS Fonts - Should 0E2E has no ascender (it does in WT font)
\r
42 // FIXME: MS Fonts - 0E47 (MAITAIKHU) and 0E4D (NIKHAHIT) only have vowel forms
\r
43 // FIXME: MS Fonts - 0E4E (YAMAKKAN) only has one form
\r
44 private static final int classTable[] = {
\r
45 // 0 1 2 3 4 5 6 7 8 9 A B C D E F
\r
46 // -------------------------------------------------------------------------------
\r
47 /*0E00*/ NON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COD, COD, COD,
\r
48 /*0E10*/ COD, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COA, CON, COA, CON, COA,
\r
49 /*0E20*/ CON, CON, CON, CON, FV3, CON, FV3, CON, CON, CON, CON, CON, CON, CON, CON, NON,
\r
50 /*0E30*/ FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3, BV1, BV2, BDI, NON, NON, NON, NON, NON,
\r
51 /*0E40*/ LVO, LVO, LVO, LVO, LVO, FV2, NON, AD2, TON, TON, TON, TON, AD1, NIK, AD3, NON,
\r
52 /*0E50*/ NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON
\r
55 private static String[] classNames =
\r
78 private static final char pairTable[][] = {
\r
79 //------------------------------------------------------------------------------------------------
\r
80 // N C C C L F F F B B B T A A A N A A A
\r
81 // O O O O V V V V V V D O D D D I V V V
\r
82 // N N A D O 1 2 3 1 2 I N 1 2 3 K 1 2 3
\r
83 //------------------------------------------------------------------------------------------------
\r
84 /*NON*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
85 /*CON*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'C', 'C', 'C', 'E', 'E', 'E', 'C', 'E', 'C', 'C', 'C'},
\r
86 /*COA*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'C', 'C', 'C', 'F', 'F', 'F', 'D', 'F', 'D', 'D', 'D'},
\r
87 /*COD*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'H', 'H', 'H', 'E', 'E', 'E', 'C', 'E', 'C', 'C', 'C'},
\r
88 /*LVO*/ {'S', 'A', 'A', 'A', 'S', 'S', 'S', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
89 /*FV1*/ {'S', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
90 /*FV2*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
91 /*FV3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'A', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
92 /*BV1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'E', 'E', 'R', 'R', 'E', 'R', 'R', 'R'},
\r
93 /*BV2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'E', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
94 /*BDI*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
95 /*TON*/ {'A', 'A', 'A', 'A', 'A', 'I', 'A', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
96 /*AD1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
97 /*AD2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
98 /*AD3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
99 /*NIK*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'G', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
100 /*AV1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'G', 'R', 'R', 'G', 'R', 'R', 'R'},
\r
101 /*AV2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
\r
102 /*AV3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'R', 'G', 'R', 'R', 'R', 'R', 'R'}
\r
105 public static int getCharClass(char ch)
\r
107 int charClass = NON;
\r
109 if (ch >= '\u0E00' && ch <= '\u0E5B') {
\r
110 charClass = classTable[ch - '\u0E00'];
\r
116 public static String getClassName(int classID)
\r
118 if (classID < 0 || classID >= cCount) {
\r
122 return classNames[classID];
\r
125 public static char getPairAction(int prevClass, int currClass)
\r
127 if (prevClass < 0 || prevClass >= cCount |
\r
128 currClass < 0 || currClass >= cCount) {
\r
132 return pairTable[prevClass][currClass];
\r
135 private static String classTableHeader =
\r
136 "const le_uint8 ThaiShaping::classTable[] = {\n" +
\r
137 " // 0 1 2 3 4 5 6 7 8 9 A B C D E F\n" +
\r
138 " // -------------------------------------------------------------------------------";
\r
140 public static void writeClassTable(PrintStream output)
\r
142 System.out.print("Writing class table...");
\r
144 output.print(classTableHeader);
\r
146 for (char ch = '\u0E00'; ch <= '\u0E5B'; ch += 1) {
\r
147 int charClass = getCharClass(ch);
\r
149 if ((ch & 0x000F) == 0) {
\r
150 output.print("\n /*" + Utility.hex(ch, 4) + "*/ ");
\r
153 output.print(getClassName(charClass));
\r
155 if (ch < '\u0E5B') {
\r
156 output.print(", ");
\r
158 output.print("\n};\n\n");
\r
162 System.out.println(" done.");
\r