提交 1e6412b1 编写于 作者: I igor

4356282: RFE: T2K should be used to rasterize CID/CFF fonts

Reviewed-by: bae, prr
上级 6c7a0295
...@@ -3344,7 +3344,7 @@ public final class FontManager { ...@@ -3344,7 +3344,7 @@ public final class FontManager {
int fontFormat = FONTFORMAT_NONE; int fontFormat = FONTFORMAT_NONE;
int fontRank = Font2D.UNKNOWN_RANK; int fontRank = Font2D.UNKNOWN_RANK;
if (ext.equals(".ttf") || isTTC) { if (ext.equals(".ttf") || ext.equals(".otf") || isTTC) {
fontFormat = FONTFORMAT_TRUETYPE; fontFormat = FONTFORMAT_TRUETYPE;
fontRank = Font2D.TTF_RANK; fontRank = Font2D.TTF_RANK;
} else if (ext.equals(".pfa") || ext.equals(".pfb")) { } else if (ext.equals(".pfa") || ext.equals(".pfb")) {
......
...@@ -90,6 +90,7 @@ public class TrueTypeFont extends FileFont { ...@@ -90,6 +90,7 @@ public class TrueTypeFont extends FileFont {
public static final int ttcfTag = 0x74746366; // 'ttcf' - TTC file public static final int ttcfTag = 0x74746366; // 'ttcf' - TTC file
public static final int v1ttTag = 0x00010000; // 'v1tt' - Version 1 TT font 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 trueTag = 0x74727565; // 'true' - Version 2 TT font
public static final int ottoTag = 0x4f54544f; // 'otto' - OpenType font
/* -- ID's used in the 'name' table */ /* -- ID's used in the 'name' table */
public static final int MS_PLATFORM_ID = 3; public static final int MS_PLATFORM_ID = 3;
...@@ -490,6 +491,7 @@ public class TrueTypeFont extends FileFont { ...@@ -490,6 +491,7 @@ public class TrueTypeFont extends FileFont {
case v1ttTag: case v1ttTag:
case trueTag: case trueTag:
case ottoTag:
break; break;
default: default:
......
...@@ -812,7 +812,9 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment ...@@ -812,7 +812,9 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
return(name.startsWith(".ttf", offset) || return(name.startsWith(".ttf", offset) ||
name.startsWith(".TTF", offset) || name.startsWith(".TTF", offset) ||
name.startsWith(".ttc", 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 ...@@ -835,31 +837,11 @@ public abstract class SunGraphicsEnvironment extends GraphicsEnvironment
} }
} }
public static class TTorT1Filter implements FilenameFilter { public static class TTorT1Filter implements FilenameFilter {
public boolean accept(File dir, String name) { public boolean accept(File dir, String name) {
return SunGraphicsEnvironment.ttFilter.accept(dir, name) ||
/* all conveniently have the same suffix length */ SunGraphicsEnvironment.t1Filter.accept(dir, name);
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));
}
}
}
} }
/* No need to keep consing up new instances - reuse a singleton. /* No need to keep consing up new instances - reuse a singleton.
......
...@@ -153,7 +153,8 @@ static int CALLBACK EnumFontFacesInFamilyProcA( ...@@ -153,7 +153,8 @@ static int CALLBACK EnumFontFacesInFamilyProcA(
JNIEnv *env = fmi->env; JNIEnv *env = fmi->env;
jstring fullname, fullnameLC; 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; return 1;
} }
...@@ -227,7 +228,8 @@ static int CALLBACK EnumFontFacesInFamilyProcW( ...@@ -227,7 +228,8 @@ static int CALLBACK EnumFontFacesInFamilyProcW(
JNIEnv *env = fmi->env; JNIEnv *env = fmi->env;
jstring fullname, fullnameLC; 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; return 1;
} }
...@@ -274,7 +276,8 @@ static int CALLBACK EnumFamilyNamesA( ...@@ -274,7 +276,8 @@ static int CALLBACK EnumFamilyNamesA(
jstring familyLC; jstring familyLC;
LOGFONTA lfa; 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; return 1;
} }
...@@ -323,7 +326,8 @@ static int CALLBACK EnumFamilyNamesW( ...@@ -323,7 +326,8 @@ static int CALLBACK EnumFamilyNamesW(
int slen; int slen;
LOGFONTW lfw; 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; return 1;
} }
/* wprintf(L"FAMILY=%s charset=%d FULL=%s\n", */ /* wprintf(L"FAMILY=%s charset=%d FULL=%s\n", */
...@@ -383,15 +387,16 @@ static int CALLBACK EnumFamilyNamesW( ...@@ -383,15 +387,16 @@ static int CALLBACK EnumFamilyNamesW(
* Also if a Font has a name for this locale that name also * Also if a Font has a name for this locale that name also
* exists in the registry using the appropriate platform encoding. * exists in the registry using the appropriate platform encoding.
* What do we do then? * 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 BOOL RegistryToBaseTTNameA(LPSTR name) {
/* static const char C_TTSUFFIX[] = " (TrueType)"; */
/* static int TTSLEN = 11; hard-coded - be careful */
static BOOL RegistryToBaseTTNameA(LPCSTR name) {
static const char TTSUFFIX[] = " (TrueType)"; static const char TTSUFFIX[] = " (TrueType)";
static const char OTSUFFIX[] = " (OpenType)";
int TTSLEN = strlen(TTSUFFIX); int TTSLEN = strlen(TTSUFFIX);
char *match; char *suffix;
int len = strlen(name); int len = strlen(name);
if (len == 0) { if (len == 0) {
...@@ -403,19 +408,21 @@ static BOOL RegistryToBaseTTNameA(LPCSTR name) { ...@@ -403,19 +408,21 @@ static BOOL RegistryToBaseTTNameA(LPCSTR name) {
if (len <= TTSLEN) { if (len <= TTSLEN) {
return FALSE; return FALSE;
} }
match = strstr(name, TTSUFFIX);
if ((match != NULL) && (match == name+(len-TTSLEN))) { /* suffix length is the same for truetype and opentype fonts */
match[0] = '\0'; /* truncate name */ suffix = name + len - TTSLEN;
if (strcmp(suffix, TTSUFFIX) == 0 || strcmp(suffix, OTSUFFIX) == 0) {
suffix[0] = '\0'; /* truncate name */
return TRUE; return TRUE;
} else {
return FALSE;
} }
return FALSE;
} }
static BOOL RegistryToBaseTTNameW(LPWSTR name) { static BOOL RegistryToBaseTTNameW(LPWSTR name) {
static const wchar_t TTSUFFIX[] = L" (TrueType)"; static const wchar_t TTSUFFIX[] = L" (TrueType)";
static const wchar_t OTSUFFIX[] = L" (OpenType)";
int TTSLEN = wcslen(TTSUFFIX); int TTSLEN = wcslen(TTSUFFIX);
wchar_t *match; wchar_t *suffix;
int len = wcslen(name); int len = wcslen(name);
if (len == 0) { if (len == 0) {
...@@ -427,13 +434,13 @@ static BOOL RegistryToBaseTTNameW(LPWSTR name) { ...@@ -427,13 +434,13 @@ static BOOL RegistryToBaseTTNameW(LPWSTR name) {
if (len <= TTSLEN) { if (len <= TTSLEN) {
return FALSE; return FALSE;
} }
match = wcsstr(name, TTSUFFIX); /* suffix length is the same for truetype and opentype fonts */
if ((match != NULL) && (match == name+(len-TTSLEN))) { suffix = name + (len - TTSLEN);
match[0] = L'\0'; /* truncate name */ if (wcscmp(suffix, TTSUFFIX) == 0 || wcscmp(suffix, OTSUFFIX) == 0) {
suffix[0] = L'\0'; /* truncate name */
return TRUE; return TRUE;
} else {
return FALSE;
} }
return FALSE;
} }
static void registerFontA(GdiFontMapInfo *fmi, jobject fontToFileMap, static void registerFontA(GdiFontMapInfo *fmi, jobject fontToFileMap,
...@@ -675,18 +682,19 @@ Java_sun_font_FontManager_populateFontFileNameMap ...@@ -675,18 +682,19 @@ Java_sun_font_FontManager_populateFontFileNameMap
} }
if (IS_NT) { if (IS_NT) {
if (!RegistryToBaseTTNameW((LPWSTR)wname) ) { 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. * Not expecting to need to do this for .ttc files.
* Also note this code is not mirrored in the "A" (win9x) path. * Also note this code is not mirrored in the "A" (win9x) path.
*/ */
LPWSTR dot = wcsrchr((LPWSTR)data, L'.'); 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... */ continue; /* not a TT font... */
} }
} }
registerFontW(&fmi, fontToFileMap, (LPWSTR)wname, (LPWSTR)data); registerFontW(&fmi, fontToFileMap, (LPWSTR)wname, (LPWSTR)data);
} else { } else {
if (!RegistryToBaseTTNameA(cname) ) { if (!RegistryToBaseTTNameA((LPSTR)cname)) {
continue; /* not a TT font... */ continue; /* not a TT font... */
} }
registerFontA(&fmi, fontToFileMap, cname, (LPCSTR)data); registerFontA(&fmi, fontToFileMap, cname, (LPCSTR)data);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册