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

Side by Side Diff: src/pathops/SkIntersections.cpp

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/SkIntersections.h ('k') | src/pathops/SkOpAngle.h » ('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 #include "SkIntersections.h" 8 #include "SkIntersections.h"
9 9
10 int SkIntersections::closestTo(double rangeStart, double rangeEnd, const SkDPoin t& testPt, 10 int SkIntersections::closestTo(double rangeStart, double rangeEnd, const SkDPoin t& testPt,
11 double* closestDist) const { 11 double* closestDist) const {
12 int closest = -1; 12 int closest = -1;
13 *closestDist = SK_ScalarMax; 13 *closestDist = SK_ScalarMax;
14 for (int index = 0; index < fUsed; ++index) { 14 for (int index = 0; index < fUsed; ++index) {
15 if (!between(rangeStart, fT[0][index], rangeEnd)) { 15 if (!between(rangeStart, fT[0][index], rangeEnd)) {
16 continue; 16 continue;
17 } 17 }
18 const SkDPoint& iPt = fPt[index]; 18 const SkDPoint& iPt = fPt[index];
19 double dist = testPt.distanceSquared(iPt); 19 double dist = testPt.distanceSquared(iPt);
20 if (*closestDist > dist) { 20 if (*closestDist > dist) {
21 *closestDist = dist; 21 *closestDist = dist;
22 closest = index; 22 closest = index;
23 } 23 }
24 } 24 }
25 return closest; 25 return closest;
26 } 26 }
27 27
28 // called only by test code
29 int SkIntersections::coincidentUsed() const {
30 if (!fIsCoincident[0]) {
31 SkASSERT(!fIsCoincident[1]);
32 return 0;
33 }
34 int count = 0;
35 SkDEBUGCODE(int count2 = 0;)
36 for (int index = 0; index < fUsed; ++index) {
37 if (fIsCoincident[0] & (1 << index)) {
38 ++count;
39 }
40 #ifdef SK_DEBUG
41 if (fIsCoincident[1] & (1 << index)) {
42 ++count2;
43 }
44 #endif
45 }
46 SkASSERT(count == count2);
47 return count;
48 }
49
50 int (SkIntersections::* const CurveVertical[])(const SkPoint[], SkScalar,
51 SkScalar, SkScalar, SkScalar, boo l) = {
52 NULL,
53 &SkIntersections::verticalLine,
54 &SkIntersections::verticalQuad,
55 &SkIntersections::verticalConic,
56 &SkIntersections::verticalCubic
57 };
58
59 void SkIntersections::flip() { 28 void SkIntersections::flip() {
60 for (int index = 0; index < fUsed; ++index) { 29 for (int index = 0; index < fUsed; ++index) {
61 fT[1][index] = 1 - fT[1][index]; 30 fT[1][index] = 1 - fT[1][index];
62 } 31 }
63 } 32 }
64 33
65 int SkIntersections::insert(double one, double two, const SkDPoint& pt) { 34 int SkIntersections::insert(double one, double two, const SkDPoint& pt) {
66 if (fIsCoincident[0] == 3 && between(fT[0][0], one, fT[0][1])) { 35 if (fIsCoincident[0] == 3 && between(fT[0][0], one, fT[0][1])) {
67 // For now, don't allow a mix of coincident and non-coincident intersect ions 36 // For now, don't allow a mix of coincident and non-coincident intersect ions
68 return -1; 37 return -1;
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 } 136 }
168 SkDVector best = fPt[result] - origin; 137 SkDVector best = fPt[result] - origin;
169 SkDVector test = fPt[index] - origin; 138 SkDVector test = fPt[index] - origin;
170 if (test.crossCheck(best) < 0) { 139 if (test.crossCheck(best) < 0) {
171 result = index; 140 result = index;
172 } 141 }
173 } 142 }
174 return result; 143 return result;
175 } 144 }
176 145
177 void SkIntersections::quickRemoveOne(int index, int replace) {
178 if (index < replace) {
179 fT[0][index] = fT[0][replace];
180 }
181 }
182
183 void SkIntersections::removeOne(int index) { 146 void SkIntersections::removeOne(int index) {
184 int remaining = --fUsed - index; 147 int remaining = --fUsed - index;
185 if (remaining <= 0) { 148 if (remaining <= 0) {
186 return; 149 return;
187 } 150 }
188 memmove(&fPt[index], &fPt[index + 1], sizeof(fPt[0]) * remaining); 151 memmove(&fPt[index], &fPt[index + 1], sizeof(fPt[0]) * remaining);
189 memmove(&fT[0][index], &fT[0][index + 1], sizeof(fT[0][0]) * remaining); 152 memmove(&fT[0][index], &fT[0][index + 1], sizeof(fT[0][0]) * remaining);
190 memmove(&fT[1][index], &fT[1][index + 1], sizeof(fT[1][0]) * remaining); 153 memmove(&fT[1][index], &fT[1][index + 1], sizeof(fT[1][0]) * remaining);
191 // SkASSERT(fIsCoincident[0] == 0); 154 // SkASSERT(fIsCoincident[0] == 0);
192 int coBit = fIsCoincident[0] & (1 << index); 155 int coBit = fIsCoincident[0] & (1 << index);
193 fIsCoincident[0] -= ((fIsCoincident[0] >> 1) & ~((1 << index) - 1)) + coBit; 156 fIsCoincident[0] -= ((fIsCoincident[0] >> 1) & ~((1 << index) - 1)) + coBit;
194 SkASSERT(!(coBit ^ (fIsCoincident[1] & (1 << index)))); 157 SkASSERT(!(coBit ^ (fIsCoincident[1] & (1 << index))));
195 fIsCoincident[1] -= ((fIsCoincident[1] >> 1) & ~((1 << index) - 1)) + coBit; 158 fIsCoincident[1] -= ((fIsCoincident[1] >> 1) & ~((1 << index) - 1)) + coBit;
196 } 159 }
197
198 int SkIntersections::verticalConic(const SkPoint a[3], SkScalar weight,
199 SkScalar top, SkScalar bottom, SkScalar x, bool flipped) {
200 SkDConic conic;
201 conic.set(a, weight);
202 return vertical(conic, top, bottom, x, flipped);
203 }
204
205 int SkIntersections::verticalCubic(const SkPoint a[4], SkScalar weight,
206 SkScalar top, SkScalar bottom, SkScalar x, bool flipped) {
207 SkDCubic cubic;
208 cubic.set(a);
209 return vertical(cubic, top, bottom, x, flipped);
210 }
211
212 int SkIntersections::verticalLine(const SkPoint a[2], SkScalar weight,
213 SkScalar top, SkScalar bottom, SkScalar x, bool flipped) {
214 SkDLine line;
215 line.set(a);
216 return vertical(line, top, bottom, x, flipped);
217 }
218
219 int SkIntersections::verticalQuad(const SkPoint a[3], SkScalar weight,
220 SkScalar top, SkScalar bottom, SkScalar x, bool flipped) {
221 SkDQuad quad;
222 quad.set(a);
223 return vertical(quad, top, bottom, x, flipped);
224 }
OLDNEW
« no previous file with comments | « src/pathops/SkIntersections.h ('k') | src/pathops/SkOpAngle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698