Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/pathops/SkPathOpsCurve.h

Issue 1107353004: align top and bounds computations (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clean up code Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/pathops/SkPathOpsCubic.cpp ('k') | src/pathops/SkPathOpsCurve.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 SkPathOpsBounds;
20
19 struct SkOpCurve { 21 struct SkOpCurve {
20 SkPoint fPts[4]; 22 SkPoint fPts[4];
21 SkScalar fWeight; 23 SkScalar fWeight;
22 SkDEBUGCODE(SkPath::Verb fVerb); 24 SkDEBUGCODE(SkPath::Verb fVerb);
23 25
24 const SkPoint& operator[](int n) const { 26 const SkPoint& operator[](int n) const {
25 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb)); 27 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb));
26 return fPts[n]; 28 return fPts[n];
27 } 29 }
28 30
29 void dump() const; 31 void dump() const;
30 32
31 void set(const SkDQuad& quad) { 33 void set(const SkDQuad& quad) {
32 for (int index = 0; index < SkDQuad::kPointCount; ++index) { 34 for (int index = 0; index < SkDQuad::kPointCount; ++index) {
33 fPts[index] = quad[index].asSkPoint(); 35 fPts[index] = quad[index].asSkPoint();
34 } 36 }
35 SkDEBUGCODE(fWeight = 1); 37 SkDEBUGCODE(fWeight = 1);
36 SkDEBUGCODE(fVerb = SkPath::kQuad_Verb); 38 SkDEBUGCODE(fVerb = SkPath::kQuad_Verb);
37 } 39 }
38 40
39 void set(const SkDCubic& cubic) { 41 void set(const SkDCubic& cubic) {
40 for (int index = 0; index < SkDCubic::kPointCount; ++index) { 42 for (int index = 0; index < SkDCubic::kPointCount; ++index) {
41 fPts[index] = cubic[index].asSkPoint(); 43 fPts[index] = cubic[index].asSkPoint();
42 } 44 }
43 SkDEBUGCODE(fWeight = 1); 45 SkDEBUGCODE(fWeight = 1);
44 SkDEBUGCODE(fVerb = SkPath::kCubic_Verb); 46 SkDEBUGCODE(fVerb = SkPath::kCubic_Verb);
45 } 47 }
48
46 }; 49 };
47 50
48 struct SkDCurve { 51 struct SkDCurve {
49 union { 52 union {
50 SkDLine fLine; 53 SkDLine fLine;
51 SkDQuad fQuad; 54 SkDQuad fQuad;
52 SkDConic fConic; 55 SkDConic fConic;
53 SkDCubic fCubic; 56 SkDCubic fCubic;
54 }; 57 };
55 SkDEBUGCODE(SkPath::Verb fVerb); 58 SkDEBUGCODE(SkPath::Verb fVerb);
56 59
57 const SkDPoint& operator[](int n) const { 60 const SkDPoint& operator[](int n) const {
58 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb)); 61 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb));
59 return fCubic[n]; 62 return fCubic[n];
60 } 63 }
61 64
62 SkDPoint& operator[](int n) { 65 SkDPoint& operator[](int n) {
63 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb)); 66 SkASSERT(n >= 0 && n <= SkPathOpsVerbToPoints(fVerb));
64 return fCubic[n]; 67 return fCubic[n];
65 } 68 }
66 69
70 SkDPoint conicTop(const SkPoint curve[3], SkScalar curveWeight,
71 double s, double e, double* topT);
72 SkDPoint cubicTop(const SkPoint curve[4], SkScalar , double s, double e, dou ble* topT);
67 void dumpID(int ) const; 73 void dumpID(int ) const;
74 SkDPoint lineTop(const SkPoint[2], SkScalar , double , double , double* topT );
75 SkDPoint quadTop(const SkPoint curve[3], SkScalar , double s, double e, doub le* topT);
76
77 void setConicBounds(const SkPoint curve[3], SkScalar curveWeight,
78 double s, double e, SkPathOpsBounds* );
79 void setCubicBounds(const SkPoint curve[4], SkScalar ,
80 double s, double e, SkPathOpsBounds* );
81 void setLineBounds(const SkPoint[2], SkScalar , double , double , SkPathOpsB ounds* );
82 void setQuadBounds(const SkPoint curve[3], SkScalar ,
83 double s, double e, SkPathOpsBounds*);
68 }; 84 };
69 85
86
87 extern void (SkDCurve::* const SetBounds[])(const SkPoint curve[], SkScalar cWei ght,
88 double tStart, double tEnd, SkPathOpsBounds* );
89
90 extern SkDPoint (SkDCurve::* const Top[])(const SkPoint curve[], SkScalar cWeigh t,
91 double tStart, double tEnd, double* topT);
92
70 static SkDPoint dline_xy_at_t(const SkPoint a[2], SkScalar , double t) { 93 static SkDPoint dline_xy_at_t(const SkPoint a[2], SkScalar , double t) {
71 SkDLine line; 94 SkDLine line;
72 line.set(a); 95 line.set(a);
73 return line.ptAtT(t); 96 return line.ptAtT(t);
74 } 97 }
75 98
76 static SkDPoint dquad_xy_at_t(const SkPoint a[3], SkScalar , double t) { 99 static SkDPoint dquad_xy_at_t(const SkPoint a[3], SkScalar , double t) {
77 SkDQuad quad; 100 SkDQuad quad;
78 quad.set(a); 101 quad.set(a);
79 return quad.ptAtT(t); 102 return quad.ptAtT(t);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 } 195 }
173 196
174 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) = { 197 static SkVector (* const CurveSlopeAtT[])(const SkPoint[], SkScalar , double ) = {
175 NULL, 198 NULL,
176 fline_dxdy_at_t, 199 fline_dxdy_at_t,
177 fquad_dxdy_at_t, 200 fquad_dxdy_at_t,
178 fconic_dxdy_at_t, 201 fconic_dxdy_at_t,
179 fcubic_dxdy_at_t 202 fcubic_dxdy_at_t
180 }; 203 };
181 204
182 static SkPoint quad_top(const SkPoint a[3], SkScalar , double startT, double end T, double* topT) {
183 SkDQuad quad;
184 quad.set(a);
185 SkDPoint topPt = quad.top(startT, endT, topT);
186 return topPt.asSkPoint();
187 }
188
189 static SkPoint conic_top(const SkPoint a[3], SkScalar weight, double startT, dou ble endT,
190 double* topT) {
191 SkDConic conic;
192 conic.set(a, weight);
193 SkDPoint topPt = conic.top(startT, endT, topT);
194 return topPt.asSkPoint();
195 }
196
197 static SkPoint cubic_top(const SkPoint a[4], SkScalar , double startT, double en dT, double* topT) {
198 SkDCubic cubic;
199 cubic.set(a);
200 SkDPoint topPt = cubic.top(startT, endT, topT);
201 return topPt.asSkPoint();
202 }
203
204 static SkPoint (* const CurveTop[])(const SkPoint[], SkScalar , double , double , double* ) = {
205 NULL,
206 NULL,
207 quad_top,
208 conic_top,
209 cubic_top
210 };
211
212 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl e endT) { 205 static bool line_is_vertical(const SkPoint a[2], SkScalar , double startT, doubl e endT) {
213 SkDLine line; 206 SkDLine line;
214 line.set(a); 207 line.set(a);
215 SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) }; 208 SkDPoint dst[2] = { line.ptAtT(startT), line.ptAtT(endT) };
216 return AlmostEqualUlps(dst[0].fX, dst[1].fX); 209 return AlmostEqualUlps(dst[0].fX, dst[1].fX);
217 } 210 }
218 211
219 static bool quad_is_vertical(const SkPoint a[3], SkScalar , double startT, doubl e endT) { 212 static bool quad_is_vertical(const SkPoint a[3], SkScalar , double startT, doubl e endT) {
220 SkDQuad quad; 213 SkDQuad quad;
221 quad.set(a); 214 quad.set(a);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD Line& , 270 static void (* const CurveIntersectRay[])(const SkPoint[] , SkScalar , const SkD Line& ,
278 SkIntersections* ) = { 271 SkIntersections* ) = {
279 NULL, 272 NULL,
280 line_intersect_ray, 273 line_intersect_ray,
281 quad_intersect_ray, 274 quad_intersect_ray,
282 conic_intersect_ray, 275 conic_intersect_ray,
283 cubic_intersect_ray 276 cubic_intersect_ray
284 }; 277 };
285 278
286 #endif 279 #endif
OLDNEW
« no previous file with comments | « src/pathops/SkPathOpsCubic.cpp ('k') | src/pathops/SkPathOpsCurve.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698