123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /*
- * 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 "include/core/SkScalar.h"
- #include "include/private/SkFixed.h"
- #include "include/private/SkFloatBits.h"
- #include "include/private/SkFloatingPoint.h"
- #include "src/core/SkMathPriv.h"
- #include "src/core/SkSafeMath.h"
- #define sub_shift(zeros, x, n) \
- zeros -= n; \
- x >>= n
- int SkCLZ_portable(uint32_t x) {
- if (x == 0) {
- return 32;
- }
- int zeros = 31;
- if (x & 0xFFFF0000) {
- sub_shift(zeros, x, 16);
- }
- if (x & 0xFF00) {
- sub_shift(zeros, x, 8);
- }
- if (x & 0xF0) {
- sub_shift(zeros, x, 4);
- }
- if (x & 0xC) {
- sub_shift(zeros, x, 2);
- }
- if (x & 0x2) {
- sub_shift(zeros, x, 1);
- }
- return zeros;
- }
- ///////////////////////////////////////////////////////////////////////////////
- /* www.worldserver.com/turk/computergraphics/FixedSqrt.pdf
- */
- int32_t SkSqrtBits(int32_t x, int count) {
- SkASSERT(x >= 0 && count > 0 && (unsigned)count <= 30);
- uint32_t root = 0;
- uint32_t remHi = 0;
- uint32_t remLo = x;
- do {
- root <<= 1;
- remHi = (remHi<<2) | (remLo>>30);
- remLo <<= 2;
- uint32_t testDiv = (root << 1) + 1;
- if (remHi >= testDiv) {
- remHi -= testDiv;
- root++;
- }
- } while (--count >= 0);
- return root;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- size_t SkSafeMath::Add(size_t x, size_t y) {
- SkSafeMath tmp;
- size_t sum = tmp.add(x, y);
- return tmp.ok() ? sum : SIZE_MAX;
- }
- size_t SkSafeMath::Mul(size_t x, size_t y) {
- SkSafeMath tmp;
- size_t prod = tmp.mul(x, y);
- return tmp.ok() ? prod : SIZE_MAX;
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////
- bool sk_floats_are_unit(const float array[], size_t count) {
- bool is_unit = true;
- for (size_t i = 0; i < count; ++i) {
- is_unit &= (array[i] >= 0) & (array[i] <= 1);
- }
- return is_unit;
- }
|