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

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

Issue 1111333002: compute initial winding from projected rays (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add missing test reference 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/SkPathOpsCommon.cpp ('k') | src/pathops/SkPathOpsCubic.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 7
8 #ifndef SkPathOpsCubic_DEFINED 8 #ifndef SkPathOpsCubic_DEFINED
9 #define SkPathOpsCubic_DEFINED 9 #define SkPathOpsCubic_DEFINED
10 10
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 50
51 static bool IsCubic() { return true; } 51 static bool IsCubic() { return true; }
52 52
53 const SkDPoint& operator[](int n) const { SkASSERT(n >= 0 && n < kPointCount ); return fPts[n]; } 53 const SkDPoint& operator[](int n) const { SkASSERT(n >= 0 && n < kPointCount ); return fPts[n]; }
54 SkDPoint& operator[](int n) { SkASSERT(n >= 0 && n < kPointCount); return fP ts[n]; } 54 SkDPoint& operator[](int n) { SkASSERT(n >= 0 && n < kPointCount); return fP ts[n]; }
55 55
56 void align(int endIndex, int ctrlIndex, SkDPoint* dstPt) const; 56 void align(int endIndex, int ctrlIndex, SkDPoint* dstPt) const;
57 double binarySearch(double min, double max, double axisIntercept, SearchAxis xAxis) const; 57 double binarySearch(double min, double max, double axisIntercept, SearchAxis xAxis) const;
58 double calcPrecision() const; 58 double calcPrecision() const;
59 SkDCubicPair chopAt(double t) const; 59 SkDCubicPair chopAt(double t) const;
60 bool clockwise(const SkDCubic& whole, bool* swap) const;
61 static bool Clockwise(const SkPoint* pts, double startT, double endT, bool* swap);
62 static void Coefficients(const double* cubic, double* A, double* B, double* C, double* D); 60 static void Coefficients(const double* cubic, double* A, double* B, double* C, double* D);
63 static bool ComplexBreak(const SkPoint pts[4], SkScalar* t, CubicType* cubic Type); 61 static bool ComplexBreak(const SkPoint pts[4], SkScalar* t, CubicType* cubic Type);
64 int convexHull(char order[kPointCount]) const; 62 int convexHull(char order[kPointCount]) const;
65 63
66 void debugInit() { 64 void debugInit() {
67 sk_bzero(fPts, sizeof(fPts)); 65 sk_bzero(fPts, sizeof(fPts));
68 } 66 }
69 67
70 void dump() const; // callable from the debugger when the implementation co de is linked in 68 void dump() const; // callable from the debugger when the implementation co de is linked in
71 void dumpID(int id) const; 69 void dumpID(int id) const;
72 void dumpInner() const; 70 void dumpInner() const;
73 SkDVector dxdyAtT(double t) const; 71 SkDVector dxdyAtT(double t) const;
74 bool endsAreExtremaInXOrY() const; 72 bool endsAreExtremaInXOrY() const;
75 static int FindExtrema(const double src[], double tValue[2]); 73 static int FindExtrema(const double src[], double tValue[2]);
76 int findInflections(double tValues[2]) const; 74 int findInflections(double tValues[2]) const;
77 75
78 static int FindInflections(const SkPoint a[kPointCount], double tValues[2]) { 76 static int FindInflections(const SkPoint a[kPointCount], double tValues[2]) {
79 SkDCubic cubic; 77 SkDCubic cubic;
80 cubic.set(a); 78 return cubic.set(a).findInflections(tValues);
81 return cubic.findInflections(tValues);
82 } 79 }
83 80
84 int findMaxCurvature(double tValues[]) const; 81 int findMaxCurvature(double tValues[]) const;
85 bool hullIntersects(const SkDCubic& c2, bool* isLinear) const; 82 bool hullIntersects(const SkDCubic& c2, bool* isLinear) const;
86 bool hullIntersects(const SkDConic& c, bool* isLinear) const; 83 bool hullIntersects(const SkDConic& c, bool* isLinear) const;
87 bool hullIntersects(const SkDQuad& c2, bool* isLinear) const; 84 bool hullIntersects(const SkDQuad& c2, bool* isLinear) const;
88 bool hullIntersects(const SkDPoint* pts, int ptCount, bool* isLinear) const; 85 bool hullIntersects(const SkDPoint* pts, int ptCount, bool* isLinear) const;
89 bool isLinear(int startIndex, int endIndex) const; 86 bool isLinear(int startIndex, int endIndex) const;
90 bool monotonicInX() const; 87 bool monotonicInX() const;
91 bool monotonicInY() const; 88 bool monotonicInY() const;
(...skipping 21 matching lines...) Expand all
113 fPts[1] = pts[1]; 110 fPts[1] = pts[1];
114 fPts[2] = pts[2]; 111 fPts[2] = pts[2];
115 fPts[3] = pts[3]; 112 fPts[3] = pts[3];
116 return *this; 113 return *this;
117 } 114 }
118 115
119 SkDCubic subDivide(double t1, double t2) const; 116 SkDCubic subDivide(double t1, double t2) const;
120 117
121 static SkDCubic SubDivide(const SkPoint a[kPointCount], double t1, double t2 ) { 118 static SkDCubic SubDivide(const SkPoint a[kPointCount], double t1, double t2 ) {
122 SkDCubic cubic; 119 SkDCubic cubic;
123 cubic.set(a); 120 return cubic.set(a).subDivide(t1, t2);
124 return cubic.subDivide(t1, t2);
125 } 121 }
126 122
127 void subDivide(const SkDPoint& a, const SkDPoint& d, double t1, double t2, S kDPoint p[2]) const; 123 void subDivide(const SkDPoint& a, const SkDPoint& d, double t1, double t2, S kDPoint p[2]) const;
128 124
129 static void SubDivide(const SkPoint pts[kPointCount], const SkDPoint& a, con st SkDPoint& d, double t1, 125 static void SubDivide(const SkPoint pts[kPointCount], const SkDPoint& a, con st SkDPoint& d, double t1,
130 double t2, SkDPoint p[2]) { 126 double t2, SkDPoint p[2]) {
131 SkDCubic cubic; 127 SkDCubic cubic;
132 cubic.set(pts); 128 cubic.set(pts).subDivide(a, d, t1, t2, p);
133 cubic.subDivide(a, d, t1, t2, p);
134 } 129 }
135 130
131 double top(const SkDCubic& dCurve, double startT, double endT, SkDPoint*topP t) const;
136 SkDQuad toQuad() const; 132 SkDQuad toQuad() const;
137 133
138 static const int gPrecisionUnit; 134 static const int gPrecisionUnit;
139 135
140 SkDPoint fPts[kPointCount]; 136 SkDPoint fPts[kPointCount];
141 }; 137 };
142 138
143 /* Given the set [0, 1, 2, 3], and two of the four members, compute an XOR mask 139 /* Given the set [0, 1, 2, 3], and two of the four members, compute an XOR mask
144 that computes the other two. Note that: 140 that computes the other two. Note that:
145 141
146 one ^ two == 3 for (0, 3), (1, 2) 142 one ^ two == 3 for (0, 3), (1, 2)
147 one ^ two < 3 for (0, 1), (0, 2), (1, 3), (2, 3) 143 one ^ two < 3 for (0, 1), (0, 2), (1, 3), (2, 3)
148 3 - (one ^ two) is either 0, 1, or 2 144 3 - (one ^ two) is either 0, 1, or 2
149 1 >> (3 - (one ^ two)) is either 0 or 1 145 1 >> (3 - (one ^ two)) is either 0 or 1
150 thus: 146 thus:
151 returned == 2 for (0, 3), (1, 2) 147 returned == 2 for (0, 3), (1, 2)
152 returned == 3 for (0, 1), (0, 2), (1, 3), (2, 3) 148 returned == 3 for (0, 1), (0, 2), (1, 3), (2, 3)
153 given that: 149 given that:
154 (0, 3) ^ 2 -> (2, 1) (1, 2) ^ 2 -> (3, 0) 150 (0, 3) ^ 2 -> (2, 1) (1, 2) ^ 2 -> (3, 0)
155 (0, 1) ^ 3 -> (3, 2) (0, 2) ^ 3 -> (3, 1) (1, 3) ^ 3 -> (2, 0) (2, 3) ^ 3 -> (1, 0) 151 (0, 1) ^ 3 -> (3, 2) (0, 2) ^ 3 -> (3, 1) (1, 3) ^ 3 -> (2, 0) (2, 3) ^ 3 -> (1, 0)
156 */ 152 */
157 inline int other_two(int one, int two) { 153 inline int other_two(int one, int two) {
158 return 1 >> (3 - (one ^ two)) ^ 3; 154 return 1 >> (3 - (one ^ two)) ^ 3;
159 } 155 }
160 156
161 #endif 157 #endif
OLDNEW
« no previous file with comments | « src/pathops/SkPathOpsCommon.cpp ('k') | src/pathops/SkPathOpsCubic.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698