From bb7cf5a5b7d25308e570e6bf22a14957c4384e9c Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Wed, 22 Jan 2025 10:57:40 +0900 Subject: [PATCH] [FREETYPE][FTFD][NTGDI] Split FT_Bitmap_Convert hack (#7628) Our FT_Bitmap_Convert function had a hack to make the bitmap image compatible to ReactOS. I think the hack on FT_Bitmap_Convert should be separated from our font engine. JIRA issue: CORE-16047 - Add FT_Bitmap_Convert_ReactOS_Hack function, that is based on FT_Bitmap_Convert, and split the hack of FT_Bitmap_Convert. - Use FT_Bitmap_Convert_ReactOS_Hack in IntGetBitmapGlyphWithCache function instead of FT_Bitmap_Convert. - Modify ftfd.spec to add FT_Bitmap_Convert_ReactOS_Hack. --- .../freetype/include/freetype/ftbitmap.h | 35 ++++++++++++ sdk/lib/3rdparty/freetype/src/base/ftbitmap.c | 53 ++++++++++++++----- win32ss/drivers/font/ftfd/ftfd.spec | 1 + win32ss/gdi/ntgdi/freetype.c | 3 +- 4 files changed, 79 insertions(+), 13 deletions(-) diff --git a/sdk/lib/3rdparty/freetype/include/freetype/ftbitmap.h b/sdk/lib/3rdparty/freetype/include/freetype/ftbitmap.h index a43187cad47..0b9f52a619c 100644 --- a/sdk/lib/3rdparty/freetype/include/freetype/ftbitmap.h +++ b/sdk/lib/3rdparty/freetype/include/freetype/ftbitmap.h @@ -181,6 +181,41 @@ FT_BEGIN_HEADER FT_Bitmap *target, FT_Int alignment ); +#ifdef __REACTOS__ + /*************************************************************************/ + /* */ + /* */ + /* FT_Bitmap_Convert_ReactOS_Hack */ + /* */ + /* */ + /* Mainly same as @FT_Bitmap_Convert, but the bitmap will be */ + /* ReactOS compatible when hack parameter is true. */ + /* */ + /* */ + /* library :: A handle to a library object. */ + /* */ + /* source :: The source bitmap. */ + /* */ + /* alignment :: The pitch of the bitmap is a multiple of this */ + /* parameter. Common values are 1, 2, or 4. */ + /* */ + /* hack :: If TRUE, the bitmap will be ReactOS compatible. */ + /* If FALSE, the bitmap will be same as */ + /* FT_Bitmap_Convert returns. */ + /* */ + /* */ + /* target :: The target bitmap. */ + /* */ + /* */ + /* FreeType error code. 0~means success. */ + /* */ + FT_EXPORT( FT_Error ) + FT_Bitmap_Convert_ReactOS_Hack( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment, + FT_Bool hack); +#endif /*************************************************************************/ /* */ diff --git a/sdk/lib/3rdparty/freetype/src/base/ftbitmap.c b/sdk/lib/3rdparty/freetype/src/base/ftbitmap.c index 5bfc13e2445..696db7368b1 100644 --- a/sdk/lib/3rdparty/freetype/src/base/ftbitmap.c +++ b/sdk/lib/3rdparty/freetype/src/base/ftbitmap.c @@ -500,11 +500,20 @@ /* documentation is in ftbitmap.h */ +#ifdef __REACTOS__ + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Convert_ReactOS_Hack( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment, + FT_Bool hack ) +#else FT_EXPORT_DEF( FT_Error ) FT_Bitmap_Convert( FT_Library library, const FT_Bitmap *source, FT_Bitmap *target, FT_Int alignment ) +#endif { FT_Error error = FT_Err_Ok; FT_Memory memory; @@ -602,15 +611,20 @@ FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ #ifdef __REACTOS__ - tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); - tt[1] = (FT_Byte)( ( val & 0x40 ) ? 0xff : 0); - tt[2] = (FT_Byte)( ( val & 0x20 ) ? 0xff : 0); - tt[3] = (FT_Byte)( ( val & 0x10 ) ? 0xff : 0); - tt[4] = (FT_Byte)( ( val & 0x08 ) ? 0xff : 0); - tt[5] = (FT_Byte)( ( val & 0x04 ) ? 0xff : 0); - tt[6] = (FT_Byte)( ( val & 0x02 ) ? 0xff : 0); - tt[7] = (FT_Byte)( ( val & 0x01 ) ? 0xff : 0); -#else + if (hack) + { + tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); + tt[1] = (FT_Byte)( ( val & 0x40 ) ? 0xff : 0); + tt[2] = (FT_Byte)( ( val & 0x20 ) ? 0xff : 0); + tt[3] = (FT_Byte)( ( val & 0x10 ) ? 0xff : 0); + tt[4] = (FT_Byte)( ( val & 0x08 ) ? 0xff : 0); + tt[5] = (FT_Byte)( ( val & 0x04 ) ? 0xff : 0); + tt[6] = (FT_Byte)( ( val & 0x02 ) ? 0xff : 0); + tt[7] = (FT_Byte)( ( val & 0x01 ) ? 0xff : 0); + } + else + { +#endif tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); @@ -619,6 +633,8 @@ tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); tt[7] = (FT_Byte)( val & 0x01 ); +#ifdef __REACTOS__ + } #endif tt += 8; @@ -635,10 +651,11 @@ for ( ; j > 0; j-- ) { #ifdef __REACTOS__ - tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); -#else - tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); + if (hack) + tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); + else #endif + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); val <<= 1; tt += 1; } @@ -794,6 +811,18 @@ return error; } +#ifdef __REACTOS__ + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ) + { + return FT_Bitmap_Convert_ReactOS_Hack(library, source, target, alignment, FALSE); + } +#endif /* documentation is in ftbitmap.h */ diff --git a/win32ss/drivers/font/ftfd/ftfd.spec b/win32ss/drivers/font/ftfd/ftfd.spec index f4178ef7d11..f1b06a86989 100644 --- a/win32ss/drivers/font/ftfd/ftfd.spec +++ b/win32ss/drivers/font/ftfd/ftfd.spec @@ -6,6 +6,7 @@ @ cdecl FT_Attach_File () @ cdecl FT_Attach_Stream () @ cdecl FT_Bitmap_Convert () + @ cdecl FT_Bitmap_Convert_ReactOS_Hack () @ cdecl FT_Bitmap_Copy () @ cdecl FT_Bitmap_Done () @ cdecl FT_Bitmap_Embolden () diff --git a/win32ss/gdi/ntgdi/freetype.c b/win32ss/gdi/ntgdi/freetype.c index 86efc2e2c30..13932681b29 100644 --- a/win32ss/gdi/ntgdi/freetype.c +++ b/win32ss/gdi/ntgdi/freetype.c @@ -3852,7 +3852,8 @@ IntGetBitmapGlyphWithCache( BitmapGlyph = (FT_BitmapGlyph)GlyphCopy; FT_Bitmap_New(&AlignedBitmap); - if(FT_Bitmap_Convert(GlyphSlot->library, &BitmapGlyph->bitmap, &AlignedBitmap, 4)) + if (FT_Bitmap_Convert_ReactOS_Hack(GlyphSlot->library, &BitmapGlyph->bitmap, + &AlignedBitmap, 4, TRUE)) { DPRINT1("Conversion failed\n"); ExFreePoolWithTag(NewEntry, TAG_FONT);