[FREETYPE][FTFD][NTGDI] Split FT_Bitmap_Convert hack (#7628)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Wed, 22 Jan 2025 01:57:40 +0000 (10:57 +0900)
committerGitHub <noreply@github.com>
Wed, 22 Jan 2025 01:57:40 +0000 (10:57 +0900)
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.

sdk/lib/3rdparty/freetype/include/freetype/ftbitmap.h
sdk/lib/3rdparty/freetype/src/base/ftbitmap.c
win32ss/drivers/font/ftfd/ftfd.spec
win32ss/gdi/ntgdi/freetype.c

index a43187c..0b9f52a 100644 (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
 
   /*************************************************************************/
   /*                                                                       */
index 5bfc13e..696db73 100644 (file)
 
   /* 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;
             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 );
             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;
             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;
             }
     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 */
 
index f4178ef..f1b06a8 100644 (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 ()
index 86efc2e..1393268 100644 (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);