8146035: Windows - With LCD antialiasing, some glyphs are not rendered correctly
Reviewed-by: serb, prr
Contributed-by: Dmitry Batrak <dmitry.batrak@jetbrains.com>
--- a/jdk/src/java.desktop/windows/native/libfontmanager/lcdglyph.c Wed Apr 13 17:04:02 2016 +0530
+++ b/jdk/src/java.desktop/windows/native/libfontmanager/lcdglyph.c Thu Apr 14 13:07:35 2016 +0300
@@ -157,6 +157,9 @@
if (hBitmap != 0) { \
DeleteObject(hBitmap); \
} \
+ if (tmpBitmap != 0) { \
+ DeleteObject(tmpBitmap); \
+ } \
if (dibImage != NULL) { \
free(dibImage); \
} \
@@ -196,6 +199,7 @@
int bmWidth, bmHeight;
int x, y;
HBITMAP hBitmap = NULL, hOrigBM;
+ HBITMAP tmpBitmap = NULL;
int gamma, orient;
HWND hWnd = NULL;
@@ -250,6 +254,12 @@
}
oldFont = SelectObject(hMemoryDC, hFont);
+ tmpBitmap = CreateCompatibleBitmap(hDesktopDC, 1, 1);
+ if (tmpBitmap == NULL) {
+ FREE_AND_RETURN;
+ }
+ hOrigBM = (HBITMAP)SelectObject(hMemoryDC, tmpBitmap);
+
memset(&textMetric, 0, sizeof(TEXTMETRIC));
err = GetTextMetrics(hMemoryDC, &textMetric);
if (err == 0) {
@@ -334,7 +344,7 @@
if (hBitmap == NULL) {
FREE_AND_RETURN;
}
- hOrigBM = (HBITMAP)SelectObject(hMemoryDC, hBitmap);
+ SelectObject(hMemoryDC, hBitmap);
/* Fill in black */
rect.left = 0;
@@ -478,6 +488,7 @@
ReleaseDC(hWnd, hDesktopDC);
DeleteObject(hMemoryDC);
DeleteObject(hBitmap);
+ DeleteObject(tmpBitmap);
return ptr_to_jlong(glyphInfo);
}