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 #include "SkStrokerPriv.h" | 10 #include "SkStrokerPriv.h" |
11 #include "SkGeometry.h" | 11 #include "SkGeometry.h" |
12 #include "SkPath.h" | 12 #include "SkPath.h" |
13 | 13 |
14 static void ButtCapper(SkPath* path, const SkPoint& pivot, | 14 static void ButtCapper(SkPath* path, const SkPoint& pivot, |
15 const SkVector& normal, const SkPoint& stop, | 15 const SkVector& normal, const SkPoint& stop, |
16 SkPath*) | 16 SkPath*) |
17 { | 17 { |
18 path->lineTo(stop.fX, stop.fY); | 18 path->lineTo(stop.fX, stop.fY); |
19 } | 19 } |
20 | 20 |
21 static void RoundCapper(SkPath* path, const SkPoint& pivot, | 21 static void RoundCapper(SkPath* path, const SkPoint& pivot, |
22 const SkVector& normal, const SkPoint& stop, | 22 const SkVector& normal, const SkPoint& stop, |
23 SkPath*) | 23 SkPath*) |
24 { | 24 { |
| 25 #ifdef SK_SUPPORT_LEGACY_ARCTO_QUADS |
25 SkScalar px = pivot.fX; | 26 SkScalar px = pivot.fX; |
26 SkScalar py = pivot.fY; | 27 SkScalar py = pivot.fY; |
27 SkScalar nx = normal.fX; | 28 SkScalar nx = normal.fX; |
28 SkScalar ny = normal.fY; | 29 SkScalar ny = normal.fY; |
29 SkScalar sx = SkScalarMul(nx, CUBIC_ARC_FACTOR); | 30 SkScalar sx = SkScalarMul(nx, CUBIC_ARC_FACTOR); |
30 SkScalar sy = SkScalarMul(ny, CUBIC_ARC_FACTOR); | 31 SkScalar sy = SkScalarMul(ny, CUBIC_ARC_FACTOR); |
31 | 32 |
32 path->cubicTo(px + nx + CWX(sx, sy), py + ny + CWY(sx, sy), | 33 path->cubicTo(px + nx + CWX(sx, sy), py + ny + CWY(sx, sy), |
33 px + CWX(nx, ny) + sx, py + CWY(nx, ny) + sy, | 34 px + CWX(nx, ny) + sx, py + CWY(nx, ny) + sy, |
34 px + CWX(nx, ny), py + CWY(nx, ny)); | 35 px + CWX(nx, ny), py + CWY(nx, ny)); |
35 path->cubicTo(px + CWX(nx, ny) - sx, py + CWY(nx, ny) - sy, | 36 path->cubicTo(px + CWX(nx, ny) - sx, py + CWY(nx, ny) - sy, |
36 px - nx + CWX(sx, sy), py - ny + CWY(sx, sy), | 37 px - nx + CWX(sx, sy), py - ny + CWY(sx, sy), |
37 stop.fX, stop.fY); | 38 stop.fX, stop.fY); |
| 39 #else |
| 40 SkVector parallel; |
| 41 normal.rotateCW(¶llel); |
| 42 |
| 43 SkPoint projectedCenter = pivot + parallel; |
| 44 |
| 45 path->conicTo(projectedCenter + normal, projectedCenter, SK_ScalarRoot2Over2
); |
| 46 path->conicTo(projectedCenter - normal, stop, SK_ScalarRoot2Over2); |
| 47 #endif |
38 } | 48 } |
39 | 49 |
40 static void SquareCapper(SkPath* path, const SkPoint& pivot, | 50 static void SquareCapper(SkPath* path, const SkPoint& pivot, |
41 const SkVector& normal, const SkPoint& stop, | 51 const SkVector& normal, const SkPoint& stop, |
42 SkPath* otherPath) | 52 SkPath* otherPath) |
43 { | 53 { |
44 SkVector parallel; | 54 SkVector parallel; |
45 normal.rotateCW(¶llel); | 55 normal.rotateCW(¶llel); |
46 | 56 |
47 if (otherPath) | 57 if (otherPath) |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 SkRotationDirection dir = kCW_SkRotationDirection; | 139 SkRotationDirection dir = kCW_SkRotationDirection; |
130 | 140 |
131 if (!is_clockwise(before, after)) | 141 if (!is_clockwise(before, after)) |
132 { | 142 { |
133 SkTSwap<SkPath*>(outer, inner); | 143 SkTSwap<SkPath*>(outer, inner); |
134 before.negate(); | 144 before.negate(); |
135 after.negate(); | 145 after.negate(); |
136 dir = kCCW_SkRotationDirection; | 146 dir = kCCW_SkRotationDirection; |
137 } | 147 } |
138 | 148 |
139 SkPoint pts[kSkBuildQuadArcStorage]; | |
140 SkMatrix matrix; | 149 SkMatrix matrix; |
141 matrix.setScale(radius, radius); | 150 matrix.setScale(radius, radius); |
142 matrix.postTranslate(pivot.fX, pivot.fY); | 151 matrix.postTranslate(pivot.fX, pivot.fY); |
| 152 #ifdef SK_SUPPORT_LEGACY_ARCTO_QUADS |
| 153 SkPoint pts[kSkBuildQuadArcStorage]; |
143 int count = SkBuildQuadArc(before, after, dir, &matrix, pts); | 154 int count = SkBuildQuadArc(before, after, dir, &matrix, pts); |
144 SkASSERT((count & 1) == 1); | 155 SkASSERT((count & 1) == 1); |
145 | 156 if (count > 1) { |
146 if (count > 1) | 157 for (int i = 1; i < count; i += 2) { |
147 { | |
148 for (int i = 1; i < count; i += 2) | |
149 outer->quadTo(pts[i].fX, pts[i].fY, pts[i+1].fX, pts[i+1].fY); | 158 outer->quadTo(pts[i].fX, pts[i].fY, pts[i+1].fX, pts[i+1].fY); |
150 | 159 } |
151 after.scale(radius); | 160 after.scale(radius); |
152 HandleInnerJoin(inner, pivot, after); | 161 HandleInnerJoin(inner, pivot, after); |
153 } | 162 } |
| 163 #else |
| 164 SkConic conics[SkConic::kMaxConicsForArc]; |
| 165 int count = SkConic::BuildUnitArc(before, after, dir, &matrix, conics); |
| 166 if (count > 0) { |
| 167 for (int i = 0; i < count; ++i) { |
| 168 outer->conicTo(conics[i].fPts[1], conics[i].fPts[2], conics[i].fW); |
| 169 } |
| 170 after.scale(radius); |
| 171 HandleInnerJoin(inner, pivot, after); |
| 172 } |
| 173 #endif |
154 } | 174 } |
155 | 175 |
156 #define kOneOverSqrt2 (0.707106781f) | 176 #define kOneOverSqrt2 (0.707106781f) |
157 | 177 |
158 static void MiterJoiner(SkPath* outer, SkPath* inner, const SkVector& beforeUnit
Normal, | 178 static void MiterJoiner(SkPath* outer, SkPath* inner, const SkVector& beforeUnit
Normal, |
159 const SkPoint& pivot, const SkVector& afterUnitNormal, | 179 const SkPoint& pivot, const SkVector& afterUnitNormal, |
160 SkScalar radius, SkScalar invMiterLimit, | 180 SkScalar radius, SkScalar invMiterLimit, |
161 bool prevIsLine, bool currIsLine) | 181 bool prevIsLine, bool currIsLine) |
162 { | 182 { |
163 // negate the dot since we're using normals instead of tangents | 183 // negate the dot since we're using normals instead of tangents |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 | 271 |
252 SkStrokerPriv::JoinProc SkStrokerPriv::JoinFactory(SkPaint::Join join) | 272 SkStrokerPriv::JoinProc SkStrokerPriv::JoinFactory(SkPaint::Join join) |
253 { | 273 { |
254 static const SkStrokerPriv::JoinProc gJoiners[] = { | 274 static const SkStrokerPriv::JoinProc gJoiners[] = { |
255 MiterJoiner, RoundJoiner, BluntJoiner | 275 MiterJoiner, RoundJoiner, BluntJoiner |
256 }; | 276 }; |
257 | 277 |
258 SkASSERT((unsigned)join < SkPaint::kJoinCount); | 278 SkASSERT((unsigned)join < SkPaint::kJoinCount); |
259 return gJoiners[join]; | 279 return gJoiners[join]; |
260 } | 280 } |
OLD | NEW |