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