| /* |
| ******************************************************************************* |
| * Copyright (C) 1998-2004, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| * |
| * Created on Dec 3, 2003 |
| * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.dev.tool.layout; |
| |
| |
| public class ScriptList |
| { |
| static class LangSysRecord extends TaggedRecord |
| { |
| private Feature[] features; |
| private int featureCount; |
| |
| public LangSysRecord(String theLanguageTag) |
| { |
| super(theLanguageTag); |
| |
| features = new Feature[10]; |
| featureCount = 0; |
| } |
| |
| public void addFeature(Feature feature) |
| { |
| if (featureCount > features.length) { |
| Feature[] newFeatures = new Feature[features.length + 5]; |
| |
| System.arraycopy(features, 0, newFeatures, 0, features.length); |
| features = newFeatures; |
| } |
| |
| features[featureCount++] = feature; |
| } |
| |
| public void writeLangSysRecord(OpenTypeTableWriter writer) |
| { |
| writer.writeData(0); // lookupOrder (must be NULL) |
| writer.writeData(0xFFFF); // reqFeatureIndex (0xFFFF means none) |
| |
| writer.writeData(featureCount); |
| |
| for (int i = 0; i < featureCount; i += 1) { |
| writer.writeData(features[i].getFeatureIndex()); |
| } |
| } |
| } |
| |
| static class ScriptRecord extends TaggedRecord |
| { |
| private LangSysRecord[] langSysRecords; |
| private int langSysCount; |
| |
| public ScriptRecord(String theScriptTag) |
| { |
| super(theScriptTag); |
| langSysRecords = new LangSysRecord[10]; |
| langSysCount = 0; |
| } |
| |
| public LangSysRecord findLangSysRecord(String languageTag) |
| { |
| for (int i = 0; i < langSysCount; i += 1) { |
| LangSysRecord langSysRecord = langSysRecords[i]; |
| |
| if (langSysRecord.getTag().equals(languageTag)) { |
| return langSysRecord; |
| } |
| } |
| |
| if (langSysCount >= langSysRecords.length) { |
| LangSysRecord[] newLangSysRecords = new LangSysRecord[langSysCount + 5]; |
| |
| System.arraycopy(langSysRecords, 0, newLangSysRecords, 0, langSysRecords.length); |
| langSysRecords = newLangSysRecords; |
| } |
| |
| LangSysRecord newLangSysRecord = new LangSysRecord(languageTag); |
| langSysRecords[langSysCount] = newLangSysRecord; |
| |
| langSysCount += 1; |
| return newLangSysRecord; |
| } |
| |
| public void writeScriptRecord(OpenTypeTableWriter writer) |
| { |
| TaggedRecord.sort(langSysRecords, langSysCount); |
| |
| int scriptTableBase = writer.getOutputIndex(); |
| int firstLangSys = 0; |
| |
| writer.writeData(0); // default langSys offset (fixed later) |
| |
| if (langSysRecords[0].getTag().equals("(default)")) { |
| firstLangSys = 1; |
| } |
| |
| writer.writeData(langSysCount - firstLangSys); |
| |
| int langSysOffset = writer.getOutputIndex(); |
| |
| for (int i = firstLangSys; i < langSysCount; i += 1) { |
| writer.writeTag(langSysRecords[i].getTag()); |
| writer.writeData(0); |
| } |
| |
| if (firstLangSys > 0) { |
| System.out.print(" (default)"); |
| writer.fixOffset(scriptTableBase, scriptTableBase); |
| langSysRecords[0].writeLangSysRecord(writer); |
| } |
| |
| for (int i = firstLangSys; i < langSysCount; i += 1) { |
| // fix the offset in the langSysRecordArray. |
| // The "+2" skips over the tag and the "+3" |
| // skips to the next langSysRecord entry |
| writer.fixOffset(langSysOffset + 2, scriptTableBase); |
| langSysOffset += 3; |
| |
| System.out.print(" '" + langSysRecords[i].getTag() + "'"); |
| langSysRecords[i].writeLangSysRecord(writer); |
| } |
| } |
| } |
| |
| private ScriptRecord[] scriptRecords; |
| private int scriptCount; |
| |
| public ScriptList() |
| { |
| scriptRecords = new ScriptRecord[10]; |
| scriptCount = 0; |
| } |
| |
| private LangSysRecord findLangSysRecord(String scriptTag, String languageTag) |
| { |
| for (int i = 0; i < scriptCount; i += 1) { |
| ScriptRecord scriptRecord = scriptRecords[i]; |
| |
| if (scriptRecord.getTag().equals(scriptTag)) { |
| return scriptRecord.findLangSysRecord(languageTag); |
| } |
| } |
| |
| if (scriptCount >= scriptRecords.length) { |
| ScriptRecord[] newScriptRecords = new ScriptRecord[scriptCount + 5]; |
| |
| System.arraycopy(scriptRecords, 0, newScriptRecords, 0, scriptRecords.length); |
| scriptRecords = newScriptRecords; |
| } |
| |
| ScriptRecord newScriptRecord = new ScriptRecord(scriptTag); |
| scriptRecords[scriptCount] = newScriptRecord; |
| |
| scriptCount += 1; |
| return newScriptRecord.findLangSysRecord(languageTag); |
| } |
| |
| public void addFeature(String scriptTag, String languageTag, Feature feature) |
| { |
| LangSysRecord langSysRecord = findLangSysRecord(scriptTag, languageTag); |
| |
| langSysRecord.addFeature(feature); |
| } |
| |
| public void writeScriptList(OpenTypeTableWriter writer) |
| { |
| System.out.println("writing script list..."); |
| |
| int scriptListBase = writer.getOutputIndex(); |
| |
| TaggedRecord.sort(scriptRecords, scriptCount); |
| writer.writeData(scriptCount); |
| |
| int scriptRecordOffset = writer.getOutputIndex(); |
| |
| for (int i = 0; i < scriptCount; i += 1) { |
| writer.writeTag(scriptRecords[i].getTag()); |
| writer.writeData(0); |
| } |
| |
| for (int i = 0; i < scriptCount; i += 1) { |
| // fix the offset in the scriptRecordArray. |
| // The "+2" skips over the tag and the "+3" |
| // skips to the next scriptRecord entry |
| writer.fixOffset(scriptRecordOffset + 2, scriptListBase); |
| scriptRecordOffset += 3; |
| |
| System.out.print(" script '" + scriptRecords[i].getTag() + "':"); |
| scriptRecords[i].writeScriptRecord(writer); |
| System.out.println(); |
| } |
| } |
| } |
| |