97 public static final int v1ttTag = 0x00010000; // 'v1tt' - Version 1 TT font |
97 public static final int v1ttTag = 0x00010000; // 'v1tt' - Version 1 TT font |
98 public static final int trueTag = 0x74727565; // 'true' - Version 2 TT font |
98 public static final int trueTag = 0x74727565; // 'true' - Version 2 TT font |
99 public static final int ottoTag = 0x4f54544f; // 'otto' - OpenType font |
99 public static final int ottoTag = 0x4f54544f; // 'otto' - OpenType font |
100 |
100 |
101 /* -- ID's used in the 'name' table */ |
101 /* -- ID's used in the 'name' table */ |
|
102 public static final int MAC_PLATFORM_ID = 1; |
|
103 public static final int MACROMAN_SPECIFIC_ID = 0; |
|
104 public static final int MACROMAN_ENGLISH_LANG = 0; |
|
105 |
102 public static final int MS_PLATFORM_ID = 3; |
106 public static final int MS_PLATFORM_ID = 3; |
103 /* MS locale id for US English is the "default" */ |
107 /* MS locale id for US English is the "default" */ |
104 public static final short ENGLISH_LOCALE_ID = 0x0409; // 1033 decimal |
108 public static final short ENGLISH_LOCALE_ID = 0x0409; // 1033 decimal |
105 public static final int FAMILY_NAME_ID = 1; |
109 public static final int FAMILY_NAME_ID = 1; |
106 // public static final int STYLE_WEIGHT_ID = 2; // currently unused. |
110 // public static final int STYLE_WEIGHT_ID = 2; // currently unused. |
1106 |
1110 |
1107 metrics[offset+2] = ulPos * pointSize; |
1111 metrics[offset+2] = ulPos * pointSize; |
1108 metrics[offset+3] = ulSize * pointSize; |
1112 metrics[offset+3] = ulSize * pointSize; |
1109 } |
1113 } |
1110 |
1114 |
1111 private String makeString(byte[] bytes, int len, short encoding) { |
1115 private String makeString(byte[] bytes, int len, |
|
1116 short platformID, short encoding) { |
|
1117 |
|
1118 if (platformID == MAC_PLATFORM_ID) { |
|
1119 encoding = -1; // hack so we can re-use the code below. |
|
1120 } |
1112 |
1121 |
1113 /* Check for fonts using encodings 2->6 is just for |
1122 /* Check for fonts using encodings 2->6 is just for |
1114 * some old DBCS fonts, apparently mostly on Solaris. |
1123 * some old DBCS fonts, apparently mostly on Solaris. |
1115 * Some of these fonts encode ascii names as double-byte characters. |
1124 * Some of these fonts encode ascii names as double-byte characters. |
1116 * ie with a leading zero byte for what properly should be a |
1125 * ie with a leading zero byte for what properly should be a |
1128 } |
1137 } |
1129 } |
1138 } |
1130 |
1139 |
1131 String charset; |
1140 String charset; |
1132 switch (encoding) { |
1141 switch (encoding) { |
|
1142 case -1: charset = "US-ASCII";break; |
1133 case 1: charset = "UTF-16"; break; // most common case first. |
1143 case 1: charset = "UTF-16"; break; // most common case first. |
1134 case 0: charset = "UTF-16"; break; // symbol uses this |
1144 case 0: charset = "UTF-16"; break; // symbol uses this |
1135 case 2: charset = "SJIS"; break; |
1145 case 2: charset = "SJIS"; break; |
1136 case 3: charset = "GBK"; break; |
1146 case 3: charset = "GBK"; break; |
1137 case 4: charset = "MS950"; break; |
1147 case 4: charset = "MS950"; break; |
1173 languageCompatibleLCIDs = |
1183 languageCompatibleLCIDs = |
1174 getLanguageCompatibleLCIDsFromLocale(nameLocale); |
1184 getLanguageCompatibleLCIDsFromLocale(nameLocale); |
1175 |
1185 |
1176 for (int i=0; i<numRecords; i++) { |
1186 for (int i=0; i<numRecords; i++) { |
1177 short platformID = sbuffer.get(); |
1187 short platformID = sbuffer.get(); |
1178 if (platformID != MS_PLATFORM_ID) { |
1188 if (platformID != MS_PLATFORM_ID && |
|
1189 platformID != MAC_PLATFORM_ID) { |
1179 sbuffer.position(sbuffer.position()+5); |
1190 sbuffer.position(sbuffer.position()+5); |
1180 continue; // skip over this record. |
1191 continue; // skip over this record. |
1181 } |
1192 } |
1182 short encodingID = sbuffer.get(); |
1193 short encodingID = sbuffer.get(); |
1183 short langID = sbuffer.get(); |
1194 short langID = sbuffer.get(); |
1184 short nameID = sbuffer.get(); |
1195 short nameID = sbuffer.get(); |
1185 int nameLen = ((int) sbuffer.get()) & 0xffff; |
1196 int nameLen = ((int) sbuffer.get()) & 0xffff; |
1186 int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr; |
1197 int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr; |
1187 String tmpName = null; |
1198 String tmpName = null; |
|
1199 |
|
1200 // only want MacRoman encoding and English name on Mac. |
|
1201 if ((platformID == MAC_PLATFORM_ID) && |
|
1202 (encodingID != MACROMAN_SPECIFIC_ID || |
|
1203 langID != MACROMAN_ENGLISH_LANG)) { |
|
1204 continue; |
|
1205 } |
|
1206 |
1188 switch (nameID) { |
1207 switch (nameID) { |
1189 |
1208 |
1190 case FAMILY_NAME_ID: |
1209 case FAMILY_NAME_ID: |
1191 boolean compatible = false; |
1210 boolean compatible = false; |
1192 if (familyName == null || langID == ENGLISH_LOCALE_ID || |
1211 if (familyName == null || langID == ENGLISH_LOCALE_ID || |
1194 (localeFamilyName == null && |
1213 (localeFamilyName == null && |
1195 (compatible = isLanguageCompatible(langID)))) |
1214 (compatible = isLanguageCompatible(langID)))) |
1196 { |
1215 { |
1197 buffer.position(namePtr); |
1216 buffer.position(namePtr); |
1198 buffer.get(name, 0, nameLen); |
1217 buffer.get(name, 0, nameLen); |
1199 tmpName = makeString(name, nameLen, encodingID); |
1218 tmpName = makeString(name, nameLen, platformID, encodingID); |
1200 if (familyName == null || langID == ENGLISH_LOCALE_ID){ |
1219 if (familyName == null || langID == ENGLISH_LOCALE_ID){ |
1201 familyName = tmpName; |
1220 familyName = tmpName; |
1202 } |
1221 } |
1203 if (langID == nameLocaleID || |
1222 if (langID == nameLocaleID || |
1204 (localeFamilyName == null && compatible)) |
1223 (localeFamilyName == null && compatible)) |
1227 (localeFullName == null && |
1246 (localeFullName == null && |
1228 (compatible = isLanguageCompatible(langID)))) |
1247 (compatible = isLanguageCompatible(langID)))) |
1229 { |
1248 { |
1230 buffer.position(namePtr); |
1249 buffer.position(namePtr); |
1231 buffer.get(name, 0, nameLen); |
1250 buffer.get(name, 0, nameLen); |
1232 tmpName = makeString(name, nameLen, encodingID); |
1251 tmpName = makeString(name, nameLen, platformID, encodingID); |
1233 |
1252 |
1234 if (fullName == null || langID == ENGLISH_LOCALE_ID) { |
1253 if (fullName == null || langID == ENGLISH_LOCALE_ID) { |
1235 fullName = tmpName; |
1254 fullName = tmpName; |
1236 } |
1255 } |
1237 if (langID == nameLocaleID || |
1256 if (langID == nameLocaleID || |
1288 if (nameID == findNameID && |
1307 if (nameID == findNameID && |
1289 ((foundName == null && langID == ENGLISH_LOCALE_ID) |
1308 ((foundName == null && langID == ENGLISH_LOCALE_ID) |
1290 || langID == findLocaleID)) { |
1309 || langID == findLocaleID)) { |
1291 buffer.position(namePtr); |
1310 buffer.position(namePtr); |
1292 buffer.get(name, 0, nameLen); |
1311 buffer.get(name, 0, nameLen); |
1293 foundName = makeString(name, nameLen, encodingID); |
1312 foundName = makeString(name, nameLen, platformID, encodingID); |
1294 if (langID == findLocaleID) { |
1313 if (langID == findLocaleID) { |
1295 return foundName; |
1314 return foundName; |
1296 } |
1315 } |
1297 } |
1316 } |
1298 } |
1317 } |
1625 int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr; |
1644 int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr; |
1626 |
1645 |
1627 if (nameID == requestedID) { |
1646 if (nameID == requestedID) { |
1628 buffer.position(namePtr); |
1647 buffer.position(namePtr); |
1629 buffer.get(name, 0, nameLen); |
1648 buffer.get(name, 0, nameLen); |
1630 names.add(makeString(name, nameLen, encodingID)); |
1649 names.add(makeString(name, nameLen, platformID, encodingID)); |
1631 } |
1650 } |
1632 } |
1651 } |
1633 } |
1652 } |
1634 } |
1653 } |
1635 |
1654 |