18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkScalar_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkScalar_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1195dd17737d0fa0401782f7fa72e5d69bb5686f67reed#include "../private/SkFloatingPoint.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
138233fc82b00763d37a7b0db7890b15c7d58939d4Leon Scroggins#undef SK_SCALAR_IS_FLOAT
148233fc82b00763d37a7b0db7890b15c7d58939d4Leon Scroggins#define SK_SCALAR_IS_FLOAT  1
158233fc82b00763d37a7b0db7890b15c7d58939d4Leon Scroggins
16bd1605905b1ce165e6b5891547c2b612358b47a8reedtypedef float SkScalar;
17bd1605905b1ce165e6b5891547c2b612358b47a8reed
18bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_Scalar1                  1.0f
19bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarHalf               0.5f
20bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarSqrt2              1.41421356f
21bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarPI                 3.14159265f
22bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarTanPIOver8         0.414213562f
23bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarRoot2Over2         0.707106781f
24bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarMax                3.402823466e+38f
25bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarInfinity           SK_FloatInfinity
26bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarNegativeInfinity   SK_FloatNegativeInfinity
27bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarNaN                SK_FloatNaN
28bd1605905b1ce165e6b5891547c2b612358b47a8reed
298f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarFloorToScalar(x)    sk_float_floor(x)
308f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarCeilToScalar(x)     sk_float_ceil(x)
318f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarRoundToScalar(x)    sk_float_floor((x) + 0.5f)
32dd67e3d1b3c1e9f400f1ddd37e9e52c8a2952eecbungeman#define SkScalarTruncToScalar(x)    sk_float_trunc(x)
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
348f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarFloorToInt(x)       sk_float_floor2int(x)
358f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarCeilToInt(x)        sk_float_ceil2int(x)
368f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarRoundToInt(x)       sk_float_round2int(x)
37bd1605905b1ce165e6b5891547c2b612358b47a8reed
38bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarAbs(x)              sk_float_abs(x)
39bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarCopySign(x, y)      sk_float_copysign(x, y)
40bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarMod(x, y)           sk_float_mod(x,y)
41bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarSqrt(x)             sk_float_sqrt(x)
42bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarPow(b, e)           sk_float_pow(b, e)
43bd1605905b1ce165e6b5891547c2b612358b47a8reed
44bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarSin(radians)        (float)sk_float_sin(radians)
45bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarCos(radians)        (float)sk_float_cos(radians)
46bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarTan(radians)        (float)sk_float_tan(radians)
47bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarASin(val)           (float)sk_float_asin(val)
48bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarACos(val)           (float)sk_float_acos(val)
49bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarATan2(y, x)         (float)sk_float_atan2(y,x)
50bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarExp(x)              (float)sk_float_exp(x)
51bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarLog(x)              (float)sk_float_log(x)
527729e56a29a44bd47c69c8dc3247421595940accreed#define SkScalarLog2(x)             (float)sk_float_log2(x)
53bd1605905b1ce165e6b5891547c2b612358b47a8reed
54bd1605905b1ce165e6b5891547c2b612358b47a8reed//////////////////////////////////////////////////////////////////////////////////////////////////
55bd1605905b1ce165e6b5891547c2b612358b47a8reed
56bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkIntToScalar(x)        static_cast<SkScalar>(x)
57f054b1766b96d270b98efd9afc87835d299d4a4erobertphillips#define SkIntToFloat(x)         static_cast<float>(x)
58bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarTruncToInt(x)   static_cast<int>(x)
59bd1605905b1ce165e6b5891547c2b612358b47a8reed
60bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarToFloat(x)      static_cast<float>(x)
61bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkFloatToScalar(x)      static_cast<SkScalar>(x)
62bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarToDouble(x)     static_cast<double>(x)
63bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkDoubleToScalar(x)     static_cast<SkScalar>(x)
64bd1605905b1ce165e6b5891547c2b612358b47a8reed
65bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SK_ScalarMin            (-SK_ScalarMax)
66bd1605905b1ce165e6b5891547c2b612358b47a8reed
67bd1605905b1ce165e6b5891547c2b612358b47a8reedstatic inline bool SkScalarIsNaN(SkScalar x) { return x != x; }
68bd1605905b1ce165e6b5891547c2b612358b47a8reed
69bd1605905b1ce165e6b5891547c2b612358b47a8reed/** Returns true if x is not NaN and not infinite
70bd1605905b1ce165e6b5891547c2b612358b47a8reed */
71bd1605905b1ce165e6b5891547c2b612358b47a8reedstatic inline bool SkScalarIsFinite(SkScalar x) {
72bd1605905b1ce165e6b5891547c2b612358b47a8reed    // We rely on the following behavior of infinities and nans
73bd1605905b1ce165e6b5891547c2b612358b47a8reed    // 0 * finite --> 0
74bd1605905b1ce165e6b5891547c2b612358b47a8reed    // 0 * infinity --> NaN
75bd1605905b1ce165e6b5891547c2b612358b47a8reed    // 0 * NaN --> NaN
76bd1605905b1ce165e6b5891547c2b612358b47a8reed    SkScalar prod = x * 0;
77bd1605905b1ce165e6b5891547c2b612358b47a8reed    // At this point, prod will either be NaN or 0
78454fa71cc31bf45c14e4c0b25502d5332d76c51creed    return !SkScalarIsNaN(prod);
79454fa71cc31bf45c14e4c0b25502d5332d76c51creed}
80454fa71cc31bf45c14e4c0b25502d5332d76c51creed
81454fa71cc31bf45c14e4c0b25502d5332d76c51creedstatic inline bool SkScalarsAreFinite(SkScalar a, SkScalar b) {
82454fa71cc31bf45c14e4c0b25502d5332d76c51creed    SkScalar prod = 0;
83454fa71cc31bf45c14e4c0b25502d5332d76c51creed    prod *= a;
84454fa71cc31bf45c14e4c0b25502d5332d76c51creed    prod *= b;
85454fa71cc31bf45c14e4c0b25502d5332d76c51creed    // At this point, prod will either be NaN or 0
86454fa71cc31bf45c14e4c0b25502d5332d76c51creed    return !SkScalarIsNaN(prod);
87454fa71cc31bf45c14e4c0b25502d5332d76c51creed}
88454fa71cc31bf45c14e4c0b25502d5332d76c51creed
89454fa71cc31bf45c14e4c0b25502d5332d76c51creedstatic inline bool SkScalarsAreFinite(const SkScalar array[], int count) {
90454fa71cc31bf45c14e4c0b25502d5332d76c51creed    SkScalar prod = 0;
91454fa71cc31bf45c14e4c0b25502d5332d76c51creed    for (int i = 0; i < count; ++i) {
92454fa71cc31bf45c14e4c0b25502d5332d76c51creed        prod *= array[i];
93454fa71cc31bf45c14e4c0b25502d5332d76c51creed    }
94454fa71cc31bf45c14e4c0b25502d5332d76c51creed    // At this point, prod will either be NaN or 0
956f90475632b0ff8e9e83916ee6373d3c26cc9284ehsan.akhgari    return !SkScalarIsNaN(prod);
96bd1605905b1ce165e6b5891547c2b612358b47a8reed}
97185d3d016d1e493694e9aaf45b070f34ba456983reed@google.com
984e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org/**
994e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *  Variant of SkScalarRoundToInt, that performs the rounding step (adding 0.5) explicitly using
1004e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *  double, to avoid possibly losing the low bit(s) of the answer before calling floor().
1014e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *
1024e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *  This routine will likely be slower than SkScalarRoundToInt(), and should only be used when the
1034e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *  extra precision is known to be valuable.
1044e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *
1054e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *  In particular, this catches the following case:
1064e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *      SkScalar x = 0.49999997;
1074e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *      int ix = SkScalarRoundToInt(x);
1084e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *      SkASSERT(0 == ix);    // <--- fails
1094e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *      ix = SkDScalarRoundToInt(x);
1104e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org *      SkASSERT(0 == ix);    // <--- succeeds
1114e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org */
1124e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.orgstatic inline int SkDScalarRoundToInt(SkScalar x) {
1134e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org    double xx = x;
1144e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org    xx += 0.5;
1154e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org    return (int)floor(xx);
1164e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org}
1174e332f82fce0126045e9cb2ef0a2097a6c4c40a3commit-bot@chromium.org
118dd67e3d1b3c1e9f400f1ddd37e9e52c8a2952eecbungeman/** Returns the fractional part of the scalar. */
119dd67e3d1b3c1e9f400f1ddd37e9e52c8a2952eecbungemanstatic inline SkScalar SkScalarFraction(SkScalar x) {
120dd67e3d1b3c1e9f400f1ddd37e9e52c8a2952eecbungeman    return x - SkScalarTruncToScalar(x);
121dd67e3d1b3c1e9f400f1ddd37e9e52c8a2952eecbungeman}
122dd67e3d1b3c1e9f400f1ddd37e9e52c8a2952eecbungeman
123bd1605905b1ce165e6b5891547c2b612358b47a8reedstatic inline SkScalar SkScalarClampMax(SkScalar x, SkScalar max) {
124167eb17cd6654a0ab6f7c544441a0defa88e3827bungeman    x = SkTMin(x, max);
125167eb17cd6654a0ab6f7c544441a0defa88e3827bungeman    x = SkTMax<SkScalar>(x, 0);
126167eb17cd6654a0ab6f7c544441a0defa88e3827bungeman    return x;
1278f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com}
128bd1605905b1ce165e6b5891547c2b612358b47a8reed
129bd1605905b1ce165e6b5891547c2b612358b47a8reedstatic inline SkScalar SkScalarPin(SkScalar x, SkScalar min, SkScalar max) {
130fd0ecf46ce7736a86dd38d8cfc96078e588d10a3bungeman    return SkTPin(x, min, max);
1318f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com}
132bd1605905b1ce165e6b5891547c2b612358b47a8reed
133bd1605905b1ce165e6b5891547c2b612358b47a8reedSkScalar SkScalarSinCos(SkScalar radians, SkScalar* cosValue);
134bd1605905b1ce165e6b5891547c2b612358b47a8reed
135bd1605905b1ce165e6b5891547c2b612358b47a8reedstatic inline SkScalar SkScalarSquare(SkScalar x) { return x * x; }
136bd1605905b1ce165e6b5891547c2b612358b47a8reed
1378f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarInvert(x)       (SK_Scalar1 / (x))
1388f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkScalarFastInvert(x)   (SK_Scalar1 / (x))
139bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarAve(a, b)       (((a) + (b)) * SK_ScalarHalf)
140bd1605905b1ce165e6b5891547c2b612358b47a8reed#define SkScalarHalf(a)         ((a) * SK_ScalarHalf)
1418f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com
1428f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com#define SkDegreesToRadians(degrees) ((degrees) * (SK_ScalarPI / 180))
143c8d732800e1a660fca6d2478fc24d6e6935ef8adcommit-bot@chromium.org#define SkRadiansToDegrees(radians) ((radians) * (180 / SK_ScalarPI))
144bd1605905b1ce165e6b5891547c2b612358b47a8reed
145bd1605905b1ce165e6b5891547c2b612358b47a8reedstatic inline SkScalar SkMaxScalar(SkScalar a, SkScalar b) { return a > b ? a : b; }
146bd1605905b1ce165e6b5891547c2b612358b47a8reedstatic inline SkScalar SkMinScalar(SkScalar a, SkScalar b) { return a < b ? a : b; }
1478f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com
1488f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.comstatic inline bool SkScalarIsInt(SkScalar x) {
149bd1605905b1ce165e6b5891547c2b612358b47a8reed    return x == (SkScalar)(int)x;
1508f4d2306fa866a26f9448048ff63f692b2ba43aareed@google.com}
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
152647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com/**
153647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com *  Returns -1 || 0 || 1 depending on the sign of value:
154647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com *  -1 if x < 0
155647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com *   0 if x == 0
156647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com *   1 if x > 0
157647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com */
158647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.comstatic inline int SkScalarSignAsInt(SkScalar x) {
159647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com    return x < 0 ? -1 : (x > 0);
160647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com}
161647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com
162647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com// Scalar result version of above
163647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.comstatic inline SkScalar SkScalarSignAsScalar(SkScalar x) {
164647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com    return x < 0 ? -SK_Scalar1 : ((x > 0) ? SK_Scalar1 : 0);
165647a804c3dd53b6743091ec97dd12111f90efec3bsalomon@google.com}
1661b20280f9b2e95fdcf4a2ee6f7f9d5a92c5b94c2reed@google.com
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SK_ScalarNearlyZero         (SK_Scalar1 / (1 << 12))
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
169187d5595901d1120d9425851e5afdd773f574502reed@android.comstatic inline bool SkScalarNearlyZero(SkScalar x,
17064b0f5f95754c4d354d2e09cebf2a0c43d4cdd50robertphillips                                      SkScalar tolerance = SK_ScalarNearlyZero) {
1719b5ca29af81b93faea040daa25a620bee99d6c38reed@google.com    SkASSERT(tolerance >= 0);
1729b5ca29af81b93faea040daa25a620bee99d6c38reed@google.com    return SkScalarAbs(x) <= tolerance;
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1751fd56dc6e189ea0e94b5df9af959c243573f8883epoger@google.comstatic inline bool SkScalarNearlyEqual(SkScalar x, SkScalar y,
17630c4cae7d3a26252e7e45adf6e5722b34adf6848robertphillips                                       SkScalar tolerance = SK_ScalarNearlyZero) {
1779b5ca29af81b93faea040daa25a620bee99d6c38reed@google.com    SkASSERT(tolerance >= 0);
1789b5ca29af81b93faea040daa25a620bee99d6c38reed@google.com    return SkScalarAbs(x-y) <= tolerance;
1791fd56dc6e189ea0e94b5df9af959c243573f8883epoger@google.com}
1801fd56dc6e189ea0e94b5df9af959c243573f8883epoger@google.com
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** Linearly interpolate between A and B, based on t.
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    If t is 0, return A
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    If t is 1, return B
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    else interpolate.
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    t must be [0..SK_Scalar1]
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
187187d5595901d1120d9425851e5afdd773f574502reed@android.comstatic inline SkScalar SkScalarInterp(SkScalar A, SkScalar B, SkScalar t) {
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(t >= 0 && t <= SK_Scalar1);
1891a5e51f94ed8cb01600184119e52bb64bdb3dcccreed@google.com    return A + (B - A) * t;
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
19228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org/** Interpolate along the function described by (keys[length], values[length])
19328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    for the passed searchKey.  SearchKeys outside the range keys[0]-keys[Length]
19428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    clamp to the min or max value.  This function was inspired by a desire
19528be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    to change the multiplier for thickness in fakeBold; therefore it assumes
19628be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    the number of pairs (length) will be small, and a linear search is used.
19728be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    Repeated keys are allowed for discontinuous functions (so long as keys is
19828be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    monotonically increasing), and if key is the value of a repeated scalar in
19928be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    keys, the first one will be used.  However, that may change if a binary
20028be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org    search is used.
20128be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org*/
20228be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.orgSkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[],
20328be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org                            const SkScalar values[], int length);
20428be72b63e457c680c192a34fb9f58e1c693363fvandebo@chromium.org
205e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com/*
206e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com *  Helper to compare an array of scalars.
207e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com */
208e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.comstatic inline bool SkScalarsEqual(const SkScalar a[], const SkScalar b[], int n) {
209e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com    SkASSERT(n >= 0);
210e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com    for (int i = 0; i < n; ++i) {
211e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com        if (a[i] != b[i]) {
212e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com            return false;
213e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com        }
214e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com    }
215e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com    return true;
216e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com}
217e1e7d7a6b55504d97ce9f30202a179b63800093breed@google.com
218df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed#ifdef SK_SUPPORT_LEGACY_SCALARMUL
219df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed    #define SkScalarMul(a, b)       ((SkScalar)(a) * (b))
220df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed    #define SkScalarMulAdd(a, b, c) ((SkScalar)(a) * (b) + (c))
221df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed    #define SkScalarMulDiv(a, b, c) ((SkScalar)(a) * (b) / (c))
222df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed#endif
223df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
225