/*
 *******************************************************************************
 * 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 /*abstract*/ class Lookup
{
    private int lookupType;
    private int lookupFlags;
    private LookupSubtable[] subtables;
    private int subtableCount;
    
    // Lookup flags
    public final static int LF_ReservedBit          = 0x0001;
    public final static int LF_IgnoreBaseGlyphs     = 0x0002;
    public final static int LF_IgnoreLigatures      = 0x0004;
    public final static int LF_IgnoreMarks          = 0x0008;
    public final static int LF_ReservedMask         = 0x00F0;
    public final static int LF_MarkAttachTypeMask   = 0xFF00;
    public final static int LF_MarkAttachTypeShift  = 8;
    
    // GSUB lookup types
    public final static int GSST_Single          = 1;
    public final static int GSST_Multiple        = 2;
    public final static int GSST_Alternate       = 3;
    public final static int GSST_Ligature        = 4;
    public final static int GSST_Context         = 5;
    public final static int GSST_ChainingContext = 6;

    // GPOS lookup types
    public final static int GPST_Single          = 1;
    public final static int GPST_Pair            = 2;
    public final static int GPST_Cursive         = 3;
    public final static int GPST_MarkToBase      = 4;
    public final static int GPST_MarkToLigature  = 5;
    public final static int GPST_MarkToMark      = 6;
    public final static int GPST_Context         = 7;
    public final static int GPST_ChainingContext = 8;
    
    public Lookup(int theLookupType, int theLookupFlags)
    {
        lookupType = theLookupType;
        lookupFlags = theLookupFlags;
        
        subtables = new LookupSubtable[10];
        subtableCount = 0;
    }
    
    public void addSubtable(LookupSubtable subtable)
    {
        if (subtableCount >= subtables.length) {
            LookupSubtable[] newSubtables = new LookupSubtable[subtables.length + 5];
            
            System.arraycopy(subtables, 0, newSubtables, 0, subtables.length);
            subtables = newSubtables;
        }
        
        subtables[subtableCount] = subtable;
        subtableCount += 1;
    }
    
    public void writeLookup(OpenTypeTableWriter writer)
    {
        int lookupBase = writer.getOutputIndex();
        
        writer.writeData(lookupType);
        writer.writeData(lookupFlags);
        writer.writeData(subtableCount);
        
        int subtableOffset = writer.getOutputIndex();
        
        for (int i = 0; i < subtableCount; i += 1) {
            writer.writeData(0);
        }
        
        for (int i = 0; i < subtableCount; i += 1) {
            writer.fixOffset(subtableOffset++, lookupBase);
            subtables[i].writeLookupSubtable(writer);
        }
    }
}
