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