Use MS VC++'s _BitScanReverse to calculate MSB (patch #9636). * include/freetype/internal/ftcalc.h (FT_MSB) [_MSC_VER]: Implement it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
diff --git a/ChangeLog b/ChangeLog
index 004c96f..4bd8e5e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2018-05-12 Arkady Shapkin <arkady.shapkin@gmail.com>
+
+ Use MS VC++'s _BitScanReverse to calculate MSB (patch #9636).
+
+ * include/freetype/internal/ftcalc.h (FT_MSB) [_MSC_VER]: Implement
+ it.
+
2018-05-10 Alan Coopersmith <alan.coopersmith@oracle.com>
Fix DLL compilation on Solaris.
diff --git a/include/freetype/internal/ftcalc.h b/include/freetype/internal/ftcalc.h
index 818a812..3f889e6 100644
--- a/include/freetype/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -341,6 +341,7 @@ FT_BEGIN_HEADER
*/
#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+
#if defined( __GNUC__ ) && \
( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4 ) )
@@ -354,7 +355,30 @@ FT_BEGIN_HEADER
#endif
-#endif /* __GNUC__ */
+
+#elif defined( _MSC_VER )
+
+#if FT_SIZEOF_INT == 4
+
+#include <intrin.h>
+
+ static inline FT_Int32
+ FT_MSB_i386( FT_UInt32 x )
+ {
+ unsigned long where;
+
+
+ _BitScanReverse( &where, x );
+
+ return (FT_Int32)where;
+ }
+
+#define FT_MSB( x ) ( FT_MSB_i386( x ) )
+
+#endif
+
+#endif
+
#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
#ifndef FT_MSB