mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-13 19:44:28 +00:00
sw_engine: fix MSVC compatibility problem.
clz (count leading zero) is builtin function that is not available in MSVC. This patch replace clz for MSVC env. Thanks @fire for pointing out this. Refers: https://stackoverflow.com/questions/355967/how-to-use-msvc-intrinsics-to-get-the-equivalent-of-this-gcc-code
This commit is contained in:
parent
4f35c478c2
commit
bba162b604
1 changed files with 16 additions and 2 deletions
|
@ -27,6 +27,21 @@
|
|||
/* Internal Class Implementation */
|
||||
/************************************************************************/
|
||||
|
||||
//clz: count leading zero’s
|
||||
#ifdef _MSC_VER
|
||||
#include <intrin.h>
|
||||
static uint32_t __inline _clz(uint32_t value)
|
||||
{
|
||||
unsigned long leadingZero = 0;
|
||||
if (_BitScanReverse(&leadingZero, value)) return 31 - leadingZero;
|
||||
else return 32;
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _clz(x) __builtin_clz((x))
|
||||
#endif
|
||||
|
||||
|
||||
constexpr SwFixed CORDIC_FACTOR = 0xDBD95B16UL; //the Cordic shrink factor 0.858785336480436 * 2^32
|
||||
|
||||
//this table was generated for SW_FT_PI = 180L << 16, i.e. degrees
|
||||
|
@ -68,8 +83,7 @@ static int32_t _normalize(SwPoint& pt)
|
|||
auto v = pt;
|
||||
|
||||
//High order bit(MSB)
|
||||
//clz: count leading zero’s
|
||||
auto shift = 31 - __builtin_clz(abs(v.x) | abs(v.y));
|
||||
auto shift = 31 - _clz(abs(v.x) | abs(v.y));
|
||||
|
||||
if (shift <= SAFE_MSB) {
|
||||
shift = SAFE_MSB - shift;
|
||||
|
|
Loading…
Add table
Reference in a new issue