< 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 >