SkScalar.h revision 80bacfeb4bda06541e8695bd502229727bccfea
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 extern const uint32_t gIEEENotANumber; 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru extern const uint32_t gIEEEInfinity; 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_Scalar1 is defined to be 1.0 represented as an SkScalar 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_Scalar1 (1.0f) 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_Scalar1 is defined to be 1/2 represented as an SkScalar 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarHalf (0.5f) 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarInfinity is defined to be infinity as an SkScalar 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarInfinity (*SkTCast<const float*>(&gIEEEInfinity)) 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarMax is defined to be the largest value representable as an SkScalar 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMax (3.402823466e+38f) 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarMin is defined to be the smallest value representable as an SkScalar 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMin (-SK_ScalarMax) 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SK_ScalarNaN is defined to be 'Not a Number' as an SkScalar 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarNaN (*SkTCast<const float*>(&gIEEENotANumber)) 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkScalarIsNaN(n) returns true if argument is not a number 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsNaN(float x) { return x != x; } 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns true if x is not NaN and not infinite */ 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsFinite(float x) { 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // We rely on the following behavior of infinities and nans 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // 0 * finite --> 0 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // 0 * infinity --> NaN 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // 0 * NaN --> NaN 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float prod = x * 0; 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // At this point, prod will either be NaN or 0 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // Therefore we can return (prod == prod) or (0 == prod). 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return prod == prod; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkIntToScalar(n) returns its integer argument as an SkScalar 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * If we're compiling in DEBUG mode, and can thus afford some extra runtime 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * cycles, check to make sure that the parameter passed in has not already 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * been converted to SkScalar. (A double conversion like this is harmless 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * for SK_SCALAR_IS_FLOAT, but for SK_SCALAR_IS_FIXED this causes trouble.) 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Note that we need all of these method signatures to properly handle the 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * various types that we pass into SkIntToScalar() to date: 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * int, size_t, U8CPU, etc., even though what we really mean is "anything 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * but a float". 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline float SkIntToScalar(signed int param) { 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return (float)param; 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline float SkIntToScalar(unsigned int param) { 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return (float)param; 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline float SkIntToScalar(signed long param) { 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return (float)param; 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline float SkIntToScalar(unsigned long param) { 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return (float)param; 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline float SkIntToScalar(float /* param */) { 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /* If the parameter passed into SkIntToScalar is a float, 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * one of two things has happened: 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 1. the parameter was an SkScalar (which is typedef'd to float) 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 2. the parameter was a float instead of an int 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Either way, it's not good. 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkDEBUGFAIL("looks like you passed an SkScalar into SkIntToScalar"); 10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return (float)0; 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else // not SK_DEBUG 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkIntToScalar(n) returns its integer argument as an SkScalar 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkIntToScalar(n) ((float)(n)) 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif // not SK_DEBUG 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkFixedToScalar(n) returns its SkFixed argument as an SkScalar 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFixedToScalar(x) SkFixedToFloat(x) 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkScalarToFixed(n) returns its SkScalar argument as an SkFixed 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFixed(x) SkFloatToFixed(x) 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFloat(n) (n) 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFloatToScalar(n) (n) 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToDouble(n) (double)(n) 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDoubleToScalar(n) (float)(n) 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** SkScalarFraction(x) returns the signed fractional part of the argument 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFraction(x) sk_float_mod(x, 1.0f) 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToScalar(x) sk_float_floor(x) 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToScalar(x) sk_float_ceil(x) 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToScalar(x) sk_float_floor((x) + 0.5f) 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToInt(x) sk_float_floor2int(x) 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToInt(x) sk_float_ceil2int(x) 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToInt(x) sk_float_round2int(x) 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the absolute value of the specified SkScalar 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAbs(x) sk_float_abs(x) 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Return x with the sign of y 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCopySign(x, y) sk_float_copysign(x, y) 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the value pinned between 0 and max inclusive 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkScalarClampMax(SkScalar x, SkScalar max) { 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < 0 ? 0 : x > max ? max : x; 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the value pinned between min and max inclusive 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkScalarPin(SkScalar x, SkScalar min, SkScalar max) { 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < min ? min : x > max ? max : x; 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the specified SkScalar squared (x*x) 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkScalarSquare(SkScalar x) { return x * x; } 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of two SkScalars 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMul(a, b) ((float)(a) * (b)) 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of two SkScalars plus a third SkScalar 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulAdd(a, b, c) ((float)(a) * (b) + (c)) 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of a SkScalar and an int rounded to the nearest integer value 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulRound(a, b) SkScalarRound((float)(a) * (b)) 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of a SkScalar and an int promoted to the next larger int 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulCeil(a, b) SkScalarCeil((float)(a) * (b)) 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of a SkScalar and an int truncated to the next smaller int 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulFloor(a, b) SkScalarFloor((float)(a) * (b)) 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the quotient of two SkScalars (a/b) 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarDiv(a, b) ((float)(a) / (b)) 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the mod of two SkScalars (a mod b) 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMod(x,y) sk_float_mod(x,y) 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the product of the first two arguments, divided by the third argument 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulDiv(a, b, c) ((float)(a) * (b) / (c)) 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the multiplicative inverse of the SkScalar (1/x) 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarInvert(x) (SK_Scalar1 / (x)) 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFastInvert(x) (SK_Scalar1 / (x)) 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the square root of the SkScalar 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSqrt(x) sk_float_sqrt(x) 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns b to the e 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarPow(b, e) sk_float_pow(b, e) 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the average of two SkScalars (a+b)/2 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAve(a, b) (((a) + (b)) * 0.5f) 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns the geometric mean of two SkScalars 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMean(a, b) sk_float_sqrt((float)(a) * (b)) 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru /** Returns one half of the specified SkScalar 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarHalf(a) ((a) * 0.5f) 19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarSqrt2 1.41421356f 19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarPI 3.14159265f 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarTanPIOver8 0.414213562f 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarRoot2Over2 0.707106781f 20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDegreesToRadians(degrees) ((degrees) * (SK_ScalarPI / 180)) 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float SkScalarSinCos(SkScalar radians, SkScalar* cosValue); 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSin(radians) (float)sk_float_sin(radians) 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCos(radians) (float)sk_float_cos(radians) 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarTan(radians) (float)sk_float_tan(radians) 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarASin(val) (float)sk_float_asin(val) 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarACos(val) (float)sk_float_acos(val) 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarATan2(y, x) (float)sk_float_atan2(y,x) 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarExp(x) (float)sk_float_exp(x) 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarLog(x) (float)sk_float_log(x) 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkMaxScalar(SkScalar a, SkScalar b) { return a > b ? a : b; } 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru inline SkScalar SkMinScalar(SkScalar a, SkScalar b) { return a < b ? a : b; } 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsInt(SkScalar x) { 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x == (float)(int)x; 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else 22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkFixed SkScalar; 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_Scalar1 SK_Fixed1 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarHalf SK_FixedHalf 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarInfinity SK_FixedMax 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMax SK_FixedMax 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarMin SK_FixedMin 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarNaN SK_FixedNaN 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarIsNaN(x) ((x) == SK_FixedNaN) 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarIsFinite(x) ((x) != SK_FixedNaN) 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkIntToScalar(n) SkIntToFixed(n) 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFixedToScalar(x) (x) 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFixed(x) (x) 23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToFloat(n) SkFixedToFloat(n) 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkFloatToScalar(n) SkFloatToFixed(n) 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarToDouble(n) SkFixedToDouble(n) 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDoubleToScalar(n) SkDoubleToFixed(n) 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFraction(x) SkFixedFraction(x) 24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToScalar(x) SkFixedFloorToFixed(x) 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToScalar(x) SkFixedCeilToFixed(x) 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToScalar(x) SkFixedRoundToFixed(x) 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFloorToInt(x) SkFixedFloorToInt(x) 24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCeilToInt(x) SkFixedCeilToInt(x) 24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarRoundToInt(x) SkFixedRoundToInt(x) 24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAbs(x) SkFixedAbs(x) 25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCopySign(x, y) SkCopySign32(x, y) 25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarClampMax(x, max) SkClampMax(x, max) 25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarPin(x, min, max) SkPin32(x, min, max) 25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSquare(x) SkFixedSquare(x) 25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMul(a, b) SkFixedMul(a, b) 25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulAdd(a, b, c) SkFixedMulAdd(a, b, c) 25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulRound(a, b) SkFixedMulCommon(a, b, SK_FixedHalf) 25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulCeil(a, b) SkFixedMulCommon(a, b, SK_Fixed1 - 1) 25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulFloor(a, b) SkFixedMulCommon(a, b, 0) 26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarDiv(a, b) SkFixedDiv(a, b) 26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMod(a, b) SkFixedMod(a, b) 26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMulDiv(a, b, c) SkMulDiv(a, b, c) 26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarInvert(x) SkFixedInvert(x) 26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarFastInvert(x) SkFixedFastInvert(x) 26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSqrt(x) SkFixedSqrt(x) 26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarAve(a, b) SkFixedAve(a, b) 26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarMean(a, b) SkFixedMean(a, b) 26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarHalf(a) ((a) >> 1) 26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarSqrt2 SK_FixedSqrt2 27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarPI SK_FixedPI 27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarTanPIOver8 SK_FixedTanPIOver8 27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SK_ScalarRoot2Over2 SK_FixedRoot2Over2 27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkDegreesToRadians(degrees) SkFractMul(degrees, SK_FractPIOver180) 27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSinCos(radians, cosPtr) SkFixedSinCos(radians, cosPtr) 27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarSin(radians) SkFixedSin(radians) 27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarCos(radians) SkFixedCos(radians) 27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarTan(val) SkFixedTan(val) 28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarASin(val) SkFixedASin(val) 28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarACos(val) SkFixedACos(val) 28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarATan2(y, x) SkFixedATan2(y,x) 28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarExp(x) SkFixedExp(x) 28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkScalarLog(x) SkFixedLog(x) 28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkMaxScalar(a, b) SkMax32(a, b) 28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru #define SkMinScalar(a, b) SkMin32(a, b) 28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static inline bool SkScalarIsInt(SkFixed x) { 29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0 == (x & 0xffff); 29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// DEPRECATED : use ToInt or ToScalar variant 29580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScalarFloor(x) SkScalarFloorToInt(x) 29680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScalarCeil(x) SkScalarCeilToInt(x) 29780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkScalarRound(x) SkScalarRoundToInt(x) 29880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 29980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** 30080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Returns -1 || 0 || 1 depending on the sign of value: 30180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * -1 if x < 0 30280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 0 if x == 0 30380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 1 if x > 0 30480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 30580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline int SkScalarSignAsInt(SkScalar x) { 30680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < 0 ? -1 : (x > 0); 30780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 30880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 30980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// Scalar result version of above 31080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkScalar SkScalarSignAsScalar(SkScalar x) { 31180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return x < 0 ? -SK_Scalar1 : ((x > 0) ? SK_Scalar1 : 0); 31280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 31380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 31480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SK_ScalarNearlyZero (SK_Scalar1 / (1 << 12)) 31580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 31680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline bool SkScalarNearlyZero(SkScalar x, 31780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar tolerance = SK_ScalarNearlyZero) { 31880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(tolerance >= 0); 31980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkScalarAbs(x) <= tolerance; 32080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 32180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 32280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline bool SkScalarNearlyEqual(SkScalar x, SkScalar y, 32380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar tolerance = SK_ScalarNearlyZero) { 32480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(tolerance >= 0); 32580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkScalarAbs(x-y) <= tolerance; 32680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 32780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 32880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Linearly interpolate between A and B, based on t. 32980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru If t is 0, return A 33080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru If t is 1, return B 33180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru else interpolate. 33280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru t must be [0..SK_Scalar1] 33380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/ 33480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkScalar SkScalarInterp(SkScalar A, SkScalar B, SkScalar t) { 33580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkASSERT(t >= 0 && t <= SK_Scalar1); 33680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return A + SkScalarMul(B - A, t); 33780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 33880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 33980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic inline SkScalar SkScalarLog2(SkScalar x) { 34080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru static const SkScalar log2_conversion_factor = SkScalarDiv(1, SkScalarLog(2)); 34180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 34280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return SkScalarMul(SkScalarLog(x), log2_conversion_factor); 34380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 34480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 34580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/** Interpolate along the function described by (keys[length], values[length]) 34680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for the passed searchKey. SearchKeys outside the range keys[0]-keys[Length] 34780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru clamp to the min or max value. This function was inspired by a desire 34880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru to change the multiplier for thickness in fakeBold; therefore it assumes 34980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru the number of pairs (length) will be small, and a linear search is used. 35080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru Repeated keys are allowed for discontinuous functions (so long as keys is 35180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru monotonically increasing), and if key is the value of a repeated scalar in 35280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru keys, the first one will be used. However, that may change if a binary 35380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru search is used. 35480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/ 35580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkScalar SkScalarInterpFunc(SkScalar searchKey, const SkScalar keys[], 35680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar values[], int length); 35780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 35880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 359