shithub: freetype+ttf2subf

Download patch

ref: 9079c5d91aa87bcae223fc933b9c0ebf346b7d64
parent: 238245cd66e10025316463998a1fa20c15a065a8
author: Werner Lemberg <[email protected]>
date: Sat Nov 13 03:53:19 EST 2021

Provide C++ versions for public macros with casts.

Many FreeType clients use C++.  However `g++ -Wold-style-cast` warns for
macros with C-style casts even for system header files; this also affects
directories included with `-isystem`.  While this could be seen as a problem
with g++, the problem is more a philosophical one: Over the time, C and C++
diverged more and more, and some features of C are no longer the 'right'
solution in C++.

* include/freetype/config/public-macros.h (FT_STATIC_CAST,
FT_REINTERPRET_CAST): New macros.

* include/freetype/freetype.h (FT_ENC_TAG, FT_LOAD_TARGET_,
FT_LOAD_TARGET_MODE): Use `FT_STATIC_CAST`.
Correctly handle negative 'signed char' input.
* include/freetype/ftimage.h (FT_IMAGE_TAG): Ditto.
* include/freetype/fttypes.h (FT_MAKE_TAG, FT_BOOL): Ditto.
* include/freetype/ftmodapi.h (FT_FACE_DRIVER_NAME): Use
`FT_REINTERPRET_CAST`.

* src/smooth/ftgrays.c (FT_STATIC_CAST)[STANDALONE_]: New macro.
[!STANDALONE]: Include `FT_CONFIG_CONFIG_H`.

Fixes #1116.

git/fs: mount .git/fs: mount/attach disallowed
--- a/include/freetype/config/public-macros.h
+++ b/include/freetype/config/public-macros.h
@@ -103,6 +103,7 @@
    */
 #define FT_EXPORT( x )  FT_PUBLIC_FUNCTION_ATTRIBUTE extern x
 
+
   /*
    * `FT_UNUSED` indicates that a given parameter is not used -- this is
    * only used to get rid of unpleasant compiler warnings.
@@ -112,6 +113,18 @@
    */
 #ifndef FT_UNUSED
 #define FT_UNUSED( arg )  ( (arg) = (arg) )
+#endif
+
+
+  /*
+   * Support for casts in both C and C++.
+   */
+#ifdef __cplusplus
+#define FT_STATIC_CAST( type )       static_cast<type>
+#define FT_REINTERPRET_CAST( type )  reinterpret_cast<type>
+#else
+#define FT_STATIC_CAST( type )       (type)
+#define FT_REINTERPRET_CAST( type )  (type)
 #endif
 
 
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -616,12 +616,13 @@
    */
 
 #ifndef FT_ENC_TAG
-#define FT_ENC_TAG( value, a, b, c, d )         \
-          value = ( ( (FT_UInt32)(a) << 24 ) |  \
-                    ( (FT_UInt32)(b) << 16 ) |  \
-                    ( (FT_UInt32)(c) <<  8 ) |  \
-                      (FT_UInt32)(d)         )
 
+#define FT_ENC_TAG( value, a, b, c, d )                      \
+          value = ( ( FT_STATIC_CAST( FT_Byte )(a) << 24 ) | \
+                    ( FT_STATIC_CAST( FT_Byte )(b) << 16 ) | \
+                    ( FT_STATIC_CAST( FT_Byte )(c) <<  8 ) | \
+                      FT_STATIC_CAST( FT_Byte )(d)         )
+
 #endif /* FT_ENC_TAG */
 
 
@@ -3181,7 +3182,7 @@
    *   necessary to empty the cache after a mode switch to avoid false hits.
    *
    */
-#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )
+#define FT_LOAD_TARGET_( x )   ( FT_STATIC_CAST( FT_Int32 )( (x) & 15 ) << 16 )
 
 #define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
 #define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )
@@ -3200,7 +3201,8 @@
    *   @FT_LOAD_TARGET_XXX value.
    *
    */
