[OpenJDK 2D-Dev] [PATCH] JDK-8146035: Windows - With LCD antialiasing, some glyphs are not rendered correctly

Dmitry Batrak dmitry.batrak at jetbrains.com
Tue Apr 12 17:43:52 UTC 2016


Repeating the patch inline:

=== patch start ===
--- old/src/java.desktop/windows/native/libfontmanager/lcdglyph.c
2016-04-07 13:10:01.507608685 +0300
+++ new/src/java.desktop/windows/native/libfontmanager/lcdglyph.c
2016-04-07 13:10:01.391608686 +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);
 }
=== patch end ===

Thanks,
Dmitry

On Tue, Apr 12, 2016 at 8:22 PM, Phil Race <philip.race at oracle.com> wrote:

> Alexey didn't say this but he already proposed exactly this fix himself
> in a private email exchange,
>
> +1, although I am not sure we can legally pull down the patch from that
> (any) website.
> Please resubmit it as a diff in the email.
>
> Or Alexey could just push it as his own :-)
>
> -phil.
>
> On 04/07/2016 05:26 AM, Dmitry Batrak wrote:
>
>> Hello,
>>
>> I'd like to propose a fix for JDK-8146035. I am not a committer,
>> so I hope someone can sponsor this fix.
>> I work at Jetbrains, which has signed a company-level contributor
>> agreement,
>> so, from a legal perspective, I believe, there are no obstacles.
>>
>> My investigation shows that the issue is caused by incorrect determination
>> of bitmap size, prepared for glyph rendering, so only part of glyph
>> becomes visible due to cropping. This seems to happen because
>> compatible bitmap is not selected into memory device context (DC)
>> before calling GetTextMetrics. Documentation for CreateCompatibleDC call
>> (
>> https://msdn.microsoft.com/en-us/library/windows/desktop/dd183489%28v=vs.85%29.aspx)
>>
>> says compatible bitmap needs to be selected into DC before any drawing
>> operation.
>> Even though GetTextMetrics is not a drawing operation, it turns out
>> to be affected by selected bitmap's type too (by default a monochrome
>> bitmap
>> is selected in a memory DC). This behaviour was also mentioned in the
>> following
>> MSDN blog post comment:
>>
>> https://blogs.msdn.microsoft.com/oldnewthing/20060614-00/?p=30873#comment-392143
>>
>> The proposed fix is to select a temporary 1x1 compatible bitmap
>> into memory DC before GetTextMetrics call.
>> Here's webrev link - http://adm-12504.intellij.net/
>> I didn't create a test case, as it would require a specific font file
>> (I couldn't reproduce the issue for fonts bundled with Windows).
>>
>> Best regards,
>> Dmitry Batrak
>>
>
>


-- 
Dmitry Batrak
Senior Software Developer
JetBrains
http://www.jetbrains.com
The Drive to Develop
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/2d-dev/attachments/20160412/2fc11de8/attachment.html>


More information about the 2d-dev mailing list