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

Alexey Ivanov alexey.ivanov at oracle.com
Tue Apr 26 16:30:12 UTC 2016


The patch is also available at
http://cr.openjdk.java.net/~aivanov/dmitry.batrak/8146035/jdk9/webrev.00/

The fix has been integrated into 9/client
https://bugs.openjdk.java.net/browse/JDK-8146035

and to 8u-dev
https://bugs.openjdk.java.net/browse/JDK-8154232


Regards,
Alexey

On 12.04.2016 20:43, Dmitry Batrak wrote:
> 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 
> <mailto: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/20160426/7940001e/attachment.html>


More information about the 2d-dev mailing list