// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *******************************************************************************
 * Copyright (C) 1998-2005, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * Created on Dec 3, 2003
 *
 *******************************************************************************
 */
package com.ibm.icu.dev.tool.layout;

import java.io.PrintStream;



class GDEFWriter extends OpenTypeTableWriter
{
    ClassTable classTable;
    ClassTable markClassTable;
    String scriptName;
    
    public GDEFWriter(String scriptName, ClassTable classTable, ClassTable markClassTable)
    {
        super(1024);
        this.classTable     = classTable;
        this.markClassTable = markClassTable;
        this.scriptName     = scriptName;
    }
    
    public void writeTable(PrintStream output)
    {
        System.out.println("Writing " + scriptName + " GDEF table...");
        
        // 0x0001000 (fixed1) version number
        writeData(0x0001);
        writeData(0x0000);
        
        int classDefOffset = getOutputIndex();
        writeData(0); // glyphClassDefOffset (will fix later);
        writeData(0); // attachListOffset
        writeData(0); // ligCaretListOffset
        writeData(0); // markAttachClassDefOffset
        
        fixOffset(classDefOffset++, 0);
        
        System.out.println("Writing glyph class definition table...");
        classTable.writeClassTable(this);
        
        // skip over attachListOffset, ligCaretListOffset
        classDefOffset += 2;
        
        if (markClassTable != null) {
            fixOffset(classDefOffset, 0);
            
            System.out.println("Writing mark attach class definition table...");
            markClassTable.writeClassTable(this);
        }

        output.print("const le_uint8 ");
        output.print(scriptName);
        output.println("Shaping::glyphDefinitionTable[] = {");
        
        dumpTable(output, 8);
        output.println("};\n");
    }
}
