OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef SkFixed_DEFINED | 10 #ifndef SkFixed_DEFINED |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 SkASSERT(n64 == n32); | 48 SkASSERT(n64 == n32); |
49 return n32; | 49 return n32; |
50 } | 50 } |
51 #else | 51 #else |
52 #define SkFloatToFixed_Check(x) SkFloatToFixed(x) | 52 #define SkFloatToFixed_Check(x) SkFloatToFixed(x) |
53 #endif | 53 #endif |
54 | 54 |
55 #define SkFixedToDouble(x) ((x) * 1.5258789e-5) | 55 #define SkFixedToDouble(x) ((x) * 1.5258789e-5) |
56 #define SkDoubleToFixed(x) ((SkFixed)((x) * SK_Fixed1)) | 56 #define SkDoubleToFixed(x) ((SkFixed)((x) * SK_Fixed1)) |
57 | 57 |
58 /** 32 bit signed integer used to represent fractions values with 30 bits to the
right of the decimal point | |
59 */ | |
60 typedef int32_t SkFract; | |
61 #define SK_Fract1 (1 << 30) | |
62 #define Sk_FracHalf (1 << 29) | |
63 #define SK_FractPIOver180 (0x11DF46A) | |
64 | |
65 #define SkFractToFloat(x) ((float)(x) * 0.00000000093132257f) | |
66 #define SkFloatToFract(x) ((SkFract)((x) * SK_Fract1)) | |
67 | |
68 /** Converts an integer to a SkFixed, asserting that the result does not overflo
w | 58 /** Converts an integer to a SkFixed, asserting that the result does not overflo
w |
69 a 32 bit signed integer | 59 a 32 bit signed integer |
70 */ | 60 */ |
71 #ifdef SK_DEBUG | 61 #ifdef SK_DEBUG |
72 inline SkFixed SkIntToFixed(int n) | 62 inline SkFixed SkIntToFixed(int n) |
73 { | 63 { |
74 SkASSERT(n >= -32768 && n <= 32767); | 64 SkASSERT(n >= -32768 && n <= 32767); |
75 return n << 16; | 65 return n << 16; |
76 } | 66 } |
77 #else | 67 #else |
78 // force the cast to SkFixed to ensure that the answer is signed (like the
debug version) | 68 // force the cast to SkFixed to ensure that the answer is signed (like the
debug version) |
79 #define SkIntToFixed(n) (SkFixed)((n) << 16) | 69 #define SkIntToFixed(n) (SkFixed)((n) << 16) |
80 #endif | 70 #endif |
81 | 71 |
82 /** Converts a SkFixed to a SkFract, asserting that the result does not overflow | |
83 a 32 bit signed integer | |
84 */ | |
85 #ifdef SK_DEBUG | |
86 inline SkFract SkFixedToFract(SkFixed x) | |
87 { | |
88 SkASSERT(x >= (-2 << 16) && x <= (2 << 16) - 1); | |
89 return x << 14; | |
90 } | |
91 #else | |
92 #define SkFixedToFract(x) ((x) << 14) | |
93 #endif | |
94 | |
95 /** Returns the signed fraction of a SkFixed | |
96 */ | |
97 inline SkFixed SkFixedFraction(SkFixed x) | |
98 { | |
99 SkFixed mask = x >> 31 << 16; | |
100 return (x & 0xFFFF) | mask; | |
101 } | |
102 | |
103 /** Converts a SkFract to a SkFixed | |
104 */ | |
105 #define SkFractToFixed(x) ((x) >> 14) | |
106 | |
107 #define SkFixedRoundToInt(x) (((x) + SK_FixedHalf) >> 16) | 72 #define SkFixedRoundToInt(x) (((x) + SK_FixedHalf) >> 16) |
108 #define SkFixedCeilToInt(x) (((x) + SK_Fixed1 - 1) >> 16) | 73 #define SkFixedCeilToInt(x) (((x) + SK_Fixed1 - 1) >> 16) |
109 #define SkFixedFloorToInt(x) ((x) >> 16) | 74 #define SkFixedFloorToInt(x) ((x) >> 16) |
110 | 75 |
111 #define SkFixedRoundToFixed(x) (((x) + SK_FixedHalf) & 0xFFFF0000) | 76 #define SkFixedRoundToFixed(x) (((x) + SK_FixedHalf) & 0xFFFF0000) |
112 #define SkFixedCeilToFixed(x) (((x) + SK_Fixed1 - 1) & 0xFFFF0000) | 77 #define SkFixedCeilToFixed(x) (((x) + SK_Fixed1 - 1) & 0xFFFF0000) |
113 #define SkFixedFloorToFixed(x) ((x) & 0xFFFF0000) | 78 #define SkFixedFloorToFixed(x) ((x) & 0xFFFF0000) |
114 | 79 |
115 // DEPRECATED | 80 // DEPRECATED |
116 #define SkFixedFloor(x) SkFixedFloorToInt(x) | 81 #define SkFixedFloor(x) SkFixedFloorToInt(x) |
117 #define SkFixedCeil(x) SkFixedCeilToInt(x) | 82 #define SkFixedCeil(x) SkFixedCeilToInt(x) |
118 #define SkFixedRound(x) SkFixedRoundToInt(x) | 83 #define SkFixedRound(x) SkFixedRoundToInt(x) |
119 | 84 |
120 #define SkFixedAbs(x) SkAbs32(x) | 85 #define SkFixedAbs(x) SkAbs32(x) |
121 #define SkFixedAve(a, b) (((a) + (b)) >> 1) | 86 #define SkFixedAve(a, b) (((a) + (b)) >> 1) |
122 | 87 |
123 SkFixed SkFixedMul_portable(SkFixed, SkFixed); | 88 SkFixed SkFixedMul_portable(SkFixed, SkFixed); |
124 SkFract SkFractMul_portable(SkFract, SkFract); | |
125 inline SkFixed SkFixedSquare_portable(SkFixed value) | 89 inline SkFixed SkFixedSquare_portable(SkFixed value) |
126 { | 90 { |
127 uint32_t a = SkAbs32(value); | 91 uint32_t a = SkAbs32(value); |
128 uint32_t ah = a >> 16; | 92 uint32_t ah = a >> 16; |
129 uint32_t al = a & 0xFFFF; | 93 uint32_t al = a & 0xFFFF; |
130 SkFixed result = ah * a + al * ah + (al * al >> 16); | 94 SkFixed result = ah * a + al * ah + (al * al >> 16); |
131 if (result >= 0) | 95 if (result >= 0) |
132 return result; | 96 return result; |
133 else // Overflow. | 97 else // Overflow. |
134 return SK_FixedMax; | 98 return SK_FixedMax; |
135 } | 99 } |
136 | 100 |
137 #define SkFixedDiv(numer, denom) SkDivBits(numer, denom, 16) | 101 #define SkFixedDiv(numer, denom) SkDivBits(numer, denom, 16) |
138 SkFixed SkFixedDivInt(int32_t numer, int32_t denom); | |
139 SkFixed SkFixedMod(SkFixed numer, SkFixed denom); | |
140 #define SkFixedInvert(n) SkDivBits(SK_Fixed1, n, 16) | |
141 SkFixed SkFixedFastInvert(SkFixed n); | |
142 #define SkFixedSqrt(n) SkSqrtBits(n, 23) | |
143 SkFixed SkFixedMean(SkFixed a, SkFixed b); //*< returns sqrt(x*y) | |
144 int SkFixedMulCommon(SkFixed, int , int bias); // internal used by SkFixedMulFl
oor, SkFixedMulCeil, SkFixedMulRound | |
145 | 102 |
146 #define SkFractDiv(numer, denom) SkDivBits(numer, denom, 30) | 103 /////////////////////////////////////////////////////////////////////////////// |
147 #define SkFractSqrt(n) SkSqrtBits(n, 30) | 104 // TODO: move fixed sin/cos into SkCosineMapper, as that is the only caller |
| 105 // or rewrite SkCosineMapper to not use it at all |
148 | 106 |
149 SkFixed SkFixedSinCos(SkFixed radians, SkFixed* cosValueOrNull); | 107 SkFixed SkFixedSinCos(SkFixed radians, SkFixed* cosValueOrNull); |
150 #define SkFixedSin(radians) SkFixedSinCos(radians, NULL) | 108 #define SkFixedSin(radians) SkFixedSinCos(radians, NULL) |
151 inline SkFixed SkFixedCos(SkFixed radians) | 109 static inline SkFixed SkFixedCos(SkFixed radians) { |
152 { | |
153 SkFixed cosValue; | 110 SkFixed cosValue; |
154 (void)SkFixedSinCos(radians, &cosValue); | 111 (void)SkFixedSinCos(radians, &cosValue); |
155 return cosValue; | 112 return cosValue; |
156 } | 113 } |
157 SkFixed SkFixedTan(SkFixed radians); | |
158 SkFixed SkFixedASin(SkFixed); | |
159 SkFixed SkFixedACos(SkFixed); | |
160 SkFixed SkFixedATan2(SkFixed y, SkFixed x); | |
161 SkFixed SkFixedExp(SkFixed); | |
162 SkFixed SkFixedLog(SkFixed); | |
163 | |
164 #define SK_FixedNearlyZero (SK_Fixed1 >> 12) | |
165 | |
166 inline bool SkFixedNearlyZero(SkFixed x, SkFixed tolerance = SK_FixedNearlyZero) | |
167 { | |
168 SkASSERT(tolerance > 0); | |
169 return SkAbs32(x) < tolerance; | |
170 } | |
171 | 114 |
172 ////////////////////////////////////////////////////////////////////////////////
////////////////////// | 115 ////////////////////////////////////////////////////////////////////////////////
////////////////////// |
173 // Now look for ASM overrides for our portable versions (should consider putting
this in its own file) | 116 // Now look for ASM overrides for our portable versions (should consider putting
this in its own file) |
174 | 117 |
175 #ifdef SkLONGLONG | 118 #ifdef SkLONGLONG |
176 inline SkFixed SkFixedMul_longlong(SkFixed a, SkFixed b) | 119 inline SkFixed SkFixedMul_longlong(SkFixed a, SkFixed b) |
177 { | 120 { |
178 return (SkFixed)((SkLONGLONG)a * b >> 16); | 121 return (SkFixed)((SkLONGLONG)a * b >> 16); |
179 } | 122 } |
180 inline SkFract SkFractMul_longlong(SkFract a, SkFract b) | |
181 { | |
182 return (SkFract)((SkLONGLONG)a * b >> 30); | |
183 } | |
184 inline SkFixed SkFixedSquare_longlong(SkFixed value) | 123 inline SkFixed SkFixedSquare_longlong(SkFixed value) |
185 { | 124 { |
186 return (SkFixed)((SkLONGLONG)value * value >> 16); | 125 return (SkFixed)((SkLONGLONG)value * value >> 16); |
187 } | 126 } |
188 #define SkFixedMul(a,b) SkFixedMul_longlong(a,b) | 127 #define SkFixedMul(a,b) SkFixedMul_longlong(a,b) |
189 #define SkFractMul(a,b) SkFractMul_longlong(a,b) | |
190 #define SkFixedSquare(a) SkFixedSquare_longlong(a) | 128 #define SkFixedSquare(a) SkFixedSquare_longlong(a) |
191 #endif | 129 #endif |
192 | 130 |
193 #if defined(SK_CPU_ARM) | 131 #if defined(SK_CPU_ARM) |
194 /* This guy does not handle NaN or other obscurities, but is faster than | 132 /* This guy does not handle NaN or other obscurities, but is faster than |
195 than (int)(x*65536) | 133 than (int)(x*65536) |
196 */ | 134 */ |
197 inline SkFixed SkFloatToFixed_arm(float x) | 135 inline SkFixed SkFloatToFixed_arm(float x) |
198 { | 136 { |
199 int32_t y, z; | 137 int32_t y, z; |
(...skipping 16 matching lines...) Expand all Loading... |
216 int32_t t; | 154 int32_t t; |
217 asm("smull %0, %2, %1, %3 \n" | 155 asm("smull %0, %2, %1, %3 \n" |
218 "mov %0, %0, lsr #16 \n" | 156 "mov %0, %0, lsr #16 \n" |
219 "orr %0, %0, %2, lsl #16 \n" | 157 "orr %0, %0, %2, lsl #16 \n" |
220 : "=r"(x), "=&r"(y), "=r"(t) | 158 : "=r"(x), "=&r"(y), "=r"(t) |
221 : "r"(x), "1"(y) | 159 : "r"(x), "1"(y) |
222 : | 160 : |
223 ); | 161 ); |
224 return x; | 162 return x; |
225 } | 163 } |
226 inline SkFixed SkFixedMulAdd_arm(SkFixed x, SkFixed y, SkFixed a) | |
227 { | |
228 int32_t t; | |
229 asm("smull %0, %3, %1, %4 \n" | |
230 "add %0, %2, %0, lsr #16 \n" | |
231 "add %0, %0, %3, lsl #16 \n" | |
232 : "=r"(x), "=&r"(y), "=&r"(a), "=r"(t) | |
233 : "%r"(x), "1"(y), "2"(a) | |
234 : | |
235 ); | |
236 return x; | |
237 } | |
238 inline SkFixed SkFractMul_arm(SkFixed x, SkFixed y) | |
239 { | |
240 int32_t t; | |
241 asm("smull %0, %2, %1, %3 \n" | |
242 "mov %0, %0, lsr #30 \n" | |
243 "orr %0, %0, %2, lsl #2 \n" | |
244 : "=r"(x), "=&r"(y), "=r"(t) | |
245 : "r"(x), "1"(y) | |
246 : | |
247 ); | |
248 return x; | |
249 } | |
250 #undef SkFixedMul | 164 #undef SkFixedMul |
251 #undef SkFractMul | |
252 #define SkFixedMul(x, y) SkFixedMul_arm(x, y) | 165 #define SkFixedMul(x, y) SkFixedMul_arm(x, y) |
253 #define SkFractMul(x, y) SkFractMul_arm(x, y) | |
254 #define SkFixedMulAdd(x, y, a) SkFixedMulAdd_arm(x, y, a) | |
255 | 166 |
256 #undef SkFloatToFixed | 167 #undef SkFloatToFixed |
257 #define SkFloatToFixed(x) SkFloatToFixed_arm(x) | 168 #define SkFloatToFixed(x) SkFloatToFixed_arm(x) |
258 #endif | 169 #endif |
259 | 170 |
260 /////////////////////// Now define our macros to the portable versions if they w
eren't overridden | |
261 | |
262 #ifndef SkFixedSquare | |
263 #define SkFixedSquare(x) SkFixedSquare_portable(x) | |
264 #endif | |
265 #ifndef SkFixedMul | 171 #ifndef SkFixedMul |
266 #define SkFixedMul(x, y) SkFixedMul_portable(x, y) | 172 #define SkFixedMul(x, y) SkFixedMul_portable(x, y) |
267 #endif | 173 #endif |
268 #ifndef SkFractMul | |
269 #define SkFractMul(x, y) SkFractMul_portable(x, y) | |
270 #endif | |
271 #ifndef SkFixedMulAdd | |
272 #define SkFixedMulAdd(x, y, a) (SkFixedMul(x, y) + (a)) | |
273 #endif | |
274 | 174 |
275 /////////////////////////////////////////////////////////////////////////////// | 175 /////////////////////////////////////////////////////////////////////////////// |
276 | 176 |
277 typedef int64_t SkFixed48; | 177 typedef int64_t SkFixed48; |
278 | 178 |
279 #define SkIntToFixed48(x) ((SkFixed48)(x) << 48) | 179 #define SkIntToFixed48(x) ((SkFixed48)(x) << 48) |
280 #define SkFixed48ToInt(x) ((int)((x) >> 48)) | 180 #define SkFixed48ToInt(x) ((int)((x) >> 48)) |
281 #define SkFixedToFixed48(x) ((SkFixed48)(x) << 32) | 181 #define SkFixedToFixed48(x) ((SkFixed48)(x) << 32) |
282 #define SkFixed48ToFixed(x) ((SkFixed)((x) >> 32)) | 182 #define SkFixed48ToFixed(x) ((SkFixed)((x) >> 32)) |
283 #define SkFloatToFixed48(x) ((SkFixed48)((x) * (65536.0f * 65536.0f * 65536.
0f))) | 183 #define SkFloatToFixed48(x) ((SkFixed48)((x) * (65536.0f * 65536.0f * 65536.
0f))) |
284 | 184 |
285 #define SkScalarToFixed48(x) SkFloatToFixed48(x) | 185 #define SkScalarToFixed48(x) SkFloatToFixed48(x) |
286 | 186 |
287 #endif | 187 #endif |
OLD | NEW |