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