[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.
This commit is contained in:
Katayama Hirofumi MZ 2025-01-22 10:57:40 +09:00 committed by GitHub
parent 0e01cbc6cd
commit bb7cf5a5b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 79 additions and 13 deletions

View file

@ -181,6 +181,41 @@ FT_BEGIN_HEADER
FT_Bitmap *target,
FT_Int alignment );
#ifdef __REACTOS__
/*************************************************************************/
/* */
/* <Function> */
/* FT_Bitmap_Convert_ReactOS_Hack */
/* */
/* <Description> */
/* Mainly same as @FT_Bitmap_Convert, but the bitmap will be */
/* ReactOS compatible when hack parameter is true. */
/* */
/* <Input> */
/* 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. */
/* */
/* <Output> */
/* target :: The target bitmap. */
/* */
/* <Return> */
/* 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
/*************************************************************************/
/* */

View file

@ -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 */

View file

@ -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 ()

View file

@ -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);