8#ifndef _SFloat_DEFINED_
9#define _SFloat_DEFINED_
14#define sk_float_sqrt(x) sqrtf(x)
15#define sk_float_sin(x) sinf(x)
16#define sk_float_cos(x) cosf(x)
17#define sk_float_tan(x) tanf(x)
18#define sk_float_floor(x) floorf(x)
19#define sk_float_ceil(x) ceilf(x)
20#define sk_float_abs(x) (float)::fabs(x)
22#define sk_float_floor2int(x) (int)sk_float_floor(x)
23#define sk_float_round2int(x) (int)sk_float_floor((x) + 0.5f)
24#define sk_float_ceil2int(x) (int)sk_float_ceil(x)
31#define SK_Scalar1 (1.0f)
34#define SK_ScalarHalf (0.5f)
37#define SK_ScalarInfinity SK_FloatInfinity
40#define SK_ScalarNegativeInfinity SK_FloatNegativeInfinity
43#define SK_ScalarMax (3.402823466e+38f)
46#define SK_ScalarMin (-SK_ScalarMax)
49#define SK_ScalarNaN SK_FloatNaN
53#define SkIntToScalar(n) ((float)(n))
56#define SkFixedToScalar(x) SkFixedToFloat(x)
59#define SFloatToFixed(x) SkFloatToFixed(x)
61#define SFloatToFloat(n) (n)
62#ifndef SK_SCALAR_TO_FLOAT_EXCLUDED
63#define SkFloatToScalar(n) (n)
66#define SFloatToDouble(n) (double)(n)
67#define SkDoubleToScalar(n) (float)(n)
71#define SFloatFraction(x) sk_float_mod(x, 1.0f)
73#define SFloatFloorToScalar(x) sk_float_floor(x)
74#define SFloatCeilToScalar(x) sk_float_ceil(x)
75#define SFloatRoundToScalar(x) sk_float_floor((x) + 0.5f)
77#define SFloatFloorToInt(x) sk_float_floor2int(x)
78#define SFloatCeilToInt(x) sk_float_ceil2int(x)
79#define SFloatRoundToInt(x) sk_float_round2int(x)
80#define SFloatTruncToInt(x) static_cast<int>(x)
82#define SK_ANNOTATE_UNPROTECTED_READ(x) (x)
83#define SK_ANNOTATE_UNPROTECTED_WRITE(ptr, val) *(ptr) = (val)
87#define SFloatAbs(x) sk_float_abs(x)
90#define SFloatCopySign(x, y) sk_float_copysign(x, y)
93#define SFloatMul(a, b) ((float)(a) * (b))
96#define SFloatMulAdd(a, b, c) ((float)(a) * (b) + (c))
99#define SFloatDiv(a, b) ((float)(a) / (b))
102#define SFloatMod(x, y) sk_float_mod(x, y)
105#define SFloatMulDiv(a, b, c) ((float)(a) * (b) / (c))
108#define SFloatInvert(x) (SK_Scalar1 / (x))
109#define SFloatFastInvert(x) (SK_Scalar1 / (x))
112#define SFloatSqrt(x) sk_float_sqrt(x)
115#define SFloatPow(b, e) sk_float_pow(b, e)
118#define SFloatAve(a, b) (((a) + (b)) * 0.5f)
121#define SFloatHalf(a) ((a)*0.5f)
123#define SK_ScalarSqrt2 1.41421356f
124#define SK_ScalarPI 3.14159265f
125#define SK_ScalarTanPIOver8 0.414213562f
126#define SK_ScalarRoot2Over2 0.707106781f
128#define SkDegreesToRadians(degrees) ((degrees) * (SK_ScalarPI / 180))
129#define SkRadiansToDegrees(radians) ((radians) * (180 / SK_ScalarPI))
130#define SFloatSin(radians) (float)sk_float_sin(radians)
131#define SFloatCos(radians) (float)sk_float_cos(radians)
132#define SFloatTan(radians) (float)sk_float_tan(radians)
133#define SFloatASin(val) (float)sk_float_asin(val)
134#define SFloatACos(val) (float)sk_float_acos(val)
135#define SFloatATan2(y, x) (float)sk_float_atan2(y, x)
136#define SFloatExp(x) (float)sk_float_exp(x)
137#define SFloatLog(x) (float)sk_float_log(x)
154inline int SkDScalarRoundToInt(
float x)
158 return (
int)floor(xx);
160inline float SkMaxScalar(
float a,
float b)
162 return a > b ? a : b;
164inline float SkMinScalar(
float a,
float b)
166 return a < b ? a : b;
171inline bool SFloatIsNaN(
float x)
177inline bool SFloatIsFinite(
float x)
191inline float SFloatClampMax(
float x,
float max)
193 return x < 0 ? 0 : x > max ? max : x;
197inline float SFloatPin(
float x,
float min,
float max)
199 return x < min ? min : x > max ? max : x;
203inline float SFloatSquare(
float x)
208inline bool SFloatIsInt(
float x)
210 return x == (float)(
int)x;
219inline int SFloatSignAsInt(
float x)
221 return x < 0 ? -1 : (x > 0);
225inline float SFloatSignAsScalar(
float x)
227 return x < 0 ? -SK_Scalar1 : ((x > 0) ? SK_Scalar1 : 0);
230#define SK_ScalarNearlyZero (SK_Scalar1 / (1 << 12))
232inline bool SFloatNearlyZero(
float x,
float tolerance = SK_ScalarNearlyZero)
234 SASSERT(tolerance >= 0);
235 return SFloatAbs(x) <= tolerance;
238inline bool SFloatNearlyEqual(
float x,
float y,
float tolerance = SK_ScalarNearlyZero)
240 SASSERT(tolerance >= 0);
241 return SFloatAbs(x - y) <= tolerance;
250inline float SFloatInterp(
float A,
float B,
float t)
252 SASSERT(t >= 0 && t <= SK_Scalar1);
253 return A + (B - A) * t;
259inline bool SFloatsEqual(
const float a[],
const float b[],
int n)
262 for (
int i = 0; i < n; ++i)