| /* |
| ******************************************************************************* |
| * Copyright (C) 1998-2007, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| * |
| * Created on Dec 3, 2003 |
| * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.dev.tool.layout; |
| |
| import java.util.Vector; |
| |
| import com.ibm.icu.impl.Utility; |
| |
| public class LigatureTreeWalker extends TreeWalker implements LookupSubtable |
| { |
| protected int[] componentChars; |
| protected int componentCount; |
| protected int lastFirstComponent; |
| |
| protected Vector ligatureSets; |
| protected Vector ligatureSet; |
| |
| public LigatureTreeWalker() |
| { |
| componentChars = new int[30]; |
| componentCount = 0; |
| lastFirstComponent = -1; |
| ligatureSet = null; |
| ligatureSets = new Vector(); |
| } |
| |
| public void down(int ch) |
| { |
| componentChars[componentCount] = ch; |
| componentCount += 1; |
| } |
| |
| public void up() |
| { |
| if (componentCount > 0) { |
| componentCount -= 1; |
| } |
| } |
| |
| public void ligature(int lig) |
| { |
| int firstComponent = componentChars[0]; |
| |
| if (lastFirstComponent != firstComponent) { |
| if (ligatureSet != null) { |
| ligatureSets.addElement(ligatureSet); |
| } |
| |
| ligatureSet = new Vector(); |
| lastFirstComponent = firstComponent; |
| } |
| |
| ligatureSet.addElement(new LigatureEntry(lig, componentChars, componentCount)); |
| } |
| |
| public void done() |
| { |
| if (ligatureSet != null) { |
| ligatureSets.addElement(ligatureSet); |
| } |
| } |
| protected int firstComponentChar(int ligatureSetIndex) |
| { |
| Vector aLigatureSet = (Vector) ligatureSets.elementAt(ligatureSetIndex); |
| LigatureEntry firstEntry = (LigatureEntry) aLigatureSet.elementAt(0); |
| |
| return firstEntry.getComponentChar(0); |
| } |
| |
| protected void writeCoverageTable(OpenTypeTableWriter writer) |
| { |
| int ligatureSetCount = ligatureSets.size(); |
| |
| writer.writeData(1); |
| writer.writeData(ligatureSetCount); |
| |
| for (int set = 0; set < ligatureSetCount; set += 1) { |
| writer.writeData(firstComponentChar(set)); |
| } |
| } |
| |
| public void writeLookupSubtable(OpenTypeTableWriter writer) |
| { |
| int coverageOffset, ligatureSetOffset, ligatureTableOffset; |
| int ligatureSubstitutionBase = writer.getOutputIndex(); |
| int ligatureSetCount = ligatureSets.size(); |
| |
| //System.out.println("Writing " + tableName + "..."); |
| |
| writer.writeData(1); // substFormat |
| |
| coverageOffset = writer.getOutputIndex(); |
| writer.writeData(0); // coverageTableOffset (will fix later) |
| |
| writer.writeData(ligatureSetCount); |
| |
| ligatureSetOffset = writer.getOutputIndex(); |
| for (int set = 0; set < ligatureSetCount; set += 1) { |
| writer.writeData(0); // ligatureSet offset - will fix later |
| } |
| |
| for (int set = 0; set < ligatureSetCount; set += 1) { |
| System.out.print(Utility.hex(firstComponentChar(set), 6) + ": "); |
| |
| Vector aLigatureSet = (Vector) ligatureSets.elementAt(set); |
| int ligatureCount = aLigatureSet.size(); |
| int ligatureSetAddress = writer.getOutputIndex(); |
| |
| System.out.println(ligatureCount + " ligatures."); |
| |
| writer.fixOffset(ligatureSetOffset++, ligatureSubstitutionBase); |
| writer.writeData(ligatureCount); |
| |
| ligatureTableOffset = writer.getOutputIndex(); |
| for (int lig = 0; lig < ligatureCount; lig += 1) { |
| writer.writeData(0); // ligatureTableOffset (will fix later) |
| } |
| |
| for (int lig = 0; lig < ligatureCount; lig += 1) { |
| LigatureEntry entry = (LigatureEntry) aLigatureSet.elementAt(lig); |
| int compCount = entry.getComponentCount(); |
| |
| writer.fixOffset(ligatureTableOffset++, ligatureSetAddress); |
| writer.writeData(entry.getLigature()); |
| writer.writeData(compCount); |
| |
| for (int comp = 1; comp < compCount; comp += 1) { |
| writer.writeData(entry.getComponentChar(comp)); |
| } |
| } |
| } |
| |
| writer.fixOffset(coverageOffset, ligatureSubstitutionBase); |
| writeCoverageTable(writer); |
| } |
| } |