]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/LigatureTreeWalker.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / LigatureTreeWalker.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1998-2007, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  *\r
7  * Created on Dec 3, 2003\r
8  *\r
9  *******************************************************************************\r
10  */\r
11 package com.ibm.icu.dev.tool.layout;\r
12 \r
13 import java.util.Vector;\r
14 \r
15 import com.ibm.icu.impl.Utility;\r
16 \r
17 public class LigatureTreeWalker extends TreeWalker implements LookupSubtable\r
18 {\r
19     protected int[] componentChars;\r
20     protected int componentCount;\r
21     protected int lastFirstComponent;\r
22 \r
23     protected Vector ligatureSets;\r
24     protected Vector ligatureSet;\r
25     \r
26     public LigatureTreeWalker()\r
27     {\r
28         componentChars = new int[30];\r
29         componentCount = 0;\r
30         lastFirstComponent = -1;\r
31         ligatureSet = null;\r
32         ligatureSets = new Vector();\r
33     }\r
34 \r
35     public void down(int ch)\r
36     {\r
37         componentChars[componentCount] = ch;\r
38         componentCount += 1;\r
39     }\r
40 \r
41     public void up()\r
42     {\r
43         if (componentCount > 0) {\r
44             componentCount -= 1;\r
45         }\r
46     }\r
47 \r
48     public void ligature(int lig)\r
49     {\r
50         int firstComponent = componentChars[0];\r
51 \r
52         if (lastFirstComponent != firstComponent) {\r
53             if (ligatureSet != null) {\r
54                 ligatureSets.addElement(ligatureSet);\r
55             }\r
56 \r
57             ligatureSet = new Vector();\r
58             lastFirstComponent = firstComponent;\r
59         }\r
60 \r
61         ligatureSet.addElement(new LigatureEntry(lig, componentChars, componentCount));\r
62     }\r
63 \r
64     public void done()\r
65     {\r
66         if (ligatureSet != null) {\r
67             ligatureSets.addElement(ligatureSet);\r
68         }\r
69     }\r
70     protected int firstComponentChar(int ligatureSetIndex)\r
71     {\r
72         Vector aLigatureSet = (Vector) ligatureSets.elementAt(ligatureSetIndex);\r
73         LigatureEntry firstEntry = (LigatureEntry) aLigatureSet.elementAt(0);\r
74 \r
75         return firstEntry.getComponentChar(0);\r
76     }\r
77 \r
78     protected void writeCoverageTable(OpenTypeTableWriter writer)\r
79     {\r
80         int ligatureSetCount = ligatureSets.size();\r
81 \r
82         writer.writeData(1);\r
83         writer.writeData(ligatureSetCount);\r
84 \r
85         for (int set = 0; set < ligatureSetCount; set += 1) {\r
86             writer.writeData(firstComponentChar(set));\r
87         }\r
88     }\r
89     \r
90     public void writeLookupSubtable(OpenTypeTableWriter writer)\r
91     {\r
92         int coverageOffset, ligatureSetOffset, ligatureTableOffset;\r
93         int ligatureSubstitutionBase = writer.getOutputIndex();\r
94         int ligatureSetCount = ligatureSets.size();\r
95         \r
96         //System.out.println("Writing " + tableName + "...");\r
97 \r
98         writer.writeData(1);   // substFormat\r
99         \r
100         coverageOffset = writer.getOutputIndex();\r
101         writer.writeData(0);   // coverageTableOffset (will fix later)\r
102         \r
103         writer.writeData(ligatureSetCount);\r
104 \r
105         ligatureSetOffset = writer.getOutputIndex();\r
106         for (int set = 0; set < ligatureSetCount; set += 1) {\r
107             writer.writeData(0);  // ligatureSet offset - will fix later\r
108         }\r
109         \r
110         for (int set = 0; set < ligatureSetCount; set += 1) {\r
111             System.out.print(Utility.hex(firstComponentChar(set), 6) + ": ");\r
112             \r
113             Vector aLigatureSet = (Vector) ligatureSets.elementAt(set);\r
114             int ligatureCount = aLigatureSet.size();\r
115             int ligatureSetAddress = writer.getOutputIndex();\r
116             \r
117             System.out.println(ligatureCount + " ligatures.");\r
118             \r
119             writer.fixOffset(ligatureSetOffset++, ligatureSubstitutionBase);\r
120             writer.writeData(ligatureCount);\r
121             \r
122             ligatureTableOffset = writer.getOutputIndex();\r
123             for (int lig = 0; lig < ligatureCount; lig += 1) {\r
124                 writer.writeData(0);  // ligatureTableOffset (will fix later)\r
125             }\r
126             \r
127             for (int lig = 0; lig < ligatureCount; lig += 1) {\r
128                 LigatureEntry entry = (LigatureEntry) aLigatureSet.elementAt(lig);\r
129                 int compCount = entry.getComponentCount();\r
130                 \r
131                 writer.fixOffset(ligatureTableOffset++, ligatureSetAddress);\r
132                 writer.writeData(entry.getLigature());\r
133                 writer.writeData(compCount);\r
134                 \r
135                 for (int comp = 1; comp < compCount; comp += 1) {\r
136                     writer.writeData(entry.getComponentChar(comp));\r
137                 }\r
138             }\r
139         }\r
140         \r
141         writer.fixOffset(coverageOffset, ligatureSubstitutionBase); \r
142         writeCoverageTable(writer);\r
143     }\r
144 }\r