• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html#License
3 /*
4  *******************************************************************************
5  * Copyright (C) 1998-2010, International Business Machines Corporation and    *
6  * others. All Rights Reserved.                                                *
7  *******************************************************************************
8  *
9  * Created on Dec 09, 2003
10  *
11  *******************************************************************************
12  */
13 package com.ibm.icu.dev.tool.layout;
14 
15 import java.io.PrintStream;
16 
17 import com.ibm.icu.impl.Utility;
18 
19 public class ThaiCharacterClasses
20 {
21     public static final int NON    =  0;
22     public static final int CON    =  1;
23     public static final int COA    =  2;
24     public static final int COD    =  3;
25     public static final int LVO =  4;
26     public static final int FV1    =  5;
27     public static final int FV2    =  6;
28     public static final int FV3    =  7;
29     public static final int BV1    =  8;
30     public static final int BV2    =  9;
31     public static final int BDI = 10;
32     public static final int TON    = 11;
33     public static final int AD1    = 12;
34     public static final int AD2    = 13;
35     public static final int AD3    = 14;
36     public static final int NIK    = 15;
37     public static final int AV1    = 16;
38     public static final int AV2    = 17;
39     public static final int AV3    = 18;
40     public static final int cCount = 19;
41 
42     // Indexed by unicode - '\u0E00'
43     // FIXME: MS Fonts - Should 0E2E has no ascender (it does in WT font)
44     // FIXME: MS Fonts - 0E47 (MAITAIKHU) and 0E4D (NIKHAHIT) only have vowel forms
45     // FIXME: MS Fonts - 0E4E (YAMAKKAN) only has one form
46     private static final int classTable[] = {
47     //       0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
48     //       -------------------------------------------------------------------------------
49     /*0E00*/ NON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COD, COD, COD,
50     /*0E10*/ COD, CON, CON, CON, CON, CON, CON, CON, CON, CON, CON, COA, CON, COA, CON, COA,
51     /*0E20*/ CON, CON, CON, CON, FV3, CON, FV3, CON, CON, CON, CON, CON, CON, CON, CON, NON,
52     /*0E30*/ FV1, AV2, FV1, FV1, AV1, AV3, AV2, AV3, BV1, BV2, BDI, NON, NON, NON, NON, NON,
53     /*0E40*/ LVO, LVO, LVO, LVO, LVO, FV2, NON, AD2, TON, TON, TON, TON, AD1, NIK, AD3, NON,
54     /*0E50*/ NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON, NON
55     };
56 
57     private static String[] classNames =
58     {
59         "NON",
60         "CON",
61         "COA",
62         "COD",
63         "LVO",
64         "FV1",
65         "FV2",
66         "FV3",
67         "BV1",
68         "BV2",
69         "BDI",
70         "TON",
71         "AD1",
72         "AD2",
73         "AD3",
74         "NIK",
75         "AV1",
76         "AV2",
77         "AV3"
78     };
79 
80     private static final char pairTable[][] = {
81       //------------------------------------------------------------------------------------------------
82       //  N    C    C    C    L    F    F    F    B    B    B    T    A    A    A    N    A    A    A
83       //  O    O    O    O    V    V    V    V    V    V    D    O    D    D    D    I    V    V    V
84       //  N    N    A    D    O    1    2    3    1    2    I    N    1    2    3    K    1    2    3
85       //------------------------------------------------------------------------------------------------
86 /*NON*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
87 /*CON*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'C', 'C', 'C', 'E', 'E', 'E', 'C', 'E', 'C', 'C', 'C'},
88 /*COA*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'C', 'C', 'C', 'F', 'F', 'F', 'D', 'F', 'D', 'D', 'D'},
89 /*COD*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'H', 'H', 'H', 'E', 'E', 'E', 'C', 'E', 'C', 'C', 'C'},
90 /*LVO*/ {'S', 'A', 'A', 'A', 'S', 'S', 'S', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
91 /*FV1*/ {'S', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
92 /*FV2*/ {'A', 'A', 'A', 'A', 'A', 'A', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
93 /*FV3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'A', 'S', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
94 /*BV1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'E', 'E', 'R', 'R', 'E', 'R', 'R', 'R'},
95 /*BV2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'E', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
96 /*BDI*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
97 /*TON*/ {'A', 'A', 'A', 'A', 'A', 'I', 'A', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
98 /*AD1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
99 /*AD2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
100 /*AD3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
101 /*NIK*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'G', 'R', 'R', 'R', 'R', 'R', 'R'},
102 /*AV1*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'G', 'R', 'R', 'G', 'R', 'R', 'R'},
103 /*AV2*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'R', 'R', 'R', 'R', 'R', 'R', 'R'},
104 /*AV3*/ {'A', 'A', 'A', 'A', 'A', 'S', 'S', 'A', 'R', 'R', 'R', 'G', 'R', 'G', 'R', 'R', 'R', 'R', 'R'}
105     };
106 
getCharClass(char ch)107     public static int getCharClass(char ch)
108     {
109         int charClass = NON;
110 
111         if (ch >= '\u0E00' && ch <= '\u0E5B') {
112             charClass = classTable[ch - '\u0E00'];
113         }
114 
115         return charClass;
116     }
117 
getClassName(int classID)118     public static String getClassName(int classID)
119     {
120         if (classID < 0 || classID >= cCount) {
121             return "***";
122         }
123 
124         return classNames[classID];
125     }
126 
getPairAction(int prevClass, int currClass)127     public static char getPairAction(int prevClass, int currClass)
128     {
129         if (prevClass < 0 || prevClass >= cCount |
130             currClass < 0 || currClass >= cCount) {
131             return 'A';
132         }
133 
134         return pairTable[prevClass][currClass];
135     }
136 
137     private static String classTableHeader =
138 "const le_uint8 ThaiShaping::classTable[] = {\n" +
139 "    //       0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F\n" +
140 "    //       -------------------------------------------------------------------------------";
141 
writeClassTable(PrintStream output)142     public static void writeClassTable(PrintStream output)
143     {
144         System.out.print("Writing class table...");
145 
146         output.print(classTableHeader);
147 
148         for (char ch = '\u0E00'; ch <= '\u0E5B'; ch += 1) {
149             int charClass = getCharClass(ch);
150 
151             if ((ch & 0x000F) == 0) {
152                 output.print("\n    /*" + Utility.hex(ch, 4) + "*/ ");
153             }
154 
155             output.print(getClassName(charClass));
156 
157             if (ch < '\u0E5B') {
158                 output.print(", ");
159             } else {
160                 output.print("\n};\n\n");
161             }
162         }
163 
164         System.out.println(" done.");
165     }
166 
167 }
168