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

Nikolay Sivov nsivov at codeweavers.com
Fri Oct 5 08:52:27 CDT 2018



On 10/05/2018 01:49 PM, Byeongsik Jeon wrote:
> 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().

But FT_Library_SetLcdFilter still works if 
FT_CONFIG_OPTION_SUBPIXEL_RENDERING is enabled, right? It seems to me 
that we should keep checking for that first.

>
> ---
> 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