diff --git a/src/share/classes/sun/font/FontManager.java b/src/share/classes/sun/font/FontManager.java index a9a7257e42a02cf4d5e5a6ec9c6ee8978052c7e9..8a0ee3fdd8da9a486f6e6ac06210e0981a1a14f1 100644 --- a/src/share/classes/sun/font/FontManager.java +++ b/src/share/classes/sun/font/FontManager.java @@ -3344,7 +3344,7 @@ public final class FontManager { int fontFormat = FONTFORMAT_NONE; int fontRank = Font2D.UNKNOWN_RANK; - if (ext.equals(".ttf") || isTTC) { + if (ext.equals(".ttf") || ext.equals(".otf") || isTTC) { fontFormat = FONTFORMAT_TRUETYPE; fontRank = Font2D.TTF_RANK; } else if (ext.equals(".pfa") || ext.equals(".pfb")) { diff --git a/src/share/classes/sun/font/TrueTypeFont.java b/src/share/classes/sun/font/TrueTypeFont.java index 8a8309efab4aad5aa50b83819fb7bab690056527..0edd04162a57172de6c2667508a26df8d8234678 100644 --- a/src/share/classes/sun/font/TrueTypeFont.java +++ b/src/share/classes/sun/font/TrueTypeFont.java @@ -90,6 +90,7 @@ public class TrueTypeFont extends FileFont { public static final int ttcfTag = 0x74746366; // 'ttcf' - TTC file 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 MS_PLATFORM_ID = 3; @@ -490,6 +491,7 @@ public class TrueTypeFont extends FileFont { case v1ttTag: case trueTag: + case ottoTag: break; default: diff --git a/src/share/classes/sun/java2d/SunGraphicsEnvironment.java b/src/share/classes/sun/java2d/SunGraphicsEnvironment.java index e0e03d36a2a6e43c91aee4c9da9128e24a076c7b..95b79e6e27311fe4fbf7ea68b683c4034b48c8e4 100644 --- a/src/share/classes/sun/java2d/SunGraphicsEnvironment.java +++ b/src/share/classes/sun/java2d/SunGraphicsEnvironment.java @@ -812,7 +812,9 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment return(name.startsWith(".ttf", offset) || name.startsWith(".TTF", offset) || name.startsWith(".ttc", offset) || - name.startsWith(".TTC", offset)); + name.startsWith(".TTC", offset) || + name.startsWith(".otf", offset) || + name.startsWith(".OTF", offset)); } } } @@ -835,31 +837,11 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment } } - public static class TTorT1Filter implements FilenameFilter { - public boolean accept(File dir, String name) { - - /* all conveniently have the same suffix length */ - int offset = name.length()-4; - if (offset <= 0) { /* must be at least A.ttf or A.pfa */ - return false; - } else { - boolean isTT = - name.startsWith(".ttf", offset) || - name.startsWith(".TTF", offset) || - name.startsWith(".ttc", offset) || - name.startsWith(".TTC", offset); - if (isTT) { - return true; - } else if (noType1Font) { - return false; - } else { - return(name.startsWith(".pfa", offset) || - name.startsWith(".pfb", offset) || - name.startsWith(".PFA", offset) || - name.startsWith(".PFB", offset)); - } - } - } + public static class TTorT1Filter implements FilenameFilter { + public boolean accept(File dir, String name) { + return SunGraphicsEnvironment.ttFilter.accept(dir, name) || + SunGraphicsEnvironment.t1Filter.accept(dir, name); + } } /* No need to keep consing up new instances - reuse a singleton. diff --git a/src/windows/native/sun/font/fontpath.c b/src/windows/native/sun/font/fontpath.c index 71b1da85f17ae2fbd750f43af172c2d6f2f35479..2fd3c3af9bec135a907a96c218e306c0aed1ddcf 100644 --- a/src/windows/native/sun/font/fontpath.c +++ b/src/windows/native/sun/font/fontpath.c @@ -153,7 +153,8 @@ static int CALLBACK EnumFontFacesInFamilyProcA( JNIEnv *env = fmi->env; jstring fullname, fullnameLC; - if (FontType != TRUETYPE_FONTTYPE) { + /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ + if (FontType != TRUETYPE_FONTTYPE && FontType != DEVICE_FONTTYPE) { return 1; } @@ -227,7 +228,8 @@ static int CALLBACK EnumFontFacesInFamilyProcW( JNIEnv *env = fmi->env; jstring fullname, fullnameLC; - if (FontType != TRUETYPE_FONTTYPE) { + /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ + if (FontType != TRUETYPE_FONTTYPE && FontType != DEVICE_FONTTYPE) { return 1; } @@ -274,7 +276,8 @@ static int CALLBACK EnumFamilyNamesA( jstring familyLC; LOGFONTA lfa; - if (FontType != TRUETYPE_FONTTYPE) { + /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ + if (FontType != TRUETYPE_FONTTYPE && FontType != DEVICE_FONTTYPE) { return 1; } @@ -323,7 +326,8 @@ static int CALLBACK EnumFamilyNamesW( int slen; LOGFONTW lfw; - if (FontType != TRUETYPE_FONTTYPE) { + /* Both Vista and XP return DEVICE_FONTTYPE for OTF fonts */ + if (FontType != TRUETYPE_FONTTYPE && FontType != DEVICE_FONTTYPE) { return 1; } /* wprintf(L"FAMILY=%s charset=%d FULL=%s\n", */ @@ -383,15 +387,16 @@ static int CALLBACK EnumFamilyNamesW( * Also if a Font has a name for this locale that name also * exists in the registry using the appropriate platform encoding. * What do we do then? + * + * Note: OpenType fonts seems to have " (TrueType)" suffix on Vista + * but " (OpenType)" on XP. */ -/* static const wchar_t W_TTSUFFIX[] = L" (TrueType)"; */ -/* static const char C_TTSUFFIX[] = " (TrueType)"; */ -/* static int TTSLEN = 11; hard-coded - be careful */ -static BOOL RegistryToBaseTTNameA(LPCSTR name) { +static BOOL RegistryToBaseTTNameA(LPSTR name) { static const char TTSUFFIX[] = " (TrueType)"; + static const char OTSUFFIX[] = " (OpenType)"; int TTSLEN = strlen(TTSUFFIX); - char *match; + char *suffix; int len = strlen(name); if (len == 0) { @@ -403,19 +408,21 @@ static BOOL RegistryToBaseTTNameA(LPCSTR name) { if (len <= TTSLEN) { return FALSE; } - match = strstr(name, TTSUFFIX); - if ((match != NULL) && (match == name+(len-TTSLEN))) { - match[0] = '\0'; /* truncate name */ + + /* suffix length is the same for truetype and opentype fonts */ + suffix = name + len - TTSLEN; + if (strcmp(suffix, TTSUFFIX) == 0 || strcmp(suffix, OTSUFFIX) == 0) { + suffix[0] = '\0'; /* truncate name */ return TRUE; - } else { - return FALSE; } + return FALSE; } static BOOL RegistryToBaseTTNameW(LPWSTR name) { static const wchar_t TTSUFFIX[] = L" (TrueType)"; + static const wchar_t OTSUFFIX[] = L" (OpenType)"; int TTSLEN = wcslen(TTSUFFIX); - wchar_t *match; + wchar_t *suffix; int len = wcslen(name); if (len == 0) { @@ -427,13 +434,13 @@ static BOOL RegistryToBaseTTNameW(LPWSTR name) { if (len <= TTSLEN) { return FALSE; } - match = wcsstr(name, TTSUFFIX); - if ((match != NULL) && (match == name+(len-TTSLEN))) { - match[0] = L'\0'; /* truncate name */ + /* suffix length is the same for truetype and opentype fonts */ + suffix = name + (len - TTSLEN); + if (wcscmp(suffix, TTSUFFIX) == 0 || wcscmp(suffix, OTSUFFIX) == 0) { + suffix[0] = L'\0'; /* truncate name */ return TRUE; - } else { - return FALSE; } + return FALSE; } static void registerFontA(GdiFontMapInfo *fmi, jobject fontToFileMap, @@ -675,18 +682,19 @@ Java_sun_font_FontManager_populateFontFileNameMap } if (IS_NT) { if (!RegistryToBaseTTNameW((LPWSTR)wname) ) { - /* If the filename ends with ".ttf" also accept it. + /* If the filename ends with ".ttf" or ".otf" also accept it. * Not expecting to need to do this for .ttc files. * Also note this code is not mirrored in the "A" (win9x) path. */ LPWSTR dot = wcsrchr((LPWSTR)data, L'.'); - if (dot == NULL || (wcsicmp(dot, L".ttf") != 0)) { + if (dot == NULL || ((wcsicmp(dot, L".ttf") != 0) + && (wcsicmp(dot, L".otf") != 0))) { continue; /* not a TT font... */ } } registerFontW(&fmi, fontToFileMap, (LPWSTR)wname, (LPWSTR)data); } else { - if (!RegistryToBaseTTNameA(cname) ) { + if (!RegistryToBaseTTNameA((LPSTR)cname)) { continue; /* not a TT font... */ } registerFontA(&fmi, fontToFileMap, cname, (LPCSTR)data);