jdk/src/java.desktop/share/classes/sun/font/TrueTypeFont.java
changeset 43310 0746906c86f6
parent 35667 ed476aba94de
equal deleted inserted replaced
43309:5df4efb223bd 43310:0746906c86f6
    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