blob: d5949d0ac7e730d1c93ae0ca427ea479e77882e2 [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 1998-2003, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* Created on Dec 3, 2003
*
*******************************************************************************
*/
package com.ibm.icu.dev.tool.layout;
public class FeatureList
{
static class FeatureRecord extends TaggedRecord
{
private int[] lookupIndices;
private int lookupCount;
public FeatureRecord(String theFeatureTag)
{
super(theFeatureTag);
lookupIndices = new int[10];
lookupCount = 0;
}
public void addLookup(int theLookupIndex)
{
if (lookupCount > lookupIndices.length) {
int[] newLookupIndices = new int[lookupIndices.length + 5];
System.arraycopy(lookupIndices, 0, newLookupIndices, 0, lookupIndices.length);
lookupIndices = newLookupIndices;
}
lookupIndices[lookupCount] = theLookupIndex;
lookupCount += 1;
}
public void writeFeatureRecord(OpenTypeTableWriter writer)
{
writer.writeData(0); // featureParams (must be NULL)
writer.writeData(lookupCount);
for (int i = 0; i < lookupCount; i += 1) {
writer.writeData(lookupIndices[i]);
}
}
}
private FeatureRecord[] featureRecords;
private int featureCount;
public FeatureList()
{
featureRecords = new FeatureRecord[10];
featureCount = 0;
}
private FeatureRecord findFeatureRecord(String featureTag)
{
for (int i = 0; i < featureCount; i += 1) {
FeatureRecord featureRecord = featureRecords[i];
if (featureRecord.getTag().equals(featureTag)) {
return featureRecord;
}
}
if (featureCount >= featureRecords.length) {
FeatureRecord[] newFeatureRecords = new FeatureRecord[featureCount + 5];
System.arraycopy(featureRecords, 0, newFeatureRecords, 0, featureRecords.length);
featureRecords = newFeatureRecords;
}
FeatureRecord newFeatureRecord = new FeatureRecord(featureTag);
featureRecords[featureCount] = newFeatureRecord;
featureCount += 1;
return newFeatureRecord;
}
public void addLookup(String featureTag, int lookupIndex)
{
FeatureRecord featureRecord = findFeatureRecord(featureTag);
featureRecord.addLookup(lookupIndex);
}
public void finalizeFeatureList()
{
TaggedRecord.sort(featureRecords, featureCount);
}
public int getFeatureIndex(String featureTag)
{
return TaggedRecord.search(featureRecords, featureCount, featureTag);
}
public void writeFeaturetList(OpenTypeTableWriter writer)
{
System.out.print("writing feature list...");
int featureListBase = writer.getOutputIndex();
writer.writeData(featureCount);
int featureRecordOffset = writer.getOutputIndex();
for (int i = 0; i < featureCount; i += 1) {
String tag = featureRecords[i].getTag();
System.out.print(" '" + tag + "'");
writer.writeTag(tag);
writer.writeData(0);
}
for (int i = 0; i < featureCount; i += 1) {
// fix the offset in the featureRecordArray.
// The "+2" skips over the tag and the "+3"
// skips to the next featureRecord entry
writer.fixOffset(featureRecordOffset + 2, featureListBase);
featureRecordOffset += 3;
featureRecords[i].writeFeatureRecord(writer);
}
System.out.println();
}
}