2 *******************************************************************************
\r
3 * Copyright (C) 1998-2007, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 * Created on Dec 3, 2003
\r
9 *******************************************************************************
\r
11 package com.ibm.icu.dev.tool.layout;
\r
13 import java.util.Vector;
\r
15 import com.ibm.icu.impl.Utility;
\r
17 public class LigatureTreeWalker extends TreeWalker implements LookupSubtable
\r
19 protected int[] componentChars;
\r
20 protected int componentCount;
\r
21 protected int lastFirstComponent;
\r
23 protected Vector ligatureSets;
\r
24 protected Vector ligatureSet;
\r
26 public LigatureTreeWalker()
\r
28 componentChars = new int[30];
\r
30 lastFirstComponent = -1;
\r
32 ligatureSets = new Vector();
\r
35 public void down(int ch)
\r
37 componentChars[componentCount] = ch;
\r
38 componentCount += 1;
\r
43 if (componentCount > 0) {
\r
44 componentCount -= 1;
\r
48 public void ligature(int lig)
\r
50 int firstComponent = componentChars[0];
\r
52 if (lastFirstComponent != firstComponent) {
\r
53 if (ligatureSet != null) {
\r
54 ligatureSets.addElement(ligatureSet);
\r
57 ligatureSet = new Vector();
\r
58 lastFirstComponent = firstComponent;
\r
61 ligatureSet.addElement(new LigatureEntry(lig, componentChars, componentCount));
\r
66 if (ligatureSet != null) {
\r
67 ligatureSets.addElement(ligatureSet);
\r
70 protected int firstComponentChar(int ligatureSetIndex)
\r
72 Vector aLigatureSet = (Vector) ligatureSets.elementAt(ligatureSetIndex);
\r
73 LigatureEntry firstEntry = (LigatureEntry) aLigatureSet.elementAt(0);
\r
75 return firstEntry.getComponentChar(0);
\r
78 protected void writeCoverageTable(OpenTypeTableWriter writer)
\r
80 int ligatureSetCount = ligatureSets.size();
\r
82 writer.writeData(1);
\r
83 writer.writeData(ligatureSetCount);
\r
85 for (int set = 0; set < ligatureSetCount; set += 1) {
\r
86 writer.writeData(firstComponentChar(set));
\r
90 public void writeLookupSubtable(OpenTypeTableWriter writer)
\r
92 int coverageOffset, ligatureSetOffset, ligatureTableOffset;
\r
93 int ligatureSubstitutionBase = writer.getOutputIndex();
\r
94 int ligatureSetCount = ligatureSets.size();
\r
96 //System.out.println("Writing " + tableName + "...");
\r
98 writer.writeData(1); // substFormat
\r
100 coverageOffset = writer.getOutputIndex();
\r
101 writer.writeData(0); // coverageTableOffset (will fix later)
\r
103 writer.writeData(ligatureSetCount);
\r
105 ligatureSetOffset = writer.getOutputIndex();
\r
106 for (int set = 0; set < ligatureSetCount; set += 1) {
\r
107 writer.writeData(0); // ligatureSet offset - will fix later
\r
110 for (int set = 0; set < ligatureSetCount; set += 1) {
\r
111 System.out.print(Utility.hex(firstComponentChar(set), 6) + ": ");
\r
113 Vector aLigatureSet = (Vector) ligatureSets.elementAt(set);
\r
114 int ligatureCount = aLigatureSet.size();
\r
115 int ligatureSetAddress = writer.getOutputIndex();
\r
117 System.out.println(ligatureCount + " ligatures.");
\r
119 writer.fixOffset(ligatureSetOffset++, ligatureSubstitutionBase);
\r
120 writer.writeData(ligatureCount);
\r
122 ligatureTableOffset = writer.getOutputIndex();
\r
123 for (int lig = 0; lig < ligatureCount; lig += 1) {
\r
124 writer.writeData(0); // ligatureTableOffset (will fix later)
\r
127 for (int lig = 0; lig < ligatureCount; lig += 1) {
\r
128 LigatureEntry entry = (LigatureEntry) aLigatureSet.elementAt(lig);
\r
129 int compCount = entry.getComponentCount();
\r
131 writer.fixOffset(ligatureTableOffset++, ligatureSetAddress);
\r
132 writer.writeData(entry.getLigature());
\r
133 writer.writeData(compCount);
\r
135 for (int comp = 1; comp < compCount; comp += 1) {
\r
136 writer.writeData(entry.getComponentChar(comp));
\r
141 writer.fixOffset(coverageOffset, ligatureSubstitutionBase);
\r
142 writeCoverageTable(writer);
\r