]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/OpenTypeTableWriter.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / OpenTypeTableWriter.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1998-2004, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  *\r
7  * Created on Dec 3, 2003\r
8  *\r
9  *******************************************************************************\r
10  */\r
11 package com.ibm.icu.dev.tool.layout;\r
12 \r
13 \r
14 import java.io.PrintStream;\r
15 \r
16 import com.ibm.icu.impl.Utility;\r
17 \r
18 abstract class OpenTypeTableWriter\r
19 {\r
20     static class OpenTypeTableDumper\r
21     {\r
22         private short[] table;\r
23         private int tableLength;\r
24         \r
25         OpenTypeTableDumper(short[] data, int outputIndex)\r
26         {\r
27             table = data;\r
28             tableLength = outputIndex;\r
29         }\r
30         \r
31         int length()\r
32         {\r
33             return tableLength;\r
34         }\r
35         \r
36         void appendValue(StringBuffer line, int index)\r
37         {\r
38             short value = table[index];\r
39             \r
40             line.append("0x");\r
41             line.append(Utility.hex((value >> 8) & 0xFF, 2));\r
42             line.append(", ");\r
43 \r
44             line.append("0x");\r
45             line.append(Utility.hex(value & 0xFF, 2));\r
46         }\r
47 \r
48         void dumpTable(PrintStream output, int valuesPerLine) {\r
49             StringBuffer line = new StringBuffer("    "); // four spaces\r
50             int maxIndex = length();\r
51         \r
52             for (int i = 0; i < maxIndex; i += 1) {\r
53                 \r
54                 if (i > 0 && i % valuesPerLine == 0) {\r
55                     output.println(line.toString());\r
56                     line.setLength(4);\r
57                 }\r
58         \r
59                 appendValue(line, i);\r
60                 line.append(", ");\r
61             }\r
62         \r
63             line.setLength(line.length() - 2);\r
64         \r
65             output.println(line.toString());\r
66         }\r
67     }\r
68             \r
69     protected short[] data;\r
70     protected int outputIndex;\r
71 \r
72     public OpenTypeTableWriter(int initialBufferSize)\r
73     {\r
74         data = new short[initialBufferSize];\r
75         outputIndex = 0;\r
76     }\r
77     \r
78     public OpenTypeTableWriter()\r
79     {\r
80         this(1024);\r
81     }\r
82     \r
83     public int getOutputIndex()\r
84     {\r
85         return outputIndex;\r
86     }\r
87     \r
88     public void writeData(int value)\r
89     {\r
90         if (outputIndex >= data.length)\r
91         {\r
92             short[] newData = new short[data.length + 512];\r
93             \r
94             System.arraycopy(data, 0, newData, 0, data.length);\r
95             \r
96             data = newData;\r
97         }\r
98         \r
99         data[outputIndex] = (short) value;\r
100         outputIndex += 1;\r
101     }\r
102     \r
103     public void writeTag(String tag)\r
104     {\r
105         char[] charArray = {'\0', '\0', '\0', '\0'};\r
106         int max = Math.min(tag.length(), 4);\r
107         \r
108         tag.getChars(0, max, charArray, 0);\r
109         \r
110         writeData(((charArray[0] & 0xFF) << 8) + (charArray[1] & 0xFF));\r
111         writeData(((charArray[2] & 0xFF) << 8) + (charArray[3] & 0xFF));\r
112     }\r
113     \r
114     public void fixOffset(int offset, int base)\r
115     {\r
116         // * 2 to convert from short to byte index\r
117         data[offset] = (short) ((outputIndex - base) * 2);\r
118     }\r
119     \r
120     public void dumpTable(PrintStream output, int valuesPerLine)\r
121     {\r
122         OpenTypeTableDumper dumper = new OpenTypeTableDumper(data, outputIndex);\r
123         \r
124         dumper.dumpTable(output, valuesPerLine);\r
125     }\r
126     \r
127     abstract public void writeTable(PrintStream output);\r
128 }\r