10 #ifndef SkMath_DEFINED
11 #define SkMath_DEFINED
20 static inline bool sk_64_isS32(int64_t value) {
21 return (int32_t)value == value;
29 static inline int32_t sk_64_asS32(int64_t value) {
30 SkASSERT(sk_64_isS32(value));
31 return (int32_t)value;
37 static inline int64_t sk_64_mul(int64_t a, int64_t b) {
48 static inline int32_t SkMulDiv(int32_t numer1, int32_t numer2, int32_t denom) {
51 int64_t tmp = sk_64_mul(numer1, numer2) / denom;
52 return sk_64_asS32(tmp);
58 int32_t SkSqrtBits(int32_t value,
int bitBias);
62 #define SkSqrt32(n) SkSqrtBits(n, 15)
67 static inline int SkClampPos(
int value) {
68 return value & ~(value >> 31);
77 static inline int SkClampMax(
int value,
int max) {
93 template <
typename T> constexpr
inline bool SkIsPow2(T value) {
94 return (value & (value - 1)) == 0;
103 static inline unsigned SkMul16ShiftRound(
U16CPU a,
U16CPU b,
int shift) {
104 SkASSERT(a <= 32767);
105 SkASSERT(b <= 32767);
106 SkASSERT(shift > 0 && shift <= 8);
107 unsigned prod = a*b + (1 << (shift - 1));
108 return (prod + (prod >> shift)) >> shift;
116 SkASSERT(a <= 32767);
117 SkASSERT(b <= 32767);
118 unsigned prod = a*b + 128;
119 return (prod + (prod >> 8)) >> 8;
125 template <
typename In,
typename Out>
126 inline void SkTDivMod(In numer, In denom, Out* div, Out* mod) {
134 const In d = numer/denom;
135 *div =
static_cast<Out
>(d);
136 *mod =
static_cast<Out
>(numer-d*denom);
139 *div =
static_cast<Out
>(numer/denom);
140 *mod =
static_cast<Out
>(numer%denom);
unsigned U16CPU
Fast type for unsigned 16 bits.
Definition: SkTypes.h:203
unsigned U8CPU
Fast type for unsigned 8 bits.
Definition: SkTypes.h:191