[PATCH 1/2] gdi32: Support the subpixel rendering for FreeType >= 2.8.1 .

Byeongsik Jeon bsjeon at hanmail.net
Fri Oct 5 05:49:22 CDT 2018


On Fri, 5 Oct 2018 09:39:53 +0300, Nikolay Sivov <nsivov at codeweavers.com> 
wrote:> On 10/04/2018 03:17 PM, Byeongsik Jeon wrote:
> 
>> FreeType >= 2.8.1 support LCD-optimized rendering without LCD filters.
>> It works regardless of FT_Err_Unimplemented_Feature check.
>>
>> Signed-off-by: Byeongsik Jeon <bsjeon at hanmail.net>
>> ---
>>   dlls/gdi32/freetype.c | 25 ++++++++++++++-----------
>>   1 file changed, 14 insertions(+), 11 deletions(-)
>> 
>> diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
>> index b7e2413753..468c1951b6 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
>>   }
> 
> Could you explain why does this make a difference? I'd expect 
> FT_Library_SetLcdFilter to be still functional in 2.8.1+, also how is this new 
> rendering mode is enabled?

Officially, FreeType says it has implemented its own subpixel rendering 
technology, aka Harmony. Now you can get subpixel rendered bitmaps even if you 
no longer activate FT_CONFIG_OPTION_SUBPIXEL_RENDERING. It's the default.

In this state, FT_Library_SetLcdFilter only includes "return 
FT_Err_Unimplemed_Feature;". Therefore, FT_Err_Uniplemented_Feature check is not 
the reliable way.

Because of programs that have not yet been updated like Wine now, the 
distribution packager may have deliberately activated 
FT_CONFIG_OPTION_SUBPIXEL_RENDERING. However, I think it is better not to use 
the function that FreeType intends to avoid.

Subpixel rendering is done by simply giving the suitable option to 
FT_Render_Glyph() or FT_Load_Glyph().

---
FreeType 2.8.1 News
2017-09-16
FreeType 2.8.1 has been released. This is mainly a maintenance release with one 
important change: By default, FreeType now offers high quality LCD-optimized 
output without resorting to ClearType techniques of resolution tripling and 
filtering. In this method, called Harmony, each color channel is generated 
separately after shifting the glyph outline, capitalizing on the fact that the 
color grids on LCD panels are shifted by a third of a pixel. This output is 
indistinguishable from ClearType with a light 3-tap filter.

Thanks.


>> @@ -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,11 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, 
>> UINT glyph, UINT format,
>>               if ( needsTransform )
>>                   pFT_Outline_Transform (&ft_face->glyph->outline, 
>> &transMatTategaki);
>> -            if ( pFT_Library_SetLcdFilter )
>> +#ifdef FT_LCD_FILTER_H
>> +            if ( FT_SimpleVersion < ((2 << 16) | (8 << 8) | (1 << 0)) &&
>> +                 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 +7448,6 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, 
>> UINT glyph, UINT format,
>>           break;
>>         }
>> -#else
>> -      return GDI_ERROR;
>> -#endif
>>       case GGO_NATIVE:
>>         {
> 
> 



More information about the wine-devel mailing list