[PATCH 12/12] gdi32: Allow the embedded bitmap loading in the subpixel rendering mode.
Byeongsik Jeon
bsjeon at hanmail.net
Tue Jan 29 03:12:36 CST 2019
https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/ns-wingdi-taglogfonta#remarks
The following situations do not support ClearType antialiasing:
The font has tuned embedded bitmaps, for any font sizes that contain the
embedded bitmaps. For example, this occurs commonly in East Asian fonts.
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=28009
Signed-off-by: Byeongsik Jeon <bsjeon at hanmail.net>
---
[1]
This patch affects the WineTahoma rendering. This is a normal operation.
Instead of loading the embedded bitmap, the metrics returns to normal.
[2]
This is a different topic from the use of get_gasp_flags in freetype_SelectFont.
This determines whether to load the embedded bitmap.
This issue has been an issue for a long time in the Windows CJK legacy builtin
fonts. For some wrong programs, these fonts are programmed under the assumption
that they are rendered as bitmap. Ex. Space Funeral.
[3]
If the font with embedded bitmap has gasp DO_GRAY bits set,
does not use the bitmap. Ex. Calibri.
dlls/gdi32/freetype.c | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index d3d9e391f7..45709a0a92 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -7608,6 +7608,38 @@ static DWORD get_ggo_glyph_from_bitmap( FT_GlyphSlot glyph, UINT format, FT_BBox
return needed;
}
+static FT_Int get_embedded_bitmap_load_flags( UINT format, GdiFont *font, BOOL needsTransform )
+{
+ FT_Int load_flags = 0;
+ WORD gasp_flags;
+
+ if ( needsTransform )
+ return FT_LOAD_NO_BITMAP;
+
+ switch (format)
+ {
+ case GGO_BITMAP:
+ break;
+ case GGO_GRAY2_BITMAP:
+ case GGO_GRAY4_BITMAP:
+ case GGO_GRAY8_BITMAP:
+ case GGO_NATIVE:
+ case GGO_BEZIER:
+ load_flags = FT_LOAD_NO_BITMAP;
+ break;
+ case WINE_GGO_GRAY16_BITMAP:
+ case WINE_GGO_HRGB_BITMAP:
+ case WINE_GGO_HBGR_BITMAP:
+ case WINE_GGO_VRGB_BITMAP:
+ case WINE_GGO_VBGR_BITMAP:
+ if (get_gasp_flags( font, &gasp_flags ) && (gasp_flags & GASP_DOGRAY))
+ load_flags = FT_LOAD_NO_BITMAP;
+ break;
+ }
+
+ return load_flags;
+}
+
static FT_Int get_load_flags( UINT format, BOOL ggo_unhinted, BOOL natural_width )
{
FT_Int load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH;
@@ -7700,7 +7732,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
vertical_metrics = FALSE;
load_flags = get_load_flags( format, ggo_unhinted, natural_width );
- if (needsTransform || format != GGO_BITMAP) load_flags |= FT_LOAD_NO_BITMAP;
+ load_flags |= get_embedded_bitmap_load_flags( format, font, needsTransform );
if (vertical_metrics) load_flags |= FT_LOAD_VERTICAL_LAYOUT;
err = pFT_Load_Glyph(ft_face, glyph_index, load_flags);
--
2.20.1
More information about the wine-devel
mailing list