OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
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 #include "GrPathUtils.h" | 8 #include "GrPathUtils.h" |
9 | 9 |
10 #include "GrTypes.h" | 10 #include "GrTypes.h" |
(...skipping 11 matching lines...) Expand all Loading... |
22 // take worst case mapRadius amoung four corners. | 22 // take worst case mapRadius amoung four corners. |
23 // (less than perfect) | 23 // (less than perfect) |
24 for (int i = 0; i < 4; ++i) { | 24 for (int i = 0; i < 4; ++i) { |
25 SkMatrix mat; | 25 SkMatrix mat; |
26 mat.setTranslate((i % 2) ? pathBounds.fLeft : pathBounds.fRight, | 26 mat.setTranslate((i % 2) ? pathBounds.fLeft : pathBounds.fRight, |
27 (i < 2) ? pathBounds.fTop : pathBounds.fBottom); | 27 (i < 2) ? pathBounds.fTop : pathBounds.fBottom); |
28 mat.postConcat(viewM); | 28 mat.postConcat(viewM); |
29 stretch = SkMaxScalar(stretch, mat.mapRadius(SK_Scalar1)); | 29 stretch = SkMaxScalar(stretch, mat.mapRadius(SK_Scalar1)); |
30 } | 30 } |
31 } | 31 } |
32 return srcTol / stretch; | 32 srcTol = SkScalarDiv(srcTol, stretch); |
| 33 return srcTol; |
33 } | 34 } |
34 | 35 |
35 static const int MAX_POINTS_PER_CURVE = 1 << 10; | 36 static const int MAX_POINTS_PER_CURVE = 1 << 10; |
36 static const SkScalar gMinCurveTol = 0.0001f; | 37 static const SkScalar gMinCurveTol = 0.0001f; |
37 | 38 |
38 uint32_t GrPathUtils::quadraticPointCount(const SkPoint points[], | 39 uint32_t GrPathUtils::quadraticPointCount(const SkPoint points[], |
39 SkScalar tol) { | 40 SkScalar tol) { |
40 if (tol < gMinCurveTol) { | 41 if (tol < gMinCurveTol) { |
41 tol = gMinCurveTol; | 42 tol = gMinCurveTol; |
42 } | 43 } |
43 SkASSERT(tol > 0); | 44 SkASSERT(tol > 0); |
44 | 45 |
45 SkScalar d = points[1].distanceToLineSegmentBetween(points[0], points[2]); | 46 SkScalar d = points[1].distanceToLineSegmentBetween(points[0], points[2]); |
46 if (d <= tol) { | 47 if (d <= tol) { |
47 return 1; | 48 return 1; |
48 } else { | 49 } else { |
49 // Each time we subdivide, d should be cut in 4. So we need to | 50 // Each time we subdivide, d should be cut in 4. So we need to |
50 // subdivide x = log4(d/tol) times. x subdivisions creates 2^(x) | 51 // subdivide x = log4(d/tol) times. x subdivisions creates 2^(x) |
51 // points. | 52 // points. |
52 // 2^(log4(x)) = sqrt(x); | 53 // 2^(log4(x)) = sqrt(x); |
53 SkScalar divSqrt = SkScalarSqrt(d / tol); | 54 SkScalar divSqrt = SkScalarSqrt(SkScalarDiv(d, tol)); |
54 if (((SkScalar)SK_MaxS32) <= divSqrt) { | 55 if (((SkScalar)SK_MaxS32) <= divSqrt) { |
55 return MAX_POINTS_PER_CURVE; | 56 return MAX_POINTS_PER_CURVE; |
56 } else { | 57 } else { |
57 int temp = SkScalarCeilToInt(divSqrt); | 58 int temp = SkScalarCeilToInt(divSqrt); |
58 int pow2 = GrNextPow2(temp); | 59 int pow2 = GrNextPow2(temp); |
59 // Because of NaNs & INFs we can wind up with a degenerate temp | 60 // Because of NaNs & INFs we can wind up with a degenerate temp |
60 // such that pow2 comes out negative. Also, our point generator | 61 // such that pow2 comes out negative. Also, our point generator |
61 // will always output at least one pt. | 62 // will always output at least one pt. |
62 if (pow2 < 1) { | 63 if (pow2 < 1) { |
63 pow2 = 1; | 64 pow2 = 1; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 } | 100 } |
100 SkASSERT(tol > 0); | 101 SkASSERT(tol > 0); |
101 | 102 |
102 SkScalar d = SkTMax( | 103 SkScalar d = SkTMax( |
103 points[1].distanceToLineSegmentBetweenSqd(points[0], points[3]), | 104 points[1].distanceToLineSegmentBetweenSqd(points[0], points[3]), |
104 points[2].distanceToLineSegmentBetweenSqd(points[0], points[3])); | 105 points[2].distanceToLineSegmentBetweenSqd(points[0], points[3])); |
105 d = SkScalarSqrt(d); | 106 d = SkScalarSqrt(d); |
106 if (d <= tol) { | 107 if (d <= tol) { |
107 return 1; | 108 return 1; |
108 } else { | 109 } else { |
109 SkScalar divSqrt = SkScalarSqrt(d / tol); | 110 SkScalar divSqrt = SkScalarSqrt(SkScalarDiv(d, tol)); |
110 if (((SkScalar)SK_MaxS32) <= divSqrt) { | 111 if (((SkScalar)SK_MaxS32) <= divSqrt) { |
111 return MAX_POINTS_PER_CURVE; | 112 return MAX_POINTS_PER_CURVE; |
112 } else { | 113 } else { |
113 int temp = SkScalarCeilToInt(SkScalarSqrt(d / tol)); | 114 int temp = SkScalarCeilToInt(SkScalarSqrt(SkScalarDiv(d, tol))); |
114 int pow2 = GrNextPow2(temp); | 115 int pow2 = GrNextPow2(temp); |
115 // Because of NaNs & INFs we can wind up with a degenerate temp | 116 // Because of NaNs & INFs we can wind up with a degenerate temp |
116 // such that pow2 comes out negative. Also, our point generator | 117 // such that pow2 comes out negative. Also, our point generator |
117 // will always output at least one pt. | 118 // will always output at least one pt. |
118 if (pow2 < 1) { | 119 if (pow2 < 1) { |
119 pow2 = 1; | 120 pow2 = 1; |
120 } | 121 } |
121 return SkTMin(pow2, MAX_POINTS_PER_CURVE); | 122 return SkTMin(pow2, MAX_POINTS_PER_CURVE); |
122 } | 123 } |
123 } | 124 } |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 set_loop_klm(d, controlK, controlL, controlM); | 808 set_loop_klm(d, controlK, controlL, controlM); |
808 } else if (kCusp_SkCubicType == cType) { | 809 } else if (kCusp_SkCubicType == cType) { |
809 SkASSERT(0.f == d[0]); | 810 SkASSERT(0.f == d[0]); |
810 set_cusp_klm(d, controlK, controlL, controlM); | 811 set_cusp_klm(d, controlK, controlL, controlM); |
811 } else if (kQuadratic_SkCubicType == cType) { | 812 } else if (kQuadratic_SkCubicType == cType) { |
812 set_quadratic_klm(d, controlK, controlL, controlM); | 813 set_quadratic_klm(d, controlK, controlL, controlM); |
813 } | 814 } |
814 | 815 |
815 calc_cubic_klm(p, controlK, controlL, controlM, klm, &klm[3], &klm[6]); | 816 calc_cubic_klm(p, controlK, controlL, controlM, klm, &klm[3], &klm[6]); |
816 } | 817 } |
OLD | NEW |