< prev index next >
src/java.desktop/share/classes/sun/font/TrueTypeFont.java
Print this page
@@ -97,10 +97,14 @@
public static final int v1ttTag = 0x00010000; // 'v1tt' - Version 1 TT font
public static final int trueTag = 0x74727565; // 'true' - Version 2 TT font
public static final int ottoTag = 0x4f54544f; // 'otto' - OpenType font
/* -- ID's used in the 'name' table */
+ public static final int MAC_PLATFORM_ID = 1;
+ public static final int MACROMAN_SPECIFIC_ID = 0;
+ public static final int MACROMAN_ENGLISH_LANG = 0;
+
public static final int MS_PLATFORM_ID = 3;
/* MS locale id for US English is the "default" */
public static final short ENGLISH_LOCALE_ID = 0x0409; // 1033 decimal
public static final int FAMILY_NAME_ID = 1;
// public static final int STYLE_WEIGHT_ID = 2; // currently unused.
@@ -1106,11 +1110,16 @@
metrics[offset+2] = ulPos * pointSize;
metrics[offset+3] = ulSize * pointSize;
}
- private String makeString(byte[] bytes, int len, short encoding) {
+ private String makeString(byte[] bytes, int len,
+ short platformID, short encoding) {
+
+ if (platformID == MAC_PLATFORM_ID) {
+ encoding = -1; // hack so we can re-use the code below.
+ }
/* Check for fonts using encodings 2->6 is just for
* some old DBCS fonts, apparently mostly on Solaris.
* Some of these fonts encode ascii names as double-byte characters.
* ie with a leading zero byte for what properly should be a
@@ -1128,10 +1137,11 @@
}
}
String charset;
switch (encoding) {
+ case -1: charset = "US-ASCII";break;
case 1: charset = "UTF-16"; break; // most common case first.
case 0: charset = "UTF-16"; break; // symbol uses this
case 2: charset = "SJIS"; break;
case 3: charset = "GBK"; break;
case 4: charset = "MS950"; break;
@@ -1173,20 +1183,29 @@
languageCompatibleLCIDs =
getLanguageCompatibleLCIDsFromLocale(nameLocale);
for (int i=0; i<numRecords; i++) {
short platformID = sbuffer.get();
- if (platformID != MS_PLATFORM_ID) {
+ if (platformID != MS_PLATFORM_ID &&
+ platformID != MAC_PLATFORM_ID) {
sbuffer.position(sbuffer.position()+5);
continue; // skip over this record.
}
short encodingID = sbuffer.get();
short langID = sbuffer.get();
short nameID = sbuffer.get();
int nameLen = ((int) sbuffer.get()) & 0xffff;
int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr;
String tmpName = null;
+
+ // only want MacRoman encoding and English name on Mac.
+ if ((platformID == MAC_PLATFORM_ID) &&
+ (encodingID != MACROMAN_SPECIFIC_ID ||
+ langID != MACROMAN_ENGLISH_LANG)) {
+ continue;
+ }
+
switch (nameID) {
case FAMILY_NAME_ID:
boolean compatible = false;
if (familyName == null || langID == ENGLISH_LOCALE_ID ||
@@ -1194,11 +1213,11 @@
(localeFamilyName == null &&
(compatible = isLanguageCompatible(langID))))
{
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
- tmpName = makeString(name, nameLen, encodingID);
+ tmpName = makeString(name, nameLen, platformID, encodingID);
if (familyName == null || langID == ENGLISH_LOCALE_ID){
familyName = tmpName;
}
if (langID == nameLocaleID ||
(localeFamilyName == null && compatible))
@@ -1227,11 +1246,11 @@
(localeFullName == null &&
(compatible = isLanguageCompatible(langID))))
{
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
- tmpName = makeString(name, nameLen, encodingID);
+ tmpName = makeString(name, nameLen, platformID, encodingID);
if (fullName == null || langID == ENGLISH_LOCALE_ID) {
fullName = tmpName;
}
if (langID == nameLocaleID ||
@@ -1288,11 +1307,11 @@
if (nameID == findNameID &&
((foundName == null && langID == ENGLISH_LOCALE_ID)
|| langID == findLocaleID)) {
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
- foundName = makeString(name, nameLen, encodingID);
+ foundName = makeString(name, nameLen, platformID, encodingID);
if (langID == findLocaleID) {
return foundName;
}
}
}
@@ -1625,11 +1644,11 @@
int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr;
if (nameID == requestedID) {
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
- names.add(makeString(name, nameLen, encodingID));
+ names.add(makeString(name, nameLen, platformID, encodingID));
}
}
}
}
< prev index next >