FreeType 2.8.1+ implemented its own subpixel rendering. So FT_Err_Uniplemented_Feature check is not the reliable way.
Signed-off-by: Byeongsik Jeon bsjeon@hanmail.net --- dlls/gdi32/freetype.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 36a3431394..b95d223138 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -993,18 +993,22 @@ static BOOL is_hinting_enabled(void)
static BOOL is_subpixel_rendering_enabled( void ) { -#ifdef FT_LCD_FILTER_H static int enabled = -1; if (enabled == -1) { - enabled = (pFT_Library_SetLcdFilter && - pFT_Library_SetLcdFilter( NULL, 0 ) != FT_Err_Unimplemented_Feature); + /* FreeType >= 2.8.1 offers LCD-optimezed rendering without lcd filters. */ + if ( FT_SimpleVersion >= ((2 << 16) | (8 << 8) | (1 << 0))) + enabled = TRUE; +#ifdef FT_LCD_FILTER_H + else if ( pFT_Library_SetLcdFilter && + pFT_Library_SetLcdFilter( NULL, 0 ) != FT_Err_Unimplemented_Feature ) + enabled = TRUE; +#endif + else enabled = FALSE; + TRACE("subpixel rendering is %senabled\n", enabled ? "" : "NOT "); } return enabled; -#else - return FALSE; -#endif }
@@ -7274,7 +7278,6 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, case WINE_GGO_HBGR_BITMAP: case WINE_GGO_VRGB_BITMAP: case WINE_GGO_VBGR_BITMAP: -#ifdef FT_LCD_FILTER_H { switch (ft_face->glyph->format) { @@ -7360,8 +7363,10 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, if ( needsTransform ) pFT_Outline_Transform (&ft_face->glyph->outline, &transMatTategaki);
+#ifdef FT_LCD_FILTER_H if ( pFT_Library_SetLcdFilter ) pFT_Library_SetLcdFilter( library, FT_LCD_FILTER_DEFAULT ); +#endif pFT_Render_Glyph (ft_face->glyph, render_mode);
src = ft_face->glyph->bitmap.buffer; @@ -7442,9 +7447,6 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
break; } -#else - return GDI_ERROR; -#endif
case GGO_NATIVE: {
* 'if' branch removed in the loop. * glyph bitmap data is alpha value. Shift 24 part is unnecessary.
Signed-off-by: Byeongsik Jeon bsjeon@hanmail.net --- dlls/gdi32/freetype.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index b95d223138..0d34da216b 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -7323,7 +7323,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, BYTE *src; INT x, src_pitch, src_width, src_height, rgb_interval, hmul, vmul; INT x_shift, y_shift; - BOOL rgb; + INT rgb[3] = { 0, 1, 2 }; /* WINE_GGO_{H,V}RGB_BITMAP */ FT_Render_Mode render_mode = (format == WINE_GGO_HRGB_BITMAP || format == WINE_GGO_HBGR_BITMAP)? FT_RENDER_MODE_LCD: FT_RENDER_MODE_LCD_V; @@ -7358,7 +7358,6 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
memset(buf, 0, buflen); dst = buf; - rgb = (format == WINE_GGO_HRGB_BITMAP || format == WINE_GGO_VRGB_BITMAP);
if ( needsTransform ) pFT_Outline_Transform (&ft_face->glyph->outline, &transMatTategaki); @@ -7414,24 +7413,20 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, width = min( width, src_width / hmul ); height = min( height, src_height / vmul );
+ if ( format == WINE_GGO_HBGR_BITMAP || format == WINE_GGO_VBGR_BITMAP) + { + rgb[0] = 2; + rgb[1] = 1; + rgb[2] = 0; + } + while ( height-- ) { for ( x = 0; x < width; x++ ) { - if ( rgb ) - { - dst[x] = ((unsigned int)src[hmul * x + rgb_interval * 0] << 16) | - ((unsigned int)src[hmul * x + rgb_interval * 1] << 8) | - ((unsigned int)src[hmul * x + rgb_interval * 2] << 0) | - ((unsigned int)src[hmul * x + rgb_interval * 1] << 24) ; - } - else - { - dst[x] = ((unsigned int)src[hmul * x + rgb_interval * 2] << 16) | - ((unsigned int)src[hmul * x + rgb_interval * 1] << 8) | - ((unsigned int)src[hmul * x + rgb_interval * 0] << 0) | - ((unsigned int)src[hmul * x + rgb_interval * 1] << 24) ; - } + dst[x] = ((unsigned int)src[hmul * x + rgb_interval * rgb[0]] << 16) | + ((unsigned int)src[hmul * x + rgb_interval * rgb[1]] << 8) | + ((unsigned int)src[hmul * x + rgb_interval * rgb[2]]); } src += src_pitch * vmul; dst += pitch / sizeof(*dst);
On Tue, Oct 09, 2018 at 02:11:08PM +0900, Byeongsik Jeon wrote:
- 'if' branch removed in the loop.
- glyph bitmap data is alpha value. Shift 24 part is unnecessary.
Please put the '24' part in a separate patch.
Signed-off-by: Byeongsik Jeon bsjeon@hanmail.net
dlls/gdi32/freetype.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index b95d223138..0d34da216b 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -7323,7 +7323,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, BYTE *src; INT x, src_pitch, src_width, src_height, rgb_interval, hmul, vmul; INT x_shift, y_shift;
BOOL rgb;
INT rgb[3] = { 0, 1, 2 }; /* WINE_GGO_{H,V}RGB_BITMAP */
Perhaps something like this is cleaner:
const INT *sub_order const INT rgb_order[3] = { 0, 1, 2 }; const INT bgr_order[3] = { 2, 1, 0 };
sub_order = (format == WINE_GGO_HBRG_BITMAP || format == WINE_GGO_VGR_BITAMP) ? bgr_order : rgb_order;
Huw.