< prev index next >
src/java.desktop/share/classes/sun/font/TrueTypeFont.java
Print this page
*** 97,106 ****
--- 97,110 ----
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,1116 ****
metrics[offset+2] = ulPos * pointSize;
metrics[offset+3] = ulSize * pointSize;
}
! private String makeString(byte[] bytes, int len, short encoding) {
/* 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
--- 1110,1125 ----
metrics[offset+2] = ulPos * pointSize;
metrics[offset+3] = ulSize * pointSize;
}
! 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,1137 ****
--- 1137,1147 ----
}
}
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,1192 ****
languageCompatibleLCIDs =
getLanguageCompatibleLCIDsFromLocale(nameLocale);
for (int i=0; i<numRecords; i++) {
short platformID = sbuffer.get();
! if (platformID != MS_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;
switch (nameID) {
case FAMILY_NAME_ID:
boolean compatible = false;
if (familyName == null || langID == ENGLISH_LOCALE_ID ||
--- 1183,1211 ----
languageCompatibleLCIDs =
getLanguageCompatibleLCIDsFromLocale(nameLocale);
for (int i=0; i<numRecords; i++) {
short platformID = sbuffer.get();
! 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,1204 ****
(localeFamilyName == null &&
(compatible = isLanguageCompatible(langID))))
{
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! tmpName = makeString(name, nameLen, encodingID);
if (familyName == null || langID == ENGLISH_LOCALE_ID){
familyName = tmpName;
}
if (langID == nameLocaleID ||
(localeFamilyName == null && compatible))
--- 1213,1223 ----
(localeFamilyName == null &&
(compatible = isLanguageCompatible(langID))))
{
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! tmpName = makeString(name, nameLen, platformID, encodingID);
if (familyName == null || langID == ENGLISH_LOCALE_ID){
familyName = tmpName;
}
if (langID == nameLocaleID ||
(localeFamilyName == null && compatible))
*** 1227,1237 ****
(localeFullName == null &&
(compatible = isLanguageCompatible(langID))))
{
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! tmpName = makeString(name, nameLen, encodingID);
if (fullName == null || langID == ENGLISH_LOCALE_ID) {
fullName = tmpName;
}
if (langID == nameLocaleID ||
--- 1246,1256 ----
(localeFullName == null &&
(compatible = isLanguageCompatible(langID))))
{
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! tmpName = makeString(name, nameLen, platformID, encodingID);
if (fullName == null || langID == ENGLISH_LOCALE_ID) {
fullName = tmpName;
}
if (langID == nameLocaleID ||
*** 1288,1298 ****
if (nameID == findNameID &&
((foundName == null && langID == ENGLISH_LOCALE_ID)
|| langID == findLocaleID)) {
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! foundName = makeString(name, nameLen, encodingID);
if (langID == findLocaleID) {
return foundName;
}
}
}
--- 1307,1317 ----
if (nameID == findNameID &&
((foundName == null && langID == ENGLISH_LOCALE_ID)
|| langID == findLocaleID)) {
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! foundName = makeString(name, nameLen, platformID, encodingID);
if (langID == findLocaleID) {
return foundName;
}
}
}
*** 1625,1635 ****
int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr;
if (nameID == requestedID) {
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! names.add(makeString(name, nameLen, encodingID));
}
}
}
}
--- 1644,1654 ----
int namePtr = (((int) sbuffer.get()) & 0xffff) + stringPtr;
if (nameID == requestedID) {
buffer.position(namePtr);
buffer.get(name, 0, nameLen);
! names.add(makeString(name, nameLen, platformID, encodingID));
}
}
}
}
< prev index next >