提交 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 {
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")) {
......
......@@ -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:
......
......@@ -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.
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册