[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