diff options
Diffstat (limited to 'chromium/third_party/skia/include/core/SkFixed.h')
-rw-r--r-- | chromium/third_party/skia/include/core/SkFixed.h | 150 |
1 files changed, 12 insertions, 138 deletions
diff --git a/chromium/third_party/skia/include/core/SkFixed.h b/chromium/third_party/skia/include/core/SkFixed.h index acfbe9af956..6f168c8edd9 100644 --- a/chromium/third_party/skia/include/core/SkFixed.h +++ b/chromium/third_party/skia/include/core/SkFixed.h @@ -1,4 +1,3 @@ - /* * Copyright 2006 The Android Open Source Project * @@ -6,7 +5,6 @@ * found in the LICENSE file. */ - #ifndef SkFixed_DEFINED #define SkFixed_DEFINED @@ -55,16 +53,6 @@ typedef int32_t SkFixed; #define SkFixedToDouble(x) ((x) * 1.5258789e-5) #define SkDoubleToFixed(x) ((SkFixed)((x) * SK_Fixed1)) -/** 32 bit signed integer used to represent fractions values with 30 bits to the right of the decimal point -*/ -typedef int32_t SkFract; -#define SK_Fract1 (1 << 30) -#define Sk_FracHalf (1 << 29) -#define SK_FractPIOver180 (0x11DF46A) - -#define SkFractToFloat(x) ((float)(x) * 0.00000000093132257f) -#define SkFloatToFract(x) ((SkFract)((x) * SK_Fract1)) - /** Converts an integer to a SkFixed, asserting that the result does not overflow a 32 bit signed integer */ @@ -79,31 +67,6 @@ typedef int32_t SkFract; #define SkIntToFixed(n) (SkFixed)((n) << 16) #endif -/** Converts a SkFixed to a SkFract, asserting that the result does not overflow - a 32 bit signed integer -*/ -#ifdef SK_DEBUG - inline SkFract SkFixedToFract(SkFixed x) - { - SkASSERT(x >= (-2 << 16) && x <= (2 << 16) - 1); - return x << 14; - } -#else - #define SkFixedToFract(x) ((x) << 14) -#endif - -/** Returns the signed fraction of a SkFixed -*/ -inline SkFixed SkFixedFraction(SkFixed x) -{ - SkFixed mask = x >> 31 << 16; - return (x & 0xFFFF) | mask; -} - -/** Converts a SkFract to a SkFixed -*/ -#define SkFractToFixed(x) ((x) >> 14) - #define SkFixedRoundToInt(x) (((x) + SK_FixedHalf) >> 16) #define SkFixedCeilToInt(x) (((x) + SK_Fixed1 - 1) >> 16) #define SkFixedFloorToInt(x) ((x) >> 16) @@ -112,62 +75,24 @@ inline SkFixed SkFixedFraction(SkFixed x) #define SkFixedCeilToFixed(x) (((x) + SK_Fixed1 - 1) & 0xFFFF0000) #define SkFixedFloorToFixed(x) ((x) & 0xFFFF0000) -// DEPRECATED -#define SkFixedFloor(x) SkFixedFloorToInt(x) -#define SkFixedCeil(x) SkFixedCeilToInt(x) -#define SkFixedRound(x) SkFixedRoundToInt(x) - #define SkFixedAbs(x) SkAbs32(x) #define SkFixedAve(a, b) (((a) + (b)) >> 1) SkFixed SkFixedMul_portable(SkFixed, SkFixed); -SkFract SkFractMul_portable(SkFract, SkFract); -inline SkFixed SkFixedSquare_portable(SkFixed value) -{ - uint32_t a = SkAbs32(value); - uint32_t ah = a >> 16; - uint32_t al = a & 0xFFFF; - SkFixed result = ah * a + al * ah + (al * al >> 16); - if (result >= 0) - return result; - else // Overflow. - return SK_FixedMax; -} #define SkFixedDiv(numer, denom) SkDivBits(numer, denom, 16) -SkFixed SkFixedDivInt(int32_t numer, int32_t denom); -SkFixed SkFixedMod(SkFixed numer, SkFixed denom); -#define SkFixedInvert(n) SkDivBits(SK_Fixed1, n, 16) -SkFixed SkFixedFastInvert(SkFixed n); -#define SkFixedSqrt(n) SkSqrtBits(n, 23) -SkFixed SkFixedMean(SkFixed a, SkFixed b); //*< returns sqrt(x*y) -int SkFixedMulCommon(SkFixed, int , int bias); // internal used by SkFixedMulFloor, SkFixedMulCeil, SkFixedMulRound -#define SkFractDiv(numer, denom) SkDivBits(numer, denom, 30) -#define SkFractSqrt(n) SkSqrtBits(n, 30) +/////////////////////////////////////////////////////////////////////////////// +// TODO: move fixed sin/cos into SkCosineMapper, as that is the only caller +// or rewrite SkCosineMapper to not use it at all SkFixed SkFixedSinCos(SkFixed radians, SkFixed* cosValueOrNull); #define SkFixedSin(radians) SkFixedSinCos(radians, NULL) -inline SkFixed SkFixedCos(SkFixed radians) -{ +static inline SkFixed SkFixedCos(SkFixed radians) { SkFixed cosValue; (void)SkFixedSinCos(radians, &cosValue); return cosValue; } -SkFixed SkFixedTan(SkFixed radians); -SkFixed SkFixedASin(SkFixed); -SkFixed SkFixedACos(SkFixed); -SkFixed SkFixedATan2(SkFixed y, SkFixed x); -SkFixed SkFixedExp(SkFixed); -SkFixed SkFixedLog(SkFixed); - -#define SK_FixedNearlyZero (SK_Fixed1 >> 12) - -inline bool SkFixedNearlyZero(SkFixed x, SkFixed tolerance = SK_FixedNearlyZero) -{ - SkASSERT(tolerance > 0); - return SkAbs32(x) < tolerance; -} ////////////////////////////////////////////////////////////////////////////////////////////////////// // Now look for ASM overrides for our portable versions (should consider putting this in its own file) @@ -175,28 +100,19 @@ inline bool SkFixedNearlyZero(SkFixed x, SkFixed tolerance = SK_FixedNearlyZero) #ifdef SkLONGLONG inline SkFixed SkFixedMul_longlong(SkFixed a, SkFixed b) { - return (SkFixed)((SkLONGLONG)a * b >> 16); - } - inline SkFract SkFractMul_longlong(SkFract a, SkFract b) - { - return (SkFract)((SkLONGLONG)a * b >> 30); - } - inline SkFixed SkFixedSquare_longlong(SkFixed value) - { - return (SkFixed)((SkLONGLONG)value * value >> 16); + return (SkFixed)((int64_t)a * b >> 16); } #define SkFixedMul(a,b) SkFixedMul_longlong(a,b) - #define SkFractMul(a,b) SkFractMul_longlong(a,b) - #define SkFixedSquare(a) SkFixedSquare_longlong(a) #endif -#if defined(SK_CPU_ARM) +#if defined(SK_CPU_ARM32) /* This guy does not handle NaN or other obscurities, but is faster than - than (int)(x*65536) + than (int)(x*65536). When built on Android with -Os, needs forcing + to inline or we lose the speed benefit. */ - inline SkFixed SkFloatToFixed_arm(float x) + SK_ALWAYS_INLINE SkFixed SkFloatToFixed_arm(float x) { - register int32_t y, z; + int32_t y, z; asm("movs %1, %3, lsl #1 \n" "mov %2, #0x8E \n" "sub %1, %2, %1, lsr #24 \n" @@ -213,7 +129,7 @@ inline bool SkFixedNearlyZero(SkFixed x, SkFixed tolerance = SK_FixedNearlyZero) } inline SkFixed SkFixedMul_arm(SkFixed x, SkFixed y) { - register int32_t t; + int32_t t; asm("smull %0, %2, %1, %3 \n" "mov %0, %0, lsr #16 \n" "orr %0, %0, %2, lsl #16 \n" @@ -223,54 +139,16 @@ inline bool SkFixedNearlyZero(SkFixed x, SkFixed tolerance = SK_FixedNearlyZero) ); return x; } - inline SkFixed SkFixedMulAdd_arm(SkFixed x, SkFixed y, SkFixed a) - { - register int32_t t; - asm("smull %0, %3, %1, %4 \n" - "add %0, %2, %0, lsr #16 \n" - "add %0, %0, %3, lsl #16 \n" - : "=r"(x), "=&r"(y), "=&r"(a), "=r"(t) - : "%r"(x), "1"(y), "2"(a) - : - ); - return x; - } - inline SkFixed SkFractMul_arm(SkFixed x, SkFixed y) - { - register int32_t t; - asm("smull %0, %2, %1, %3 \n" - "mov %0, %0, lsr #30 \n" - "orr %0, %0, %2, lsl #2 \n" - : "=r"(x), "=&r"(y), "=r"(t) - : "r"(x), "1"(y) - : - ); - return x; - } #undef SkFixedMul - #undef SkFractMul #define SkFixedMul(x, y) SkFixedMul_arm(x, y) - #define SkFractMul(x, y) SkFractMul_arm(x, y) - #define SkFixedMulAdd(x, y, a) SkFixedMulAdd_arm(x, y, a) #undef SkFloatToFixed #define SkFloatToFixed(x) SkFloatToFixed_arm(x) #endif -/////////////////////// Now define our macros to the portable versions if they weren't overridden - -#ifndef SkFixedSquare - #define SkFixedSquare(x) SkFixedSquare_portable(x) -#endif #ifndef SkFixedMul #define SkFixedMul(x, y) SkFixedMul_portable(x, y) #endif -#ifndef SkFractMul - #define SkFractMul(x, y) SkFractMul_portable(x, y) -#endif -#ifndef SkFixedMulAdd - #define SkFixedMulAdd(x, y, a) (SkFixedMul(x, y) + (a)) -#endif /////////////////////////////////////////////////////////////////////////////// @@ -282,10 +160,6 @@ typedef int64_t SkFixed48; #define SkFixed48ToFixed(x) ((SkFixed)((x) >> 32)) #define SkFloatToFixed48(x) ((SkFixed48)((x) * (65536.0f * 65536.0f * 65536.0f))) -#ifdef SK_SCALAR_IS_FLOAT - #define SkScalarToFixed48(x) SkFloatToFixed48(x) -#else - #define SkScalarToFixed48(x) SkFixedToFixed48(x) -#endif +#define SkScalarToFixed48(x) SkFloatToFixed48(x) #endif |