180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkScalar_DEFINED 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScalar_DEFINED 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkFixed.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkFloatingPoint.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** \file SkScalar.h 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Types and macros for the data type SkScalar. This is the fractional numeric type 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru that, depending on the compile-time flag SK_SCALAR_IS_FLOAT, may be implemented 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru either as an IEEE float, or as a 16.16 SkFixed. The macros in this file are written 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru to allow the calling code to manipulate SkScalar values without knowing which representation 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru is in effect. 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/ 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_SCALAR_IS_FLOAT 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkScalar is our type for fractional values and coordinates. Depending on 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru compile configurations, it is either represented as an IEEE float, or 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru as a 16.16 fixed point integer. 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef float SkScalar; 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_Scalar1 is defined to be 1.0 represented as an SkScalar 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_Scalar1 (1.0f) 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_Scalar1 is defined to be 1/2 represented as an SkScalar 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarHalf (0.5f) 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarInfinity is defined to be infinity as an SkScalar 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 41363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger #define SK_ScalarInfinity SK_FloatInfinity 42d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger /** SK_ScalarNegativeInfinity is defined to be negative infinity as an SkScalar 43d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger */ 44d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger #define SK_ScalarNegativeInfinity SK_FloatNegativeInfinity 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarMax is defined to be the largest value representable as an SkScalar 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMax (3.402823466e+38f) 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarMin is defined to be the smallest value representable as an SkScalar 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMin (-SK_ScalarMax) 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarNaN is defined to be 'Not a Number' as an SkScalar 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 53363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger #define SK_ScalarNaN SK_FloatNaN 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkScalarIsNaN(n) returns true if argument is not a number 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsNaN(float x) { return x != x; } 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns true if x is not NaN and not infinite */ 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsFinite(float x) { 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // We rely on the following behavior of infinities and nans 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // 0 * finite --> 0 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // 0 * infinity --> NaN 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // 0 * NaN --> NaN 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float prod = x * 0; 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // At this point, prod will either be NaN or 0 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Therefore we can return (prod == prod) or (0 == prod). 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return prod == prod; 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkIntToScalar(n) returns its integer argument as an SkScalar 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkIntToScalar(n) ((float)(n)) 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkFixedToScalar(n) returns its SkFixed argument as an SkScalar 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFixedToScalar(x) SkFixedToFloat(x) 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkScalarToFixed(n) returns its SkScalar argument as an SkFixed 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFixed(x) SkFloatToFixed(x) 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFloat(n) (n) 81910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#ifndef SK_SCALAR_TO_FLOAT_EXCLUDED 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFloatToScalar(n) (n) 83910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#endif 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToDouble(n) (double)(n) 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDoubleToScalar(n) (float)(n) 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkScalarFraction(x) returns the signed fractional part of the argument 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFraction(x) sk_float_mod(x, 1.0f) 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToScalar(x) sk_float_floor(x) 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToScalar(x) sk_float_ceil(x) 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToScalar(x) sk_float_floor((x) + 0.5f) 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToInt(x) sk_float_floor2int(x) 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToInt(x) sk_float_ceil2int(x) 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToInt(x) sk_float_round2int(x) 99096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger #define SkScalarTruncToInt(x) static_cast<int>(x) 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the absolute value of the specified SkScalar 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAbs(x) sk_float_abs(x) 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Return x with the sign of y 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCopySign(x, y) sk_float_copysign(x, y) 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the value pinned between 0 and max inclusive 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkScalarClampMax(SkScalar x, SkScalar max) { 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < 0 ? 0 : x > max ? max : x; 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the value pinned between min and max inclusive 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkScalarPin(SkScalar x, SkScalar min, SkScalar max) { 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < min ? min : x > max ? max : x; 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the specified SkScalar squared (x*x) 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkScalarSquare(SkScalar x) { return x * x; } 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of two SkScalars 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMul(a, b) ((float)(a) * (b)) 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of two SkScalars plus a third SkScalar 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulAdd(a, b, c) ((float)(a) * (b) + (c)) 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of a SkScalar and an int rounded to the nearest integer value 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulRound(a, b) SkScalarRound((float)(a) * (b)) 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of a SkScalar and an int promoted to the next larger int 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulCeil(a, b) SkScalarCeil((float)(a) * (b)) 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of a SkScalar and an int truncated to the next smaller int 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulFloor(a, b) SkScalarFloor((float)(a) * (b)) 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the quotient of two SkScalars (a/b) 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarDiv(a, b) ((float)(a) / (b)) 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the mod of two SkScalars (a mod b) 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMod(x,y) sk_float_mod(x,y) 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of the first two arguments, divided by the third argument 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulDiv(a, b, c) ((float)(a) * (b) / (c)) 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the multiplicative inverse of the SkScalar (1/x) 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarInvert(x) (SK_Scalar1 / (x)) 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFastInvert(x) (SK_Scalar1 / (x)) 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the square root of the SkScalar 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSqrt(x) sk_float_sqrt(x) 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns b to the e 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarPow(b, e) sk_float_pow(b, e) 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the average of two SkScalars (a+b)/2 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAve(a, b) (((a) + (b)) * 0.5f) 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the geometric mean of two SkScalars 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMean(a, b) sk_float_sqrt((float)(a) * (b)) 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns one half of the specified SkScalar 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarHalf(a) ((a) * 0.5f) 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarSqrt2 1.41421356f 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarPI 3.14159265f 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarTanPIOver8 0.414213562f 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarRoot2Over2 0.707106781f 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDegreesToRadians(degrees) ((degrees) * (SK_ScalarPI / 180)) 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float SkScalarSinCos(SkScalar radians, SkScalar* cosValue); 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSin(radians) (float)sk_float_sin(radians) 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCos(radians) (float)sk_float_cos(radians) 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarTan(radians) (float)sk_float_tan(radians) 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarASin(val) (float)sk_float_asin(val) 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarACos(val) (float)sk_float_acos(val) 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarATan2(y, x) (float)sk_float_atan2(y,x) 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarExp(x) (float)sk_float_exp(x) 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarLog(x) (float)sk_float_log(x) 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkMaxScalar(SkScalar a, SkScalar b) { return a > b ? a : b; } 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkMinScalar(SkScalar a, SkScalar b) { return a < b ? a : b; } 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsInt(SkScalar x) { 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x == (float)(int)x; 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkFixed SkScalar; 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_Scalar1 SK_Fixed1 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarHalf SK_FixedHalf 191d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger #define SK_ScalarInfinity SK_FixedMax 192d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger #define SK_ScalarNegativeInfinity SK_FixedMin 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMax SK_FixedMax 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMin SK_FixedMin 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarNaN SK_FixedNaN 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarIsNaN(x) ((x) == SK_FixedNaN) 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarIsFinite(x) ((x) != SK_FixedNaN) 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkIntToScalar(n) SkIntToFixed(n) 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFixedToScalar(x) (x) 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFixed(x) (x) 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFloat(n) SkFixedToFloat(n) 203910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#ifndef SK_SCALAR_TO_FLOAT_EXCLUDED 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFloatToScalar(n) SkFloatToFixed(n) 205910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger#endif 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToDouble(n) SkFixedToDouble(n) 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDoubleToScalar(n) SkDoubleToFixed(n) 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFraction(x) SkFixedFraction(x) 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToScalar(x) SkFixedFloorToFixed(x) 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToScalar(x) SkFixedCeilToFixed(x) 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToScalar(x) SkFixedRoundToFixed(x) 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToInt(x) SkFixedFloorToInt(x) 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToInt(x) SkFixedCeilToInt(x) 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToInt(x) SkFixedRoundToInt(x) 218096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger #define SkScalarTruncToInt(x) (((x) < 0) ? SkScalarCeilToInt(x) : SkScalarFloorToInt(x)) 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAbs(x) SkFixedAbs(x) 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCopySign(x, y) SkCopySign32(x, y) 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarClampMax(x, max) SkClampMax(x, max) 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarPin(x, min, max) SkPin32(x, min, max) 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSquare(x) SkFixedSquare(x) 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMul(a, b) SkFixedMul(a, b) 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulAdd(a, b, c) SkFixedMulAdd(a, b, c) 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulRound(a, b) SkFixedMulCommon(a, b, SK_FixedHalf) 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulCeil(a, b) SkFixedMulCommon(a, b, SK_Fixed1 - 1) 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulFloor(a, b) SkFixedMulCommon(a, b, 0) 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarDiv(a, b) SkFixedDiv(a, b) 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMod(a, b) SkFixedMod(a, b) 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulDiv(a, b, c) SkMulDiv(a, b, c) 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarInvert(x) SkFixedInvert(x) 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFastInvert(x) SkFixedFastInvert(x) 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSqrt(x) SkFixedSqrt(x) 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAve(a, b) SkFixedAve(a, b) 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMean(a, b) SkFixedMean(a, b) 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarHalf(a) ((a) >> 1) 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarSqrt2 SK_FixedSqrt2 24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarPI SK_FixedPI 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarTanPIOver8 SK_FixedTanPIOver8 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarRoot2Over2 SK_FixedRoot2Over2 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDegreesToRadians(degrees) SkFractMul(degrees, SK_FractPIOver180) 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSinCos(radians, cosPtr) SkFixedSinCos(radians, cosPtr) 24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSin(radians) SkFixedSin(radians) 24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCos(radians) SkFixedCos(radians) 24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarTan(val) SkFixedTan(val) 25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarASin(val) SkFixedASin(val) 25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarACos(val) SkFixedACos(val) 25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarATan2(y, x) SkFixedATan2(y,x) 25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarExp(x) SkFixedExp(x) 25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarLog(x) SkFixedLog(x) 25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkMaxScalar(a, b) SkMax32(a, b) 25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkMinScalar(a, b) SkMin32(a, b) 25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsInt(SkFixed x) { 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0 == (x & 0xffff); 26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// DEPRECATED : use ToInt or ToScalar variant 26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScalarFloor(x) SkScalarFloorToInt(x) 26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScalarCeil(x) SkScalarCeilToInt(x) 26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScalarRound(x) SkScalarRoundToInt(x) 26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Returns -1 || 0 || 1 depending on the sign of value: 27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * -1 if x < 0 27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 0 if x == 0 27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 1 if x > 0 27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline int SkScalarSignAsInt(SkScalar x) { 27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < 0 ? -1 : (x > 0); 27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Scalar result version of above 28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkScalar SkScalarSignAsScalar(SkScalar x) { 28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < 0 ? -SK_Scalar1 : ((x > 0) ? SK_Scalar1 : 0); 28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SK_ScalarNearlyZero (SK_Scalar1 / (1 << 12)) 28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline bool SkScalarNearlyZero(SkScalar x, 28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar tolerance = SK_ScalarNearlyZero) { 28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(tolerance >= 0); 28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkScalarAbs(x) <= tolerance; 29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline bool SkScalarNearlyEqual(SkScalar x, SkScalar y, 29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar tolerance = SK_ScalarNearlyZero) { 29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(tolerance >= 0); 29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkScalarAbs(x-y) <= tolerance; 29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Linearly interpolate between A and B, based on t. 29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru If t is 0, return A 30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru If t is 1, return B 30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru else interpolate. 30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru t must be [0..SK_Scalar1] 30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/ 30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkScalar SkScalarInterp(SkScalar A, SkScalar B, SkScalar t) { 30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(t >= 0 && t <= SK_Scalar1); 30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return A + SkScalarMul(B - A, t); 30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkScalar SkScalarLog2(SkScalar x) { 31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static const SkScalar log2_conversion_factor = SkScalarDiv(1, SkScalarLog(2)); 31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkScalarMul(SkScalarLog(x), log2_conversion_factor); 31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Interpolate along the function described by (keys[length], values[length]) 31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for the passed searchKey. SearchKeys outside the range keys[0]-keys[Length] 31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru clamp to the min or max value. This function was inspired by a desire 31880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru to change the multiplier for thickness in fakeBold; therefore it assumes 31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru the number of pairs (length) will be small, and a linear search is used. 32080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Repeated keys are allowed for discontinuous functions (so long as keys is 32180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru monotonically increasing), and if key is the value of a repeated scalar in 32280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru keys, the first one will be used. However, that may change if a binary 32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru search is used. 32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/ 32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[], 32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar values[], int length); 32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 328363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger/* 329363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger * Helper to compare an array of scalars. 330363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger */ 331363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerstatic inline bool SkScalarsEqual(const SkScalar a[], const SkScalar b[], int n) { 332363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#ifdef SK_SCALAR_IS_FLOAT 333363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkASSERT(n >= 0); 334363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger for (int i = 0; i < n; ++i) { 335363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger if (a[i] != b[i]) { 336363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return false; 337363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 338363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 339363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return true; 340363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#else 341363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return 0 == memcmp(a, b, n * sizeof(SkScalar)); 342363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger#endif 343363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger} 344363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 34580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 346