more float/double precision tweaks
git-svn-id: http://skia.googlecode.com/svn/trunk@355 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
0b9e2dbf2f
commit
ab7ac026d2
@ -23,6 +23,10 @@
|
|||||||
|
|
||||||
#ifdef SK_SCALAR_IS_FLOAT
|
#ifdef SK_SCALAR_IS_FLOAT
|
||||||
#define kMatrix22Elem SK_Scalar1
|
#define kMatrix22Elem SK_Scalar1
|
||||||
|
|
||||||
|
static inline float SkDoubleToFloat(double x) {
|
||||||
|
return static_cast<float>(x);
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
#define kMatrix22Elem SK_Fract1
|
#define kMatrix22Elem SK_Fract1
|
||||||
#endif
|
#endif
|
||||||
@ -455,13 +459,7 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst,
|
|||||||
#ifdef SK_SCALAR_IS_FLOAT
|
#ifdef SK_SCALAR_IS_FLOAT
|
||||||
static inline int fixmuladdmul(float a, float b, float c, float d,
|
static inline int fixmuladdmul(float a, float b, float c, float d,
|
||||||
float* result) {
|
float* result) {
|
||||||
*result = a * b + c * d;
|
*result = SkDoubleToFloat((double)a * b + (double)c * d);
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int fixmuladdmulshiftmul(float a, float b, float c, float d,
|
|
||||||
int /*shift not used*/, float scale, float* result) {
|
|
||||||
*result = (a * b + c * d) * scale;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,34 +487,6 @@ bool SkMatrix::setRectToRect(const SkRect& src, const SkRect& dst,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool fixmuladdmulshiftmul(SkFixed a, SkFixed b, SkFixed c,
|
|
||||||
SkFixed d, int shift, SkFixed scale, SkFixed* result) {
|
|
||||||
Sk64 tmp1, tmp2;
|
|
||||||
tmp1.setMul(a, b);
|
|
||||||
tmp2.setMul(c, d);
|
|
||||||
tmp1.add(tmp2);
|
|
||||||
|
|
||||||
int32_t hi = SkAbs32(tmp1.fHi);
|
|
||||||
int afterShift = 16;
|
|
||||||
if (hi >> 15) {
|
|
||||||
int clz = 17 - SkCLZ(hi);
|
|
||||||
SkASSERT(clz > 0 && clz <= 16);
|
|
||||||
afterShift -= clz;
|
|
||||||
shift += clz;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp1.roundRight(shift + 16);
|
|
||||||
SkASSERT(tmp1.is32());
|
|
||||||
|
|
||||||
tmp1.setMul(tmp1.get32(), scale);
|
|
||||||
tmp1.roundRight(afterShift);
|
|
||||||
if (tmp1.is32()) {
|
|
||||||
*result = tmp1.get32();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline SkFixed fracmuladdmul(SkFixed a, SkFract b, SkFixed c,
|
static inline SkFixed fracmuladdmul(SkFixed a, SkFract b, SkFixed c,
|
||||||
SkFract d) {
|
SkFract d) {
|
||||||
Sk64 tmp1, tmp2;
|
Sk64 tmp1, tmp2;
|
||||||
@ -690,9 +660,6 @@ bool SkMatrix::postConcat(const SkMatrix& mat) {
|
|||||||
}
|
}
|
||||||
return 1.0 / det;
|
return 1.0 / det;
|
||||||
}
|
}
|
||||||
static inline float SkDoubleToFloat(double x) {
|
|
||||||
return static_cast<float>(x);
|
|
||||||
}
|
|
||||||
// we declar a,b,c,d to all be doubles, because we want to perform
|
// we declar a,b,c,d to all be doubles, because we want to perform
|
||||||
// double-precision muls and subtract, even though the original values are
|
// double-precision muls and subtract, even though the original values are
|
||||||
// from the matrix, which are floats.
|
// from the matrix, which are floats.
|
||||||
|
Loading…
Reference in New Issue
Block a user