diff options
Diffstat (limited to 'Build/source/libs/xpdf/goo/FixedPoint.cc')
-rw-r--r-- | Build/source/libs/xpdf/goo/FixedPoint.cc | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/Build/source/libs/xpdf/goo/FixedPoint.cc b/Build/source/libs/xpdf/goo/FixedPoint.cc index f969959a66b..47c2834a34b 100644 --- a/Build/source/libs/xpdf/goo/FixedPoint.cc +++ b/Build/source/libs/xpdf/goo/FixedPoint.cc @@ -18,13 +18,15 @@ #include "FixedPoint.h" +#define ln2 ((FixedPoint)0.69314718) + FixedPoint FixedPoint::sqrt(FixedPoint x) { FixedPoint y0, y1, z; if (x.val <= 0) { y1.val = 0; } else { - y1.val = x.val >> 1; + y1.val = x.val == 1 ? 2 : x.val >> 1; do { y0.val = y1.val; z = x / y0; @@ -34,10 +36,9 @@ FixedPoint FixedPoint::sqrt(FixedPoint x) { return y1; } -//~ this is not very accurate FixedPoint FixedPoint::pow(FixedPoint x, FixedPoint y) { FixedPoint t, t2, lnx0, lnx, z0, z; - int d, i; + int d, n, i; if (y.val <= 0) { z.val = 0; @@ -56,6 +57,8 @@ FixedPoint FixedPoint::pow(FixedPoint x, FixedPoint y) { lnx.val <<= 1; t = y * lnx; // exp(y * ln(x)) + n = floor(t / ln2); + t -= ln2 * n; t2 = t; d = 1; i = 1; @@ -67,6 +70,11 @@ FixedPoint FixedPoint::pow(FixedPoint x, FixedPoint y) { ++i; d *= i; } while (::abs(z.val - z0.val) > 2 && d < (1 << fixptShift)); + if (n >= 0) { + z.val <<= n; + } else if (n < 0) { + z.val >>= -n; + } } return z; } @@ -92,4 +100,19 @@ int FixedPoint::div(int x, int y) { #endif } +GBool FixedPoint::divCheck(FixedPoint x, FixedPoint y, FixedPoint *result) { +#if 1 //~tmp + FixPtInt64 z; + + z = ((FixPtInt64)x.val << fixptShift) / y.val; + if ((z == 0 && x != 0) || + z >= ((FixPtInt64)1 << 31) || z < -((FixPtInt64)1 << 31)) { + return gFalse; + } + result->val = z; + return gTrue; +#else +#endif +} + #endif // USE_FIXEDPOINT |