00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkFloatBits_DEFINED
00018 #define SkFloatBits_DEFINED
00019
00020 #include "SkTypes.h"
00021
00026 static inline int32_t SkSignBitTo2sCompliment(int32_t x) {
00027 if (x < 0) {
00028 x &= 0x7FFFFFFF;
00029 x = -x;
00030 }
00031 return x;
00032 }
00033
00037 static inline int32_t Sk2sComplimentToSignBit(int32_t x) {
00038 int sign = x >> 31;
00039
00040 x = (x ^ sign) - sign;
00041
00042 x |= sign << 31;
00043 return x;
00044 }
00045
00049 int32_t SkFloatBits_toIntCast(int32_t floatBits);
00050
00054 int32_t SkFloatBits_toIntFloor(int32_t floatBits);
00055
00059 int32_t SkFloatBits_toIntRound(int32_t floatBits);
00060
00064 int32_t SkFloatBits_toIntCeil(int32_t floatBits);
00065
00066
00067 #ifdef SK_CAN_USE_FLOAT
00068
00069 union SkFloatIntUnion {
00070 float fFloat;
00071 int32_t fSignBitInt;
00072 };
00073
00074
00075 static inline int32_t SkFloat2Bits(float x) {
00076 SkFloatIntUnion data;
00077 data.fFloat = x;
00078 return data.fSignBitInt;
00079 }
00080
00081
00082 static inline float SkBits2Float(int32_t floatAsBits) {
00083 SkFloatIntUnion data;
00084 data.fSignBitInt = floatAsBits;
00085 return data.fFloat;
00086 }
00087
00093 static inline int32_t SkFloatAs2sCompliment(float x) {
00094 return SkSignBitTo2sCompliment(SkFloat2Bits(x));
00095 }
00096
00100 static inline float Sk2sComplimentAsFloat(int32_t x) {
00101 return SkBits2Float(Sk2sComplimentToSignBit(x));
00102 }
00103
00106 float SkIntToFloatCast(int x);
00107 float SkIntToFloatCast_NoOverflowCheck(int x);
00108
00112 static inline int32_t SkFloatToIntCast(float x) {
00113 return SkFloatBits_toIntCast(SkFloat2Bits(x));
00114 }
00115
00119 static inline int32_t SkFloatToIntFloor(float x) {
00120 return SkFloatBits_toIntFloor(SkFloat2Bits(x));
00121 }
00122
00126 static inline int32_t SkFloatToIntRound(float x) {
00127 return SkFloatBits_toIntRound(SkFloat2Bits(x));
00128 }
00129
00133 static inline int32_t SkFloatToIntCeil(float x) {
00134 return SkFloatBits_toIntCeil(SkFloat2Bits(x));
00135 }
00136
00137 #endif
00138
00139
00140
00141 #ifdef SK_SCALAR_IS_FLOAT
00142 #define SkScalarAs2sCompliment(x) SkFloatAs2sCompliment(x)
00143 #define Sk2sComplimentAsScalar(x) Sk2sComplimentAsFloat(x)
00144 #else
00145 #define SkScalarAs2sCompliment(x) (x)
00146 #define Sk2sComplimentAsScalar(x) (x)
00147 #endif
00148
00149 #endif
00150