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