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

Byeongsik Jeon bsjeon at hanmail.net
Fri Oct 5 09:47:08 CDT 2018





On Fri, 5 Oct 2018 16:52:27 +0300, Nikolay Sivov <nsivov at codeweavers.com> wrote:
> 
> 
> 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.
> 
OK.
I think I put my personal opinion in the patch.
It can be eliminated by removing the version check inside GetGlyphOutline().

Should I send a modified patch?

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