2 *******************************************************************************
\r
3 * Copyright (C) 1998-2004, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 * Created on Dec 3, 2003
\r
9 *******************************************************************************
\r
11 package com.ibm.icu.dev.tool.layout;
\r
14 public class ScriptList
\r
16 static class LangSysRecord extends TaggedRecord
\r
18 private Feature[] features;
\r
19 private int featureCount;
\r
21 public LangSysRecord(String theLanguageTag)
\r
23 super(theLanguageTag);
\r
25 features = new Feature[10];
\r
29 public void addFeature(Feature feature)
\r
31 if (featureCount > features.length) {
\r
32 Feature[] newFeatures = new Feature[features.length + 5];
\r
34 System.arraycopy(features, 0, newFeatures, 0, features.length);
\r
35 features = newFeatures;
\r
38 features[featureCount++] = feature;
\r
41 public void writeLangSysRecord(OpenTypeTableWriter writer)
\r
43 writer.writeData(0); // lookupOrder (must be NULL)
\r
44 writer.writeData(0xFFFF); // reqFeatureIndex (0xFFFF means none)
\r
46 writer.writeData(featureCount);
\r
48 for (int i = 0; i < featureCount; i += 1) {
\r
49 writer.writeData(features[i].getFeatureIndex());
\r
54 static class ScriptRecord extends TaggedRecord
\r
56 private LangSysRecord[] langSysRecords;
\r
57 private int langSysCount;
\r
59 public ScriptRecord(String theScriptTag)
\r
61 super(theScriptTag);
\r
62 langSysRecords = new LangSysRecord[10];
\r
66 public LangSysRecord findLangSysRecord(String languageTag)
\r
68 for (int i = 0; i < langSysCount; i += 1) {
\r
69 LangSysRecord langSysRecord = langSysRecords[i];
\r
71 if (langSysRecord.getTag().equals(languageTag)) {
\r
72 return langSysRecord;
\r
76 if (langSysCount >= langSysRecords.length) {
\r
77 LangSysRecord[] newLangSysRecords = new LangSysRecord[langSysCount + 5];
\r
79 System.arraycopy(langSysRecords, 0, newLangSysRecords, 0, langSysRecords.length);
\r
80 langSysRecords = newLangSysRecords;
\r
83 LangSysRecord newLangSysRecord = new LangSysRecord(languageTag);
\r
84 langSysRecords[langSysCount] = newLangSysRecord;
\r
87 return newLangSysRecord;
\r
90 public void writeScriptRecord(OpenTypeTableWriter writer)
\r
92 TaggedRecord.sort(langSysRecords, langSysCount);
\r
94 int scriptTableBase = writer.getOutputIndex();
\r
95 int firstLangSys = 0;
\r
97 writer.writeData(0); // default langSys offset (fixed later)
\r
99 if (langSysRecords[0].getTag().equals("(default)")) {
\r
103 writer.writeData(langSysCount - firstLangSys);
\r
105 int langSysOffset = writer.getOutputIndex();
\r
107 for (int i = firstLangSys; i < langSysCount; i += 1) {
\r
108 writer.writeTag(langSysRecords[i].getTag());
\r
109 writer.writeData(0);
\r
112 if (firstLangSys > 0) {
\r
113 System.out.print(" (default)");
\r
114 writer.fixOffset(scriptTableBase, scriptTableBase);
\r
115 langSysRecords[0].writeLangSysRecord(writer);
\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
125 System.out.print(" '" + langSysRecords[i].getTag() + "'");
\r
126 langSysRecords[i].writeLangSysRecord(writer);
\r
131 private ScriptRecord[] scriptRecords;
\r
132 private int scriptCount;
\r
134 public ScriptList()
\r
136 scriptRecords = new ScriptRecord[10];
\r
140 private LangSysRecord findLangSysRecord(String scriptTag, String languageTag)
\r
142 for (int i = 0; i < scriptCount; i += 1) {
\r
143 ScriptRecord scriptRecord = scriptRecords[i];
\r
145 if (scriptRecord.getTag().equals(scriptTag)) {
\r
146 return scriptRecord.findLangSysRecord(languageTag);
\r
150 if (scriptCount >= scriptRecords.length) {
\r
151 ScriptRecord[] newScriptRecords = new ScriptRecord[scriptCount + 5];
\r
153 System.arraycopy(scriptRecords, 0, newScriptRecords, 0, scriptRecords.length);
\r
154 scriptRecords = newScriptRecords;
\r
157 ScriptRecord newScriptRecord = new ScriptRecord(scriptTag);
\r
158 scriptRecords[scriptCount] = newScriptRecord;
\r
161 return newScriptRecord.findLangSysRecord(languageTag);
\r
164 public void addFeature(String scriptTag, String languageTag, Feature feature)
\r
166 LangSysRecord langSysRecord = findLangSysRecord(scriptTag, languageTag);
\r
168 langSysRecord.addFeature(feature);
\r
171 public void writeScriptList(OpenTypeTableWriter writer)
\r
173 System.out.println("writing script list...");
\r
175 int scriptListBase = writer.getOutputIndex();
\r
177 TaggedRecord.sort(scriptRecords, scriptCount);
\r
178 writer.writeData(scriptCount);
\r
180 int scriptRecordOffset = writer.getOutputIndex();
\r
182 for (int i = 0; i < scriptCount; i += 1) {
\r
183 writer.writeTag(scriptRecords[i].getTag());
\r
184 writer.writeData(0);
\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
194 System.out.print(" script '" + scriptRecords[i].getTag() + "':");
\r
195 scriptRecords[i].writeScriptRecord(writer);
\r
196 System.out.println();
\r