OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 #ifndef SkPathOpsCurve_DEFINE | 7 #ifndef SkPathOpsCurve_DEFINE |
8 #define SkPathOpsCurve_DEFINE | 8 #define SkPathOpsCurve_DEFINE |
9 | 9 |
10 #include "SkIntersections.h" | 10 #include "SkIntersections.h" |
11 #include "SkPathOpsCubic.h" | 11 #include "SkPathOpsCubic.h" |
12 #include "SkPathOpsLine.h" | 12 #include "SkPathOpsLine.h" |
13 #include "SkPathOpsQuad.h" | 13 #include "SkPathOpsQuad.h" |
14 | 14 |
15 #ifndef SK_RELEASE | 15 #ifndef SK_RELEASE |
16 #include "SkPath.h" | 16 #include "SkPath.h" |
17 #endif | 17 #endif |
18 | 18 |
19 struct SkOpCurve { | 19 struct SkOpCurve { |
20 SkPoint fPts[4]; | 20 SkPoint fPts[4]; |
21 SkScalar fWeight; | 21 SkScalar fWeight; |
22 SkDEBUGCODE(SkPath::Verb fVerb); | 22 SkDEBUGCODE(SkPath::Verb fVerb); |
23 | 23 |
24 const SkPoint& operator[](int n) const { | 24 const SkPoint& operator[](int n) const { |
25 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb)); | 25 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb)); |
26 return fPts[n]; | 26 return fPts[n]; |
27 } | 27 } |
28 | 28 |
| 29 void dump() const; |
| 30 |
| 31 void set(const SkDQuad& quad) { |
| 32 for (int index = 0; index < SkDQuad::kPointCount; ++index) { |
| 33 fPts[index] = quad[index].asSkPoint(); |
| 34 } |
| 35 SkDEBUGCODE(fWeight = 1); |
| 36 SkDEBUGCODE(fVerb = SkPath::kQuad_Verb); |
| 37 } |
| 38 |
29 void set(const SkDCubic& cubic) { | 39 void set(const SkDCubic& cubic) { |
30 for (int index = 0; index < SkDCubic::kPointCount; ++index) { | 40 for (int index = 0; index < SkDCubic::kPointCount; ++index) { |
31 fPts[index] = cubic[index].asSkPoint(); | 41 fPts[index] = cubic[index].asSkPoint(); |
32 } | 42 } |
33 SkDEBUGCODE(fWeight = 1); | 43 SkDEBUGCODE(fWeight = 1); |
34 SkDEBUGCODE(fVerb = SkPath::kCubic_Verb); | 44 SkDEBUGCODE(fVerb = SkPath::kCubic_Verb); |
35 } | 45 } |
36 }; | 46 }; |
37 | 47 |
38 struct SkDCurve { | 48 struct SkDCurve { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 } | 172 } |
163 | 173 |
164 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) =
{ | 174 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) =
{ |
165 NULL, | 175 NULL, |
166 fline_dxdy_at_t, | 176 fline_dxdy_at_t, |
167 fquad_dxdy_at_t, | 177 fquad_dxdy_at_t, |
168 fconic_dxdy_at_t, | 178 fconic_dxdy_at_t, |
169 fcubic_dxdy_at_t | 179 fcubic_dxdy_at_t |
170 }; | 180 }; |
171 | 181 |
172 static SkPoint quad_top(const SkPoint a[3], SkScalar , double startT, double end
T) { | 182 static SkPoint quad_top(const SkPoint a[3], SkScalar , double startT, double end
T, double* topT) { |
173 SkDQuad quad; | 183 SkDQuad quad; |
174 quad.set(a); | 184 quad.set(a); |
175 SkDPoint topPt = quad.top(startT, endT); | 185 SkDPoint topPt = quad.top(startT, endT, topT); |
176 return topPt.asSkPoint(); | 186 return topPt.asSkPoint(); |
177 } | 187 } |
178 | 188 |
179 static SkPoint conic_top(const SkPoint a[3], SkScalar weight, double startT, dou
ble endT) { | 189 static SkPoint conic_top(const SkPoint a[3], SkScalar weight, double startT, dou
ble endT, |
| 190 double* topT) { |
180 SkDConic conic; | 191 SkDConic conic; |
181 conic.set(a, weight); | 192 conic.set(a, weight); |
182 SkDPoint topPt = conic.top(startT, endT); | 193 SkDPoint topPt = conic.top(startT, endT, topT); |
183 return topPt.asSkPoint(); | 194 return topPt.asSkPoint(); |
184 } | 195 } |
185 | 196 |
186 static SkPoint cubic_top(const SkPoint a[4], SkScalar , double startT, double en
dT) { | 197 static SkPoint cubic_top(const SkPoint a[4], SkScalar , double startT, double en
dT, double* topT) { |
187 SkDCubic cubic; | 198 SkDCubic cubic; |
188 cubic.set(a); | 199 cubic.set(a); |
189 SkDPoint topPt = cubic.top(startT, endT); | 200 SkDPoint topPt = cubic.top(startT, endT, topT); |
190 return topPt.asSkPoint(); | 201 return topPt.asSkPoint(); |
191 } | 202 } |
192 | 203 |
193 static SkPoint (* const CurveTop[])(const SkPoint[], SkScalar , double , double
) = { | 204 static SkPoint (* const CurveTop[])(const SkPoint[], SkScalar , double , double
, double* ) = { |
194 NULL, | 205 NULL, |
195 NULL, | 206 NULL, |
196 quad_top, | 207 quad_top, |
197 conic_top, | 208 conic_top, |
198 cubic_top | 209 cubic_top |
199 }; | 210 }; |
200 | 211 |
201 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl
e endT) { | 212 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl
e endT) { |
202 SkDLine line; | 213 SkDLine line; |
203 line.set(a); | 214 line.set(a); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD
Line& , | 277 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD
Line& , |
267 SkIntersections* ) = { | 278 SkIntersections* ) = { |
268 NULL, | 279 NULL, |
269 line_intersect_ray, | 280 line_intersect_ray, |
270 quad_intersect_ray, | 281 quad_intersect_ray, |
271 conic_intersect_ray, | 282 conic_intersect_ray, |
272 cubic_intersect_ray | 283 cubic_intersect_ray |
273 }; | 284 }; |
274 | 285 |
275 #endif | 286 #endif |
OLD | NEW |