Index: src/core/SkFloat.cpp |
diff --git a/src/core/SkFloat.cpp b/src/core/SkFloat.cpp |
deleted file mode 100644 |
index 9ec0a7a081b33869b6c224ac05941403cd338ee8..0000000000000000000000000000000000000000 |
--- a/src/core/SkFloat.cpp |
+++ /dev/null |
@@ -1,387 +0,0 @@ |
- |
-/* |
- * Copyright 2008 The Android Open Source Project |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
- |
-#include "SkFloat.h" |
-#include "SkMathPriv.h" |
- |
-#define EXP_BIAS (127+23) |
- |
-static int get_unsigned_exp(uint32_t packed) |
-{ |
- return (packed << 1 >> 24); |
-} |
- |
-static unsigned get_unsigned_value(uint32_t packed) |
-{ |
- return (packed << 9 >> 9) | (1 << 23); |
-} |
- |
-static int get_signed_value(int32_t packed) |
-{ |
- return SkApplySign(get_unsigned_value(packed), SkExtractSign(packed)); |
-} |
- |
-///////////////////////////////////////////////////////////////////////// |
- |
-int SkFloat::GetShift(int32_t packed, int shift) |
-{ |
- if (packed == 0) |
- return 0; |
- |
- int exp = get_unsigned_exp(packed) - EXP_BIAS - shift; |
- int value = get_unsigned_value(packed); |
- |
- if (exp >= 0) |
- { |
- if (exp > 8) // overflow |
- value = SK_MaxS32; |
- else |
- value <<= exp; |
- } |
- else |
- { |
- exp = -exp; |
- if (exp > 23) // underflow |
- value = 0; |
- else |
- value >>= exp; |
- } |
- return SkApplySign(value, SkExtractSign(packed)); |
-} |
- |
-///////////////////////////////////////////////////////////////////////////////////// |
- |
-int32_t SkFloat::SetShift(int value, int shift) |
-{ |
- if (value == 0) |
- return 0; |
- |
- // record the sign and make value positive |
- int sign = SkExtractSign(value); |
- value = SkApplySign(value, sign); |
- |
- if (value >> 24) // value is too big (has more than 24 bits set) |
- { |
- int bias = 8 - SkCLZ(value); |
- SkASSERT(bias > 0 && bias < 8); |
- value >>= bias; |
- shift += bias; |
- } |
- else |
- { |
- int zeros = SkCLZ(value << 8); |
- SkASSERT(zeros >= 0 && zeros <= 23); |
- value <<= zeros; |
- shift -= zeros; |
- } |
- // now value is left-aligned to 24 bits |
- SkASSERT((value >> 23) == 1); |
- |
- shift += EXP_BIAS; |
- if (shift < 0) // underflow |
- return 0; |
- else |
- { |
- if (shift > 255) // overflow |
- { |
- shift = 255; |
- value = 0x00FFFFFF; |
- } |
- int32_t packed = sign << 31; // set the sign-bit |
- packed |= shift << 23; // store the packed exponent |
- packed |= ((unsigned)(value << 9) >> 9); // clear 24th bit of value (its implied) |
- |
-#ifdef SK_DEBUG |
- { |
- int n; |
- |
- n = SkExtractSign(packed); |
- SkASSERT(n == sign); |
- n = get_unsigned_exp(packed); |
- SkASSERT(n == shift); |
- n = get_unsigned_value(packed); |
- SkASSERT(n == value); |
- } |
-#endif |
- return packed; |
- } |
-} |
- |
-int32_t SkFloat::Neg(int32_t packed) |
-{ |
- if (packed) |
- packed = packed ^ (1 << 31); |
- return packed; |
-} |
- |
-int32_t SkFloat::Add(int32_t packed_a, int32_t packed_b) |
-{ |
- if (packed_a == 0) |
- return packed_b; |
- if (packed_b == 0) |
- return packed_a; |
- |
- int exp_a = get_unsigned_exp(packed_a); |
- int exp_b = get_unsigned_exp(packed_b); |
- int exp_diff = exp_a - exp_b; |
- |
- int shift_a = 0, shift_b = 0; |
- int exp; |
- |
- if (exp_diff >= 0) |
- { |
- if (exp_diff > 24) // B is too small to contribute |
- return packed_a; |
- shift_b = exp_diff; |
- exp = exp_a; |
- } |
- else |
- { |
- exp_diff = -exp_diff; |
- if (exp_diff > 24) // A is too small to contribute |
- return packed_b; |
- shift_a = exp_diff; |
- exp = exp_b; |
- } |
- |
- int value_a = get_signed_value(packed_a) >> shift_a; |
- int value_b = get_signed_value(packed_b) >> shift_b; |
- |
- return SkFloat::SetShift(value_a + value_b, exp - EXP_BIAS); |
-} |
- |
-static inline int32_t mul24(int32_t a, int32_t b) { |
- int64_t tmp = (sk_64_mul(a, b) + (1 << 23)) >> 24; |
- return sk_64_asS32(tmp); |
-} |
- |
-int32_t SkFloat::Mul(int32_t packed_a, int32_t packed_b) |
-{ |
- if (packed_a == 0 || packed_b == 0) |
- return 0; |
- |
- int exp_a = get_unsigned_exp(packed_a); |
- int exp_b = get_unsigned_exp(packed_b); |
- |
- int value_a = get_signed_value(packed_a); |
- int value_b = get_signed_value(packed_b); |
- |
- return SkFloat::SetShift(mul24(value_a, value_b), exp_a + exp_b - 2*EXP_BIAS + 24); |
-} |
- |
-int32_t SkFloat::MulInt(int32_t packed, int n) |
-{ |
- return Mul(packed, SetShift(n, 0)); |
-} |
- |
-int32_t SkFloat::Div(int32_t packed_n, int32_t packed_d) |
-{ |
- SkASSERT(packed_d != 0); |
- |
- if (packed_n == 0) |
- return 0; |
- |
- int exp_n = get_unsigned_exp(packed_n); |
- int exp_d = get_unsigned_exp(packed_d); |
- |
- int value_n = get_signed_value(packed_n); |
- int value_d = get_signed_value(packed_d); |
- |
- return SkFloat::SetShift(SkDivBits(value_n, value_d, 24), exp_n - exp_d - 24); |
-} |
- |
-int32_t SkFloat::DivInt(int32_t packed, int n) |
-{ |
- return Div(packed, SetShift(n, 0)); |
-} |
- |
-int32_t SkFloat::Invert(int32_t packed) |
-{ |
- return Div(packed, SetShift(1, 0)); |
-} |
- |
-int32_t SkFloat::Sqrt(int32_t packed) |
-{ |
- if (packed < 0) |
- { |
- SkDEBUGFAIL("can't sqrt a negative number"); |
- return 0; |
- } |
- |
- int exp = get_unsigned_exp(packed); |
- int value = get_unsigned_value(packed); |
- |
- int nexp = exp - EXP_BIAS; |
- int root = SkSqrtBits(value << (nexp & 1), 26); |
- nexp >>= 1; |
- return SkFloat::SetShift(root, nexp - 11); |
-} |
- |
-#if defined _WIN32 && _MSC_VER >= 1300 // disable warning : unreachable code |
-#pragma warning ( push ) |
-#pragma warning ( disable : 4702 ) |
-#endif |
- |
-int32_t SkFloat::CubeRoot(int32_t packed) |
-{ |
- sk_throw(); |
- return 0; |
-} |
- |
-#if defined _WIN32 && _MSC_VER >= 1300 |
-#pragma warning ( pop ) |
-#endif |
- |
-static inline int32_t clear_high_bit(int32_t n) |
-{ |
- return ((uint32_t)(n << 1)) >> 1; |
-} |
- |
-static inline int int_sign(int32_t a, int32_t b) |
-{ |
- return a > b ? 1 : (a < b ? -1 : 0); |
-} |
- |
-int SkFloat::Cmp(int32_t packed_a, int32_t packed_b) |
-{ |
- packed_a = SkApplySign(clear_high_bit(packed_a), SkExtractSign(packed_a)); |
- packed_b = SkApplySign(clear_high_bit(packed_b), SkExtractSign(packed_b)); |
- |
- return int_sign(packed_a, packed_b); |
-} |
- |
-///////////////////////////////////////////////////////////////////////////////////// |
-///////////////////////////////////////////////////////////////////////////////////// |
- |
-#ifdef SK_DEBUG |
- |
-#include "SkRandom.h" |
-#include "SkFloatingPoint.h" |
- |
-void SkFloat::UnitTest() |
-{ |
-#if 0 // def SK_SUPPORT_UNITTEST |
- SkFloat a, b, c, d; |
- int n; |
- |
- a.setZero(); |
- n = a.getInt(); |
- SkASSERT(n == 0); |
- |
- b.setInt(5); |
- n = b.getInt(); |
- SkASSERT(n == 5); |
- |
- c.setInt(-3); |
- n = c.getInt(); |
- SkASSERT(n == -3); |
- |
- d.setAdd(c, b); |
- SkDebugf("SkFloat: %d + %d = %d\n", c.getInt(), b.getInt(), d.getInt()); |
- |
- SkRandom rand; |
- |
- int i; |
- for (i = 0; i < 1000; i++) |
- { |
- float fa, fb; |
- int aa = rand.nextS() >> 14; |
- int bb = rand.nextS() >> 14; |
- a.setInt(aa); |
- b.setInt(bb); |
- SkASSERT(a.getInt() == aa); |
- SkASSERT(b.getInt() == bb); |
- |
- c.setAdd(a, b); |
- int cc = c.getInt(); |
- SkASSERT(cc == aa + bb); |
- |
- c.setSub(a, b); |
- cc = c.getInt(); |
- SkASSERT(cc == aa - bb); |
- |
- aa >>= 5; |
- bb >>= 5; |
- a.setInt(aa); |
- b.setInt(bb); |
- c.setMul(a, b); |
- cc = c.getInt(); |
- SkASSERT(cc == aa * bb); |
- ///////////////////////////////////// |
- |
- aa = rand.nextS() >> 11; |
- a.setFixed(aa); |
- cc = a.getFixed(); |
- SkASSERT(aa == cc); |
- |
- bb = rand.nextS() >> 11; |
- b.setFixed(bb); |
- cc = b.getFixed(); |
- SkASSERT(bb == cc); |
- |
- cc = SkFixedMul(aa, bb); |
- c.setMul(a, b); |
- SkFixed dd = c.getFixed(); |
- int diff = cc - dd; |
- SkASSERT(SkAbs32(diff) <= 1); |
- |
- fa = (float)aa / 65536.0f; |
- fb = (float)bb / 65536.0f; |
- a.assertEquals(fa); |
- b.assertEquals(fb); |
- fa = a.getFloat(); |
- fb = b.getFloat(); |
- |
- c.assertEquals(fa * fb, 1); |
- |
- c.setDiv(a, b); |
- cc = SkFixedDiv(aa, bb); |
- dd = c.getFixed(); |
- diff = cc - dd; |
- SkASSERT(SkAbs32(diff) <= 3); |
- |
- c.assertEquals(fa / fb, 1); |
- |
- SkASSERT((aa == bb) == (a == b)); |
- SkASSERT((aa != bb) == (a != b)); |
- SkASSERT((aa < bb) == (a < b)); |
- SkASSERT((aa <= bb) == (a <= b)); |
- SkASSERT((aa > bb) == (a > b)); |
- SkASSERT((aa >= bb) == (a >= b)); |
- |
- if (aa < 0) |
- { |
- aa = -aa; |
- fa = -fa; |
- } |
- a.setFixed(aa); |
- c.setSqrt(a); |
- cc = SkFixedSqrt(aa); |
- dd = c.getFixed(); |
- SkASSERT(dd == cc); |
- |
- c.assertEquals(sk_float_sqrt(fa), 2); |
- |
- // cuberoot |
-#if 0 |
- a.setInt(1); |
- a.cubeRoot(); |
- a.assertEquals(1.0f, 0); |
- a.setInt(8); |
- a.cubeRoot(); |
- a.assertEquals(2.0f, 0); |
- a.setInt(27); |
- a.cubeRoot(); |
- a.assertEquals(3.0f, 0); |
-#endif |
- } |
-#endif |
-} |
- |
-#endif |