2 *******************************************************************************
3 * Copyright (C) 2002-2010, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
8 package com.ibm.icu.dev.tool.layout;
10 import java.util.Vector;
12 import com.ibm.icu.text.UTF16;
17 * To change the template for this generated type comment go to
18 * Window>Preferences>Java>Code Generation>Code and Comments
20 public class DecompTable implements LookupSubtable
22 static class DecompEntry
27 DecompEntry(int composedChar, String decomposition)
29 int decompCount = UTF16.countCodePoint(decomposition);
31 composed = composedChar;
32 decomp = new int[decompCount];
36 for (int in = 0; in < decomposition.length(); in += UTF16.getCharCount(cp)) {
37 cp = UTF16.charAt(decomposition, in);
42 public int getComposedCharacter()
47 public int[] getDecomposition()
52 public int getDecompositionCount()
57 public int getDecomposedCharacter(int i)
59 if (i >= 0 && i < decomp.length) {
66 public int compareTo(DecompEntry that)
68 return this.composed - that.composed;
72 // Straight insertion sort from Knuth vol. III, pg. 81
74 public static void sort(DecompEntry[] table, Vector decompVector)
76 for (int j = 0; j < table.length; j += 1) {
78 DecompEntry v = (DecompEntry) decompVector.elementAt(j);
80 for (i = j - 1; i >= 0; i -= 1) {
81 if (v.compareTo(table[i]) >= 0) {
85 table[i + 1] = table[i];
93 private Vector decompVector;
94 private DecompEntry[] decompEntries;
95 private int snapshotSize;
99 decompVector = new Vector();
100 decompEntries = null;
104 public void add(int composed, String decomposition)
106 DecompEntry entry = new DecompEntry(composed, decomposition);
108 decompVector.addElement(entry);
111 public int getComposedCharacter(int i)
113 if (i < 0 || i > decompEntries.length) {
117 return decompEntries[i].getComposedCharacter();
120 public int getDecompositionCount(int i)
122 if (i < 0 || i > decompEntries.length) {
126 return decompEntries[i].getDecompositionCount();
129 public boolean hasEntries()
131 return decompVector.size() > 0;
134 private void snapshot()
136 if (snapshotSize != decompVector.size()) {
137 snapshotSize = decompVector.size();
138 decompEntries = new DecompEntry[snapshotSize];
139 DecompEntry.sort(decompEntries, decompVector);
143 public void writeLookupSubtable(OpenTypeTableWriter writer)
147 int multipleSubstitutionsBase = writer.getOutputIndex();
148 int coverageTableIndex, sequenceOffsetIndex;
149 int sequenceCount = decompEntries.length;
151 writer.writeData(1); // format = 1
153 coverageTableIndex = writer.getOutputIndex();
154 writer.writeData(0); // coverage table offset (fixed later)
156 writer.writeData(sequenceCount);
158 sequenceOffsetIndex = writer.getOutputIndex();
159 for (int s = 0; s < sequenceCount; s += 1) {
160 writer.writeData(0); // offset to sequence table (fixed later);
163 for (int s = 0; s < sequenceCount; s += 1) {
164 DecompEntry entry = decompEntries[s];
165 int decompCount = entry.getDecompositionCount();
167 writer.fixOffset(sequenceOffsetIndex++, multipleSubstitutionsBase);
169 writer.writeData(decompCount); // glyphCount
171 for (int g = 0; g < decompCount; g += 1) {
172 writer.writeData(entry.getDecomposedCharacter(g));
176 // write a format 1 coverage table
177 writer.fixOffset(coverageTableIndex, multipleSubstitutionsBase);
178 writer.writeData(1); // format = 1
179 writer.writeData(sequenceCount); // glyphCount
181 for (int i = 0; i < sequenceCount; i += 1) {
182 writer.writeData(decompEntries[i].getComposedCharacter());