1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2008 The Android Open Source Project 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 9cb93a386Sopenharmony_ci#include "include/private/SkFixed.h" 10cb93a386Sopenharmony_ci#include "include/private/SkFloatBits.h" 11cb93a386Sopenharmony_ci#include "include/private/SkFloatingPoint.h" 12cb93a386Sopenharmony_ci#include "src/core/SkMathPriv.h" 13cb93a386Sopenharmony_ci#include "src/core/SkSafeMath.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci/* www.worldserver.com/turk/computergraphics/FixedSqrt.pdf 18cb93a386Sopenharmony_ci*/ 19cb93a386Sopenharmony_ciint32_t SkSqrtBits(int32_t x, int count) { 20cb93a386Sopenharmony_ci SkASSERT(x >= 0 && count > 0 && (unsigned)count <= 30); 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci uint32_t root = 0; 23cb93a386Sopenharmony_ci uint32_t remHi = 0; 24cb93a386Sopenharmony_ci uint32_t remLo = x; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci do { 27cb93a386Sopenharmony_ci root <<= 1; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci remHi = (remHi<<2) | (remLo>>30); 30cb93a386Sopenharmony_ci remLo <<= 2; 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci uint32_t testDiv = (root << 1) + 1; 33cb93a386Sopenharmony_ci if (remHi >= testDiv) { 34cb93a386Sopenharmony_ci remHi -= testDiv; 35cb93a386Sopenharmony_ci root++; 36cb93a386Sopenharmony_ci } 37cb93a386Sopenharmony_ci } while (--count >= 0); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci return root; 40cb93a386Sopenharmony_ci} 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_cisize_t SkSafeMath::Add(size_t x, size_t y) { 45cb93a386Sopenharmony_ci SkSafeMath tmp; 46cb93a386Sopenharmony_ci size_t sum = tmp.add(x, y); 47cb93a386Sopenharmony_ci return tmp.ok() ? sum : SIZE_MAX; 48cb93a386Sopenharmony_ci} 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_cisize_t SkSafeMath::Mul(size_t x, size_t y) { 51cb93a386Sopenharmony_ci SkSafeMath tmp; 52cb93a386Sopenharmony_ci size_t prod = tmp.mul(x, y); 53cb93a386Sopenharmony_ci return tmp.ok() ? prod : SIZE_MAX; 54cb93a386Sopenharmony_ci} 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////////////////////////// 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_cibool sk_floats_are_unit(const float array[], size_t count) { 59cb93a386Sopenharmony_ci bool is_unit = true; 60cb93a386Sopenharmony_ci for (size_t i = 0; i < count; ++i) { 61cb93a386Sopenharmony_ci is_unit &= (array[i] >= 0) & (array[i] <= 1); 62cb93a386Sopenharmony_ci } 63cb93a386Sopenharmony_ci return is_unit; 64cb93a386Sopenharmony_ci} 65