/*
 *******************************************************************************
 * 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 FeatureList
{
    
    private Feature[] features;
    private int featureCount;
    
    public FeatureList()
    {
        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 finalizeFeatureList()
    {
        TaggedRecord.sort(features, featureCount);
        
        for (int i = 0; i < featureCount; i += 1) {
            features[i].setFeatureIndex(i);
        }
    }
    
    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 = features[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;
            
            features[i].writeFeature(writer);
        }
        
        System.out.println();
    }
}