提交 c03f0ca7 编写于 作者: D dbatrak

8236996: Incorrect Roboto font rendering on Windows with subpixel antialiasing

Reviewed-by: prr, serb
上级 d2ad3716
...@@ -328,7 +328,8 @@ public class FileFontStrike extends PhysicalStrike { ...@@ -328,7 +328,8 @@ public class FileFontStrike extends PhysicalStrike {
int style, int style,
int size, int size,
int glyphCode, int glyphCode,
boolean fracMetrics); boolean fracMetrics,
int fontDataSize);
long getGlyphImageFromWindows(int glyphCode) { long getGlyphImageFromWindows(int glyphCode) {
String family = fileFont.getFamilyName(null); String family = fileFont.getFamilyName(null);
...@@ -337,7 +338,8 @@ public class FileFontStrike extends PhysicalStrike { ...@@ -337,7 +338,8 @@ public class FileFontStrike extends PhysicalStrike {
int size = intPtSize; int size = intPtSize;
long ptr = _getGlyphImageFromWindows long ptr = _getGlyphImageFromWindows
(family, style, size, glyphCode, (family, style, size, glyphCode,
desc.fmHint == INTVAL_FRACTIONALMETRICS_ON); desc.fmHint == INTVAL_FRACTIONALMETRICS_ON,
((TrueTypeFont)fileFont).fontDataSize);
if (ptr != 0) { if (ptr != 0) {
/* Get the advance from the JDK rasterizer. This is mostly /* Get the advance from the JDK rasterizer. This is mostly
* necessary for the fractional metrics case, but there are * necessary for the fractional metrics case, but there are
...@@ -351,6 +353,12 @@ public class FileFontStrike extends PhysicalStrike { ...@@ -351,6 +353,12 @@ public class FileFontStrike extends PhysicalStrike {
advance); advance);
return ptr; return ptr;
} else { } else {
if (FontUtilities.isLogging()) {
FontUtilities.getLogger().warning(
"Failed to render glyph using GDI: code=" + glyphCode
+ ", fontFamily=" + family + ", style=" + style
+ ", size=" + size);
}
return fileFont.getGlyphImage(pScalerContext, glyphCode); return fileFont.getGlyphImage(pScalerContext, glyphCode);
} }
} }
......
...@@ -172,6 +172,15 @@ public class TrueTypeFont extends FileFont { ...@@ -172,6 +172,15 @@ public class TrueTypeFont extends FileFont {
private String localeFamilyName; private String localeFamilyName;
private String localeFullName; private String localeFullName;
/*
* Used on Windows to validate the font selected by GDI for (sub-pixel
* antialiased) rendering. For 'standalone' fonts it's equal to the font
* file size, for collection (TTC, OTC) members it's the number of bytes in
* the collection file from the start of this font's offset table till the
* end of the file.
*/
int fontDataSize;
public TrueTypeFont(String platname, Object nativeNames, int fIndex, public TrueTypeFont(String platname, Object nativeNames, int fIndex,
boolean javaRasterizer) boolean javaRasterizer)
throws FontFormatException throws FontFormatException
...@@ -529,11 +538,13 @@ public class TrueTypeFont extends FileFont { ...@@ -529,11 +538,13 @@ public class TrueTypeFont extends FileFont {
fontIndex = fIndex; fontIndex = fIndex;
buffer = readBlock(TTCHEADERSIZE+4*fIndex, 4); buffer = readBlock(TTCHEADERSIZE+4*fIndex, 4);
headerOffset = buffer.getInt(); headerOffset = buffer.getInt();
fontDataSize = Math.max(0, fileSize - headerOffset);
break; break;
case v1ttTag: case v1ttTag:
case trueTag: case trueTag:
case ottoTag: case ottoTag:
fontDataSize = fileSize;
break; break;
default: default:
......
...@@ -172,7 +172,8 @@ JNIEXPORT jboolean JNICALL ...@@ -172,7 +172,8 @@ JNIEXPORT jboolean JNICALL
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_sun_font_FileFontStrike__1getGlyphImageFromWindows Java_sun_font_FileFontStrike__1getGlyphImageFromWindows
(JNIEnv *env, jobject unused, (JNIEnv *env, jobject unused,
jstring fontFamily, jint style, jint size, jint glyphCode, jboolean fm) { jstring fontFamily, jint style, jint size, jint glyphCode, jboolean fm,
jint fontDataSize) {
GLYPHMETRICS glyphMetrics; GLYPHMETRICS glyphMetrics;
LOGFONTW lf; LOGFONTW lf;
...@@ -188,6 +189,7 @@ Java_sun_font_FileFontStrike__1getGlyphImageFromWindows ...@@ -188,6 +189,7 @@ Java_sun_font_FileFontStrike__1getGlyphImageFromWindows
LPWSTR name; LPWSTR name;
HFONT oldFont, hFont; HFONT oldFont, hFont;
MAT2 mat2; MAT2 mat2;
DWORD actualFontDataSize;
unsigned short width; unsigned short width;
unsigned short height; unsigned short height;
...@@ -254,6 +256,17 @@ Java_sun_font_FileFontStrike__1getGlyphImageFromWindows ...@@ -254,6 +256,17 @@ Java_sun_font_FileFontStrike__1getGlyphImageFromWindows
} }
oldFont = SelectObject(hMemoryDC, hFont); oldFont = SelectObject(hMemoryDC, hFont);
if (fontDataSize > 0) {
// GDI doesn't allow to select a specific font file for drawing, we can
// only check that it picks the file we need by validating font size.
// If it doesn't match, we cannot proceed, as the same glyph code can
// correspond to a completely different glyph in the selected font.
actualFontDataSize = GetFontData(hMemoryDC, 0, 0, NULL, 0);
if (actualFontDataSize != fontDataSize) {
FREE_AND_RETURN;
}
}
tmpBitmap = CreateCompatibleBitmap(hDesktopDC, 1, 1); tmpBitmap = CreateCompatibleBitmap(hDesktopDC, 1, 1);
if (tmpBitmap == NULL) { if (tmpBitmap == NULL) {
FREE_AND_RETURN; FREE_AND_RETURN;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册