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