12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
3bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert/*
4bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *******************************************************************************
5bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Copyright (C) 1998-2005, International Business Machines Corporation and    *
6bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * others. All Rights Reserved.                                                *
7bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *******************************************************************************
8bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
9bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Created on Dec 3, 2003
10bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *
11bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert *******************************************************************************
12bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert */
13bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertpackage com.ibm.icu.dev.tool.layout;
14bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
15bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertimport java.io.PrintStream;
16bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
17bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
18bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
19bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubertclass GDEFWriter extends OpenTypeTableWriter
20bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert{
21bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ClassTable classTable;
22bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    ClassTable markClassTable;
23bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    String scriptName;
24bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
25bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public GDEFWriter(String scriptName, ClassTable classTable, ClassTable markClassTable)
26bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
27bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        super(1024);
28bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.classTable     = classTable;
29bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.markClassTable = markClassTable;
30bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        this.scriptName     = scriptName;
31bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
32bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
33bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    public void writeTable(PrintStream output)
34bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    {
35bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        System.out.println("Writing " + scriptName + " GDEF table...");
36bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
37bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // 0x0001000 (fixed1) version number
38bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        writeData(0x0001);
39bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        writeData(0x0000);
40bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
41bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        int classDefOffset = getOutputIndex();
42bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        writeData(0); // glyphClassDefOffset (will fix later);
43bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        writeData(0); // attachListOffset
44bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        writeData(0); // ligCaretListOffset
45bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        writeData(0); // markAttachClassDefOffset
46bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
47bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        fixOffset(classDefOffset++, 0);
48bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
49bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        System.out.println("Writing glyph class definition table...");
50bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        classTable.writeClassTable(this);
51bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
52bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        // skip over attachListOffset, ligCaretListOffset
53bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        classDefOffset += 2;
54bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
55bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        if (markClassTable != null) {
56bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            fixOffset(classDefOffset, 0);
57bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
58bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            System.out.println("Writing mark attach class definition table...");
59bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert            markClassTable.writeClassTable(this);
60bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        }
61bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
62bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        output.print("const le_uint8 ");
63bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        output.print(scriptName);
64bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        output.println("Shaping::glyphDefinitionTable[] = {");
65bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert
66bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        dumpTable(output, 8);
67bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        output.println("};\n");
68bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert    }
69bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
70