8146035: Windows - With LCD antialiasing, some glyphs are not rendered correctly
authoraivanov
Thu, 14 Apr 2016 13:07:35 +0300
changeset 37687 bf6516a24734
parent 37686 1ad88c2dfacd
child 37688 e5cd9e00a669
8146035: Windows - With LCD antialiasing, some glyphs are not rendered correctly Reviewed-by: serb, prr Contributed-by: Dmitry Batrak <dmitry.batrak@jetbrains.com>
jdk/src/java.desktop/windows/native/libfontmanager/lcdglyph.c
--- 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);
 }