-#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )
+#define FT_LOAD_TARGET_MODE( x )                                 \
+          FT_STATIC_CAST( FT_Render_Mode )( ( (x) >> 16 ) & 15 )
 
 
   /**************************************************************************
--- a/include/freetype/ftimage.h
+++ b/include/freetype/ftimage.h
@@ -28,11 +28,6 @@
 #define FTIMAGE_H_
 
 
-  /* STANDALONE_ is from ftgrays.c */
-#ifndef STANDALONE_
-#endif
-
-
 FT_BEGIN_HEADER
 
 
@@ -700,11 +695,13 @@
    *   to get a simple enumeration without assigning special numbers.
    */
 #ifndef FT_IMAGE_TAG
-#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \
-          value = ( ( (unsigned long)_x1 << 24 ) | \
-                    ( (unsigned long)_x2 << 16 ) | \
-                    ( (unsigned long)_x3 << 8  ) | \
-                      (unsigned long)_x4         )
+
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )                      \
+          value = ( ( FT_STATIC_CAST( unsigned char )( _x1 ) << 24 ) | \
+                    ( FT_STATIC_CAST( unsigned char )( _x2 ) << 16 ) | \
+                    ( FT_STATIC_CAST( unsigned char )( _x3 ) << 8  ) | \
+                      FT_STATIC_CAST( unsigned char )( _x4 )         )
+
 #endif /* FT_IMAGE_TAG */
 
 
--- a/include/freetype/ftmodapi.h
+++ b/include/freetype/ftmodapi.h
@@ -347,8 +347,9 @@
    *   2.11
    *
    */
-#define FT_FACE_DRIVER_NAME( face ) \
-          ( ( *(FT_Module_Class**)( ( face )->driver ) )->module_name )
+#define FT_FACE_DRIVER_NAME( face )                     \
+          ( ( *FT_REINTERPRET_CAST( FT_Module_Class** ) \
+                 ( ( face )->driver ) )->module_name )
 
 
   /**************************************************************************
--- a/include/freetype/fttypes.h
+++ b/include/freetype/fttypes.h
@@ -485,12 +485,12 @@
    *   The produced values **must** be 32-bit integers.  Don't redefine this
    *   macro.
    */
-#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
-          (FT_Tag)                        \
-          ( ( (FT_ULong)_x1 << 24 ) |     \
-            ( (FT_ULong)_x2 << 16 ) |     \
-            ( (FT_ULong)_x3 <<  8 ) |     \
-              (FT_ULong)_x4         )
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 )                \
+          FT_STATIC_CAST( FT_Tag )                       \
+          ( ( FT_STATIC_CAST( FT_Byte )( _x1 ) << 24 ) | \
+            ( FT_STATIC_CAST( FT_Byte )( _x2 ) << 16 ) | \
+            ( FT_STATIC_CAST( FT_Byte )( _x3 ) <<  8 ) | \
+              FT_STATIC_CAST( FT_Byte )( _x4 )         )
 
 
   /*************************************************************************/
@@ -588,7 +588,7 @@
 
 
 #define FT_IS_EMPTY( list )  ( (list).head == 0 )
-#define FT_BOOL( x )  ( (FT_Bool)( (x) != 0 ) )
+#define FT_BOOL( x )         FT_STATIC_CAST( FT_Bool )( (x) != 0 )
 
   /* concatenate C tokens */
 #define FT_ERR_XCAT( x, y )  x ## y
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -152,7 +152,9 @@
 #define ADD_INT( a, b )                                  \
           (int)( (unsigned int)(a) + (unsigned int)(b) )
 
+#define FT_STATIC_CAST( type )  (type)
 
+
 #define ft_memset   memset
 
 #define ft_setjmp   setjmp
@@ -273,6 +275,8 @@
 #else /* !STANDALONE_ */
 
 
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
 #include "ftgrays.h"
 #include <freetype/internal/ftobjs.h>
 #include <freetype/internal/ftdebug.h>