]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/ScriptList.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / ScriptList.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1998-2004, 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 \r
14 public class ScriptList\r
15 {\r
16     static class LangSysRecord extends TaggedRecord\r
17     {\r
18         private Feature[] features;\r
19         private int featureCount;\r
20         \r
21         public LangSysRecord(String theLanguageTag)\r
22         {\r
23             super(theLanguageTag);\r
24             \r
25             features = new Feature[10];\r
26             featureCount = 0;\r
27         }\r
28         \r
29         public void addFeature(Feature feature)\r
30         {\r
31             if (featureCount > features.length) {\r
32                 Feature[] newFeatures = new Feature[features.length + 5];\r
33                 \r
34                 System.arraycopy(features, 0, newFeatures, 0, features.length);\r
35                 features = newFeatures;\r
36             }\r
37             \r
38             features[featureCount++] = feature;\r
39         }\r
40         \r
41          public void writeLangSysRecord(OpenTypeTableWriter writer)\r
42         {\r
43             writer.writeData(0);      // lookupOrder (must be NULL)\r
44             writer.writeData(0xFFFF); // reqFeatureIndex (0xFFFF means none)\r
45             \r
46             writer.writeData(featureCount);\r
47             \r
48             for (int i = 0; i < featureCount; i += 1) {\r
49                 writer.writeData(features[i].getFeatureIndex());\r
50             }\r
51         }\r
52     }\r
53     \r
54     static class ScriptRecord extends TaggedRecord\r
55     {\r
56         private LangSysRecord[] langSysRecords;\r
57         private int langSysCount;\r
58         \r
59         public ScriptRecord(String theScriptTag)\r
60         {\r
61             super(theScriptTag);\r
62             langSysRecords = new LangSysRecord[10];\r
63             langSysCount = 0;\r
64         }\r
65         \r
66         public LangSysRecord findLangSysRecord(String languageTag)\r
67         {\r
68             for (int i = 0; i < langSysCount; i += 1) {\r
69                 LangSysRecord langSysRecord = langSysRecords[i];\r
70                 \r
71                 if (langSysRecord.getTag().equals(languageTag)) {\r
72                     return langSysRecord;\r
73                 }\r
74             }\r
75             \r
76             if (langSysCount >= langSysRecords.length) {\r
77                 LangSysRecord[] newLangSysRecords = new LangSysRecord[langSysCount + 5];\r
78                 \r
79                 System.arraycopy(langSysRecords, 0, newLangSysRecords, 0, langSysRecords.length);\r
80                 langSysRecords = newLangSysRecords;\r
81             }\r
82             \r
83             LangSysRecord newLangSysRecord = new LangSysRecord(languageTag);\r
84             langSysRecords[langSysCount] = newLangSysRecord;\r
85             \r
86             langSysCount += 1;\r
87             return newLangSysRecord;\r
88         }\r
89         \r
90         public void writeScriptRecord(OpenTypeTableWriter writer)\r
91         {\r
92             TaggedRecord.sort(langSysRecords, langSysCount);\r
93             \r
94             int scriptTableBase = writer.getOutputIndex();\r
95             int firstLangSys = 0;\r
96             \r
97             writer.writeData(0); // default langSys offset (fixed later)\r
98             \r
99             if (langSysRecords[0].getTag().equals("(default)")) {\r
100                 firstLangSys = 1;\r
101             }\r
102             \r
103             writer.writeData(langSysCount - firstLangSys);\r
104             \r
105             int langSysOffset = writer.getOutputIndex();\r
106             \r
107             for (int i = firstLangSys; i < langSysCount; i += 1) {\r
108                 writer.writeTag(langSysRecords[i].getTag());\r
109                 writer.writeData(0);\r
110             }\r
111             \r
112             if (firstLangSys > 0) {\r
113                 System.out.print(" (default)");\r
114                 writer.fixOffset(scriptTableBase, scriptTableBase);\r
115                 langSysRecords[0].writeLangSysRecord(writer);\r
116             }\r
117             \r
118             for (int i = firstLangSys; i < langSysCount; i += 1) {\r
119                 // fix the offset in the langSysRecordArray.\r
120                 // The "+2" skips over the tag and the "+3"\r
121                 // skips to the next langSysRecord entry\r
122                 writer.fixOffset(langSysOffset + 2, scriptTableBase);\r
123                 langSysOffset += 3;\r
124                 \r
125                 System.out.print(" '" + langSysRecords[i].getTag() + "'");\r
126                 langSysRecords[i].writeLangSysRecord(writer);\r
127             }\r
128         }\r
129     }\r
130     \r
131     private ScriptRecord[] scriptRecords;\r
132     private int scriptCount;\r
133     \r
134     public ScriptList()\r
135     {\r
136         scriptRecords = new ScriptRecord[10];\r
137         scriptCount = 0;\r
138     }\r
139     \r
140     private LangSysRecord findLangSysRecord(String scriptTag, String languageTag)\r
141     {\r
142         for (int i = 0; i < scriptCount; i += 1) {\r
143             ScriptRecord scriptRecord = scriptRecords[i];\r
144             \r
145             if (scriptRecord.getTag().equals(scriptTag)) {\r
146                  return scriptRecord.findLangSysRecord(languageTag);\r
147             }\r
148         }\r
149         \r
150         if (scriptCount >= scriptRecords.length) {\r
151             ScriptRecord[] newScriptRecords = new ScriptRecord[scriptCount + 5];\r
152             \r
153             System.arraycopy(scriptRecords, 0, newScriptRecords, 0, scriptRecords.length);\r
154             scriptRecords = newScriptRecords;\r
155         }\r
156         \r
157         ScriptRecord newScriptRecord = new ScriptRecord(scriptTag);\r
158         scriptRecords[scriptCount] = newScriptRecord;\r
159         \r
160         scriptCount += 1;\r
161         return newScriptRecord.findLangSysRecord(languageTag);\r
162     }\r
163     \r
164     public void addFeature(String scriptTag, String languageTag, Feature feature)\r
165     {\r
166         LangSysRecord langSysRecord = findLangSysRecord(scriptTag, languageTag);\r
167         \r
168         langSysRecord.addFeature(feature);\r
169     }\r
170     \r
171     public void writeScriptList(OpenTypeTableWriter writer)\r
172     {\r
173         System.out.println("writing script list...");\r
174         \r
175         int scriptListBase = writer.getOutputIndex();\r
176         \r
177         TaggedRecord.sort(scriptRecords, scriptCount);\r
178         writer.writeData(scriptCount);\r
179         \r
180         int scriptRecordOffset = writer.getOutputIndex();\r
181         \r
182         for (int i = 0; i < scriptCount; i += 1) {\r
183             writer.writeTag(scriptRecords[i].getTag());\r
184             writer.writeData(0);\r
185         }\r
186         \r
187         for (int i = 0; i < scriptCount; i += 1) {\r
188             // fix the offset in the scriptRecordArray.\r
189             // The "+2" skips over the tag and the "+3"\r
190             // skips to the next scriptRecord entry\r
191             writer.fixOffset(scriptRecordOffset + 2, scriptListBase);\r
192             scriptRecordOffset += 3;\r
193             \r
194             System.out.print("  script '" + scriptRecords[i].getTag() + "':");\r
195             scriptRecords[i].writeScriptRecord(writer);\r
196             System.out.println();\r
197         }\r
198     }\r
199 }\r
200