OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 | 8 |
9 #include "SkAnalyticEdge.h" | 9 #include "SkAnalyticEdge.h" |
10 #include "SkFDot6.h" | 10 #include "SkFDot6.h" |
11 #include "SkMathPriv.h" | 11 #include "SkMathPriv.h" |
12 #include "SkAAAConstants.h" | 12 #include "SkAAAConstants.h" |
13 | 13 |
14 class QuickFDot6Inverse { | 14 class QuickFDot6Inverse { |
15 private: | 15 private: |
16 static constexpr const SkFDot6* table = gFDot6INVERSE + kInverseTableSize; | 16 static constexpr const SkFDot6* table = gFDot6INVERSE + kInverseTableSize; |
17 public: | 17 public: |
18 inline static SkFixed Lookup(SkFDot6 x) { | 18 inline static SkFixed Lookup(SkFDot6 x) { |
19 SkASSERT(SkAbs32(x) < kInverseTableSize); | 19 SkASSERT(SkAbs32(x) < kInverseTableSize); |
20 return table[x]; | 20 return table[x]; |
21 } | 21 } |
22 }; | 22 }; |
23 | 23 |
24 static inline SkFixed quickSkFDot6Div(SkFDot6 a, SkFDot6 b) { | 24 static inline SkFixed quickSkFDot6Div(SkFDot6 a, SkFDot6 b) { |
25 if (SkAbs32(b) < kInverseTableSize) { | 25 // Max inverse of b is 2^6 which is 2^22 in SkFixed format. |
26 SkASSERT((int64_t)a * QuickFDot6Inverse::Lookup(b) <= SK_MaxS32); | 26 // Hence the safe value of abs(a) should be less than 2^10. |
| 27 if (SkAbs32(b) < kInverseTableSize && SkAbs32(a) < (1 << 10)) { |
| 28 SkASSERT((int64_t)a * QuickFDot6Inverse::Lookup(b) <= SK_MaxS32 |
| 29 && (int64_t)a * QuickFDot6Inverse::Lookup(b) >= SK_MinS32); |
27 SkFixed ourAnswer = (a * QuickFDot6Inverse::Lookup(b)) >> 6; | 30 SkFixed ourAnswer = (a * QuickFDot6Inverse::Lookup(b)) >> 6; |
28 #ifdef SK_DEBUG | 31 #ifdef SK_DEBUG |
29 SkFixed directAnswer = SkFDot6Div(a, b); | 32 SkFixed directAnswer = SkFDot6Div(a, b); |
30 SkASSERT( | 33 SkASSERT( |
31 (directAnswer == 0 && ourAnswer == 0) || | 34 (directAnswer == 0 && ourAnswer == 0) || |
32 SkFixedDiv(SkAbs32(directAnswer - ourAnswer), SkAbs32(directAnswer))
<= 1 << 10 | 35 SkFixedDiv(SkAbs32(directAnswer - ourAnswer), SkAbs32(directAnswer))
<= 1 << 10 |
33 ); | 36 ); |
34 #endif | 37 #endif |
35 return ourAnswer; | 38 return ourAnswer; |
36 } else { | 39 } else { |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 SkFDot6Div(SkFixedToFDot6(newx - oldx), SkFixedToFDot6(n
ewy - oldy))); | 239 SkFDot6Div(SkFixedToFDot6(newx - oldx), SkFixedToFDot6(n
ewy - oldy))); |
237 oldx = newx; | 240 oldx = newx; |
238 oldy = newy; | 241 oldy = newy; |
239 } while (count < 0 && !success); | 242 } while (count < 0 && !success); |
240 | 243 |
241 fCEdge.fCx = newx; | 244 fCEdge.fCx = newx; |
242 fCEdge.fCy = newy; | 245 fCEdge.fCy = newy; |
243 fCurveCount = SkToS8(count); | 246 fCurveCount = SkToS8(count); |
244 return success; | 247 return success; |
245 } | 248 } |
OLD | NEW |