00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkScalar_DEFINED
00018 #define SkScalar_DEFINED
00019
00020 #include "SkFixed.h"
00021
00031 #ifdef SK_SCALAR_IS_FLOAT
00032 #include "SkFloatingPoint.h"
00033
00038 typedef float SkScalar;
00039 extern const uint32_t gIEEENotANumber;
00040 extern const uint32_t gIEEEInfinity;
00041
00044 #define SK_Scalar1 (1.0f)
00045
00047 #define SK_ScalarHalf (0.5f)
00048
00050 #define SK_ScalarInfinity (*(const float*)&gIEEEInfinity)
00051
00053 #define SK_ScalarMax (3.4028235e+38f)
00054
00056 #define SK_ScalarMin (1.1754944e-38f)
00057
00059 #define SK_ScalarNaN (*(const float*)(const void*)&gIEEENotANumber)
00060
00062 static inline bool SkScalarIsNaN(float x) { return x != x; }
00065 #define SkIntToScalar(n) ((float)(n))
00066
00068 #define SkFixedToScalar(x) SkFixedToFloat(x)
00069
00071 #define SkScalarToFixed(x) SkFloatToFixed(x)
00072
00073 #define SkScalarToFloat(n) (n)
00074 #define SkFloatToScalar(n) (n)
00075
00076 #define SkScalarToDouble(n) (double)(n)
00077 #define SkDoubleToScalar(n) (float)(n)
00078
00081 #define SkScalarFraction(x) sk_float_mod(x, 1.0f)
00082
00084 #define SkScalarRound(x) sk_float_round2int(x)
00085
00087 #define SkScalarCeil(x) sk_float_ceil2int(x)
00088
00090 #define SkScalarFloor(x) sk_float_floor2int(x)
00091
00093 #define SkScalarAbs(x) sk_float_abs(x)
00094
00096 inline SkScalar SkScalarClampMax(SkScalar x, SkScalar max) {
00097 return x < 0 ? 0 : x > max ? max : x;
00098 }
00101 inline SkScalar SkScalarPin(SkScalar x, SkScalar min, SkScalar max) {
00102 return x < min ? min : x > max ? max : x;
00103 }
00106 inline SkScalar SkScalarSquare(SkScalar x) { return x * x; }
00109 #define SkScalarMul(a, b) ((float)(a) * (b))
00110
00112 #define SkScalarMulAdd(a, b, c) ((float)(a) * (b) + (c))
00113
00115 #define SkScalarMulRound(a, b) SkScalarRound((float)(a) * (b))
00116
00118 #define SkScalarMulCeil(a, b) SkScalarCeil((float)(a) * (b))
00119
00121 #define SkScalarMulFloor(a, b) SkScalarFloor((float)(a) * (b))
00122
00124 #define SkScalarDiv(a, b) ((float)(a) / (b))
00125
00127 #define SkScalarMod(x,y) sk_float_mod(x,y)
00128
00130 #define SkScalarMulDiv(a, b, c) ((float)(a) * (b) / (c))
00131
00133 #define SkScalarInvert(x) (SK_Scalar1 / (x))
00134 #define SkScalarFastInvert(x) (SK_Scalar1 / (x))
00135
00137 #define SkScalarSqrt(x) sk_float_sqrt(x)
00138
00140 #define SkScalarAve(a, b) (((a) + (b)) * 0.5f)
00141
00143 #define SkScalarMean(a, b) sk_float_sqrt((float)(a) * (b))
00144
00146 #define SkScalarHalf(a) ((a) * 0.5f)
00147
00148 #define SK_ScalarSqrt2 1.41421356f
00149 #define SK_ScalarPI 3.14159265f
00150 #define SK_ScalarTanPIOver8 0.414213562f
00151 #define SK_ScalarRoot2Over2 0.707106781f
00152
00153 #define SkDegreesToRadians(degrees) ((degrees) * (SK_ScalarPI / 180))
00154 float SkScalarSinCos(SkScalar radians, SkScalar* cosValue);
00155 #define SkScalarSin(radians) (float)sk_float_sin(radians)
00156 #define SkScalarCos(radians) (float)sk_float_cos(radians)
00157 #define SkScalarTan(radians) (float)sk_float_tan(radians)
00158 #define SkScalarASin(val) (float)sk_float_asin(val)
00159 #define SkScalarACos(val) (float)sk_float_acos(val)
00160 #define SkScalarATan2(y, x) (float)sk_float_atan2(y,x)
00161 #define SkScalarExp(x) (float)sk_float_exp(x)
00162 #define SkScalarLog(x) (float)sk_float_log(x)
00163
00164 inline SkScalar SkMaxScalar(SkScalar a, SkScalar b) { return a > b ? a : b; }
00165 inline SkScalar SkMinScalar(SkScalar a, SkScalar b) { return a < b ? a : b; }
00166
00167 #else
00168 typedef SkFixed SkScalar;
00169
00170 #define SK_Scalar1 SK_Fixed1
00171 #define SK_ScalarHalf SK_FixedHalf
00172 #define SK_ScalarInfinity SK_FixedMax
00173 #define SK_ScalarMax SK_FixedMax
00174 #define SK_ScalarMin SK_FixedMin
00175 #define SK_ScalarNaN SK_FixedNaN
00176 #define SkScalarIsNaN(x) ((x) == SK_FixedNaN)
00177 #define SkIntToScalar(n) SkIntToFixed(n)
00178 #define SkFixedToScalar(x) (x)
00179 #define SkScalarToFixed(x) (x)
00180 #ifdef SK_CAN_USE_FLOAT
00181 #define SkScalarToFloat(n) SkFixedToFloat(n)
00182 #define SkFloatToScalar(n) SkFloatToFixed(n)
00183
00184 #define SkScalarToDouble(n) SkFixedToDouble(n)
00185 #define SkDoubleToScalar(n) SkDoubleToFixed(n)
00186 #endif
00187 #define SkScalarFraction(x) SkFixedFraction(x)
00188 #define SkScalarRound(x) SkFixedRound(x)
00189 #define SkScalarCeil(x) SkFixedCeil(x)
00190 #define SkScalarFloor(x) SkFixedFloor(x)
00191 #define SkScalarAbs(x) SkFixedAbs(x)
00192 #define SkScalarClampMax(x, max) SkClampMax(x, max)
00193 #define SkScalarPin(x, min, max) SkPin32(x, min, max)
00194 #define SkScalarSquare(x) SkFixedSquare(x)
00195 #define SkScalarMul(a, b) SkFixedMul(a, b)
00196 #define SkScalarMulAdd(a, b, c) SkFixedMulAdd(a, b, c)
00197 #define SkScalarMulRound(a, b) SkFixedMulCommon(a, b, SK_FixedHalf)
00198 #define SkScalarMulCeil(a, b) SkFixedMulCommon(a, b, SK_Fixed1 - 1)
00199 #define SkScalarMulFloor(a, b) SkFixedMulCommon(a, b, 0)
00200 #define SkScalarDiv(a, b) SkFixedDiv(a, b)
00201 #define SkScalarMod(a, b) SkFixedMod(a, b)
00202 #define SkScalarMulDiv(a, b, c) SkMulDiv(a, b, c)
00203 #define SkScalarInvert(x) SkFixedInvert(x)
00204 #define SkScalarFastInvert(x) SkFixedFastInvert(x)
00205 #define SkScalarSqrt(x) SkFixedSqrt(x)
00206 #define SkScalarAve(a, b) SkFixedAve(a, b)
00207 #define SkScalarMean(a, b) SkFixedMean(a, b)
00208 #define SkScalarHalf(a) ((a) >> 1)
00209
00210 #define SK_ScalarSqrt2 SK_FixedSqrt2
00211 #define SK_ScalarPI SK_FixedPI
00212 #define SK_ScalarTanPIOver8 SK_FixedTanPIOver8
00213 #define SK_ScalarRoot2Over2 SK_FixedRoot2Over2
00214
00215 #define SkDegreesToRadians(degrees) SkFractMul(degrees, SK_FractPIOver180)
00216 #define SkScalarSinCos(radians, cosPtr) SkFixedSinCos(radians, cosPtr)
00217 #define SkScalarSin(radians) SkFixedSin(radians)
00218 #define SkScalarCos(radians) SkFixedCos(radians)
00219 #define SkScalarTan(val) SkFixedTan(val)
00220 #define SkScalarASin(val) SkFixedASin(val)
00221 #define SkScalarACos(val) SkFixedACos(val)
00222 #define SkScalarATan2(y, x) SkFixedATan2(y,x)
00223 #define SkScalarExp(x) SkFixedExp(x)
00224 #define SkScalarLog(x) SkFixedLog(x)
00225
00226 #define SkMaxScalar(a, b) SkMax32(a, b)
00227 #define SkMinScalar(a, b) SkMin32(a, b)
00228 #endif
00229
00230 #define SK_ScalarNearlyZero (SK_Scalar1 / (1 << 12))
00231
00232
00233
00234
00235 static inline bool SkScalarNearlyZero(SkScalar x,
00236 SkScalar tolerance = SK_ScalarNearlyZero) {
00237 SkASSERT(tolerance > 0);
00238 return SkScalarAbs(x) < tolerance;
00239 }
00240
00247 static inline SkScalar SkScalarInterp(SkScalar A, SkScalar B, SkScalar t) {
00248 SkASSERT(t >= 0 && t <= SK_Scalar1);
00249 return A + SkScalarMul(B - A, t);
00250 }
00251
00252 #endif
00253