/*****************************************************************************
* Copyright (C) The Apache Software Foundation. All rights reserved. *
* ------------------------------------------------------------------------- *
* This software is published under the terms of the Apache Software License *
* version 1.1, a copy of which has been included with this distribution in *
* the LICENSE file. *
*****************************************************************************/
package jogamp.graph.font.typecast.ot.table;
import java.io.DataInput;
import java.io.IOException;
import jogamp.graph.font.typecast.ot.Fixed;
/**
*
* @author <a href="mailto:davidsch@dev.java.net">David Schweinsberg</a>
* @version $Id: PostTable.java,v 1.1.1.1 2004-12-05 23:14:56 davidsch Exp $
*/
public class PostTable implements Table {
/**
* TODO: Mac Glyph names for 210 & 257
*/
private static final String[] macGlyphName = {
".notdef", // 0
"null", // 1
"CR", // 2
"space", // 3
"exclam", // 4
"quotedbl", // 5
"numbersign", // 6
"dollar", // 7
"percent", // 8
"ampersand", // 9
"quotesingle", // 10
"parenleft", // 11
"parenright", // 12
"asterisk", // 13
"plus", // 14
"comma", // 15
"hyphen", // 16
"period", // 17
"slash", // 18
"zero", // 19
"one", // 20
"two", // 21
"three", // 22
"four", // 23
"five", // 24
"six", // 25
"seven", // 26
"eight", // 27
"nine", // 28
"colon", // 29
"semicolon", // 30
"less", // 31
"equal", // 32
"greater", // 33
"question", // 34
"at", // 35
"A", // 36
"B", // 37
"C", // 38
"D", // 39
"E", // 40
"F", // 41
"G", // 42
"H", // 43
"I", // 44
"J", // 45
"K", // 46
"L", // 47
"M", // 48
"N", // 49
"O", // 50
"P", // 51
"Q", // 52
"R", // 53
"S", // 54
"T", // 55
"U", // 56
"V", // 57
"W", // 58
"X", // 59
"Y", // 60
"Z", // 61
"bracketleft", // 62
"backslash", // 63
"bracketright", // 64
"asciicircum", // 65
"underscore", // 66
"grave", // 67
"a", // 68
"b", // 69
"c", // 70
"d", // 71
"e", // 72
"f", // 73
"g", // 74
"h", // 75
"i", // 76
"j", // 77
"k", // 78
"l", // 79
"m", // 80
"n", // 81
"o", // 82
"p", // 83
"q", // 84
"r", // 85
"s", // 86
"t", // 87
"u", // 88
"v", // 89
"w", // 90
"x", // 91
"y", // 92
"z", // 93
"braceleft", // 94
"bar", // 95
"braceright", // 96
"asciitilde", // 97
"Adieresis", // 98
"Aring", // 99
"Ccedilla", // 100
"Eacute", // 101
"Ntilde", // 102
"Odieresis", // 103
"Udieresis", // 104
"aacute", // 105
"agrave", // 106
"acircumflex", // 107
"adieresis", // 108
"atilde", // 109
"aring", // 110
"ccedilla", // 111
"eacute", // 112
"egrave", // 113
"ecircumflex", // 114
"edieresis", // 115
"iacute", // 116
"igrave", // 117
"icircumflex", // 118
"idieresis", // 119
"ntilde", // 120
"oacute", // 121
"ograve", // 122
"ocircumflex", // 123
"odieresis", // 124
"otilde", // 125
"uacute", // 126
"ugrave", // 127
"ucircumflex", // 128
"udieresis", // 129
"dagger", // 130
"degree", // 131
"cent", // 132
"sterling", // 133
"section", // 134
"bullet", // 135
"paragraph", // 136
"germandbls", // 137
"registered", // 138
"copyright", // 139
"trademark", // 140
"acute", // 141
"dieresis", // 142
"notequal", // 143
"AE", // 144
"Oslash", // 145
"infinity", // 146
"plusminus", // 147
"lessequal", // 148
"greaterequal", // 149
"yen", // 150
"mu", // 151
"partialdiff", // 152
"summation", // 153
"product", // 154
"pi", // 155
"integral'", // 156
"ordfeminine", // 157
"ordmasculine", // 158
"Omega", // 159
"ae", // 160
"oslash", // 161
"questiondown", // 162
"exclamdown", // 163
"logicalnot", // 164
"radical", // 165
"florin", // 166
"approxequal", // 167
"increment", // 168
"guillemotleft",// 169
"guillemotright",//170
"ellipsis", // 171
"nbspace", // 172
"Agrave", // 173
"Atilde", // 174
"Otilde", // 175
"OE", // 176
"oe", // 177
"endash", // 178
"emdash", // 179
"quotedblleft", // 180
"quotedblright",// 181
"quoteleft", // 182
"quoteright", // 183
"divide", // 184
"lozenge", // 185
"ydieresis", // 186
"Ydieresis", // 187
"fraction", // 188
"currency", // 189
"guilsinglleft",// 190
"guilsinglright",//191
"fi", // 192
"fl", // 193
"daggerdbl", // 194
"middot", // 195
"quotesinglbase",//196
"quotedblbase", // 197
"perthousand", // 198
"Acircumflex", // 199
"Ecircumflex", // 200
"Aacute", // 201
"Edieresis", // 202
"Egrave", // 203
"Iacute", // 204
"Icircumflex", // 205
"Idieresis", // 206
"Igrave", // 207
"Oacute", // 208
"Ocircumflex", // 209
"", // 210
"Ograve", // 211
"Uacute", // 212
"Ucircumflex", // 213
"Ugrave", // 214
"dotlessi", // 215
"circumflex", // 216
"tilde", // 217
"overscore", // 218
"breve", // 219
"dotaccent", // 220
"ring", // 221
"cedilla", // 222
"hungarumlaut", // 223
"ogonek", // 224
"caron", // 225
"Lslash", // 226
"lslash", // 227
"Scaron", // 228
"scaron", // 229
"Zcaron", // 230
"zcaron", // 231
"brokenbar", // 232
"Eth", // 233
"eth", // 234
"Yacute", // 235
"yacute", // 236
"Thorn", // 237
"thorn", // 238
"minus", // 239
"multiply", // 240
"onesuperior", // 241
"twosuperior", // 242
"threesuperior",// 243
"onehalf", // 244
"onequarter", // 245
"threequarters",// 246
"franc", // 247
"Gbreve", // 248
"gbreve", // 249
"Idot", // 250
"Scedilla", // 251
"scedilla", // 252
"Cacute", // 253
"cacute", // 254
"Ccaron", // 255
"ccaron", // 256
"" // 257
};
private final DirectoryEntry de;
private final int version;
private final int italicAngle;
private final short underlinePosition;
private final short underlineThickness;
private final int isFixedPitch;
private final int minMemType42;
private final int maxMemType42;
private final int minMemType1;
private final int maxMemType1;
// v2
private int numGlyphs;
private int[] glyphNameIndex;
private String[] psGlyphName;
/** Creates new PostTable */
protected PostTable(final DirectoryEntry de, final DataInput di) throws IOException {
this.de = (DirectoryEntry) de.clone();
version = di.readInt();
italicAngle = di.readInt();
underlinePosition = di.readShort();
underlineThickness = di.readShort();
isFixedPitch = di.readInt();
minMemType42 = di.readInt();
maxMemType42 = di.readInt();
minMemType1 = di.readInt();
maxMemType1 = di.readInt();
if (version == 0x00020000) {
numGlyphs = di.readUnsignedShort();
glyphNameIndex = new int[numGlyphs];
for (int i = 0; i < numGlyphs; i++) {
glyphNameIndex[i] = di.readUnsignedShort();
}
int h = highestGlyphNameIndex();
if (h > 257) {
h -= 257;
psGlyphName = new String[h];
for (int i = 0; i < h; i++) {
final int len = di.readUnsignedByte();
final byte[] buf = new byte[len];
di.readFully(buf);
psGlyphName[i] = new String(buf);
}
}
// } else if (version == 0x00025000) {
// } else if (version == 0x00030000) {
}
}
public int getVersion() {
return version;
}
private int highestGlyphNameIndex() {
int high = 0;
for (int i = 0; i < numGlyphs; i++) {
if (high < glyphNameIndex[i]) {
high = glyphNameIndex[i];
}
}
return high;
}
public String getGlyphName(final int i) {
if (version == 0x00020000) {
return (glyphNameIndex[i] > 257)
? psGlyphName[glyphNameIndex[i] - 258]
: macGlyphName[glyphNameIndex[i]];
} else {
return null;
}
}
private boolean isMacGlyphName(final int i) {
if (version == 0x00020000) {
return glyphNameIndex[i] <= 257;
} else {
return false;
}
}
/** Get the table type, as a table directory value.
* @return The table type
*/
@Override
public int getType() {
return post;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("'post' Table - PostScript Metrics\n---------------------------------\n")
.append("\n 'post' version: ").append(Fixed.floatValue(version))
.append("\n italicAngle: ").append(Fixed.floatValue(italicAngle))
.append("\n underlinePosition: ").append(underlinePosition)
.append("\n underlineThickness: ").append(underlineThickness)
.append("\n isFixedPitch: ").append(isFixedPitch)
.append("\n minMemType42: ").append(minMemType42)
.append("\n maxMemType42: ").append(maxMemType42)
.append("\n minMemType1: ").append(minMemType1)
.append("\n maxMemType1: ").append(maxMemType1);
if (version == 0x00020000) {
sb.append("\n\n Format 2.0: Non-Standard (for PostScript) TrueType Glyph Set.\n");
sb.append(" numGlyphs: ").append(numGlyphs).append("\n");
for (int i = 0; i < numGlyphs; i++) {
sb.append(" Glyf ").append(i).append(" -> ");
if (isMacGlyphName(i)) {
sb.append("Mac Glyph # ").append(glyphNameIndex[i])
.append(", '").append(macGlyphName[glyphNameIndex[i]]).append("'\n");
} else {
sb.append("PSGlyf Name # ").append(glyphNameIndex[i] - 257)
.append(", name= '").append(psGlyphName[glyphNameIndex[i] - 258]).append("'\n");
}
}
sb.append("\n Full List of PSGlyf Names\n ------------------------\n");
for (int i = 0; i < psGlyphName.length; i++) {
sb.append(" PSGlyf Name # ").append(i + 1)
.append(": ").append(psGlyphName[i])
.append("\n");
}
}
return sb.toString();
}
/**
* Get a directory entry for this table. This uniquely identifies the
* table in collections where there may be more than one instance of a
* particular table.
* @return A directory entry
*/
@Override
public DirectoryEntry getDirectoryEntry() {
return de;
}
}