/*
 *******************************************************************************
 * Copyright (C) 1998-2003, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * Created on Dec 3, 2003
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/layout/Lookup.java,v $
 * $Date: 2003/12/17 04:54:40 $
 * $Revision: 1.2 $
 * 
 *******************************************************************************
 */
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);
        }
    }
}