| 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 | 7 |
| 8 #include "SkIntersections.h" | 8 #include "SkIntersections.h" |
| 9 | 9 |
| 10 void SkIntersections::append(const SkIntersections& i) { | 10 void SkIntersections::append(const SkIntersections& i) { |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 } | 96 } |
| 97 if (fUsed >= fMax) { | 97 if (fUsed >= fMax) { |
| 98 SkASSERT(0); // FIXME : this error, if it is to be handled at runtime i
n release, must | 98 SkASSERT(0); // FIXME : this error, if it is to be handled at runtime i
n release, must |
| 99 // be propagated all the way back down to the caller, and
return failure. | 99 // be propagated all the way back down to the caller, and
return failure. |
| 100 fUsed = 0; | 100 fUsed = 0; |
| 101 return 0; | 101 return 0; |
| 102 } | 102 } |
| 103 int remaining = fUsed - index; | 103 int remaining = fUsed - index; |
| 104 if (remaining > 0) { | 104 if (remaining > 0) { |
| 105 memmove(&fPt[index + 1], &fPt[index], sizeof(fPt[0]) * remaining); | 105 memmove(&fPt[index + 1], &fPt[index], sizeof(fPt[0]) * remaining); |
| 106 memmove(&fPt2[index + 1], &fPt2[index], sizeof(fPt2[0]) * remaining); |
| 106 memmove(&fT[0][index + 1], &fT[0][index], sizeof(fT[0][0]) * remaining); | 107 memmove(&fT[0][index + 1], &fT[0][index], sizeof(fT[0][0]) * remaining); |
| 107 memmove(&fT[1][index + 1], &fT[1][index], sizeof(fT[1][0]) * remaining); | 108 memmove(&fT[1][index + 1], &fT[1][index], sizeof(fT[1][0]) * remaining); |
| 108 int clearMask = ~((1 << index) - 1); | 109 int clearMask = ~((1 << index) - 1); |
| 109 fIsCoincident[0] += fIsCoincident[0] & clearMask; | 110 fIsCoincident[0] += fIsCoincident[0] & clearMask; |
| 110 fIsCoincident[1] += fIsCoincident[1] & clearMask; | 111 fIsCoincident[1] += fIsCoincident[1] & clearMask; |
| 111 } | 112 } |
| 112 fPt[index] = pt; | 113 fPt[index] = pt; |
| 113 fT[0][index] = one; | 114 fT[0][index] = one; |
| 114 fT[1][index] = two; | 115 fT[1][index] = two; |
| 115 ++fUsed; | 116 ++fUsed; |
| 116 return index; | 117 return index; |
| 117 } | 118 } |
| 118 | 119 |
| 120 void SkIntersections::insertNear(double one, double two, const SkDPoint& pt1, co
nst SkDPoint& pt2) { |
| 121 SkASSERT(one == 0 || one == 1); |
| 122 SkASSERT(two == 0 || two == 1); |
| 123 SkASSERT(pt1 != pt2); |
| 124 SkASSERT(fNearlySame[(int) one]); |
| 125 (void) insert(one, two, pt1); |
| 126 fPt2[one ? fUsed - 1 : 0] = pt2; |
| 127 } |
| 128 |
| 119 void SkIntersections::insertCoincident(double one, double two, const SkDPoint& p
t) { | 129 void SkIntersections::insertCoincident(double one, double two, const SkDPoint& p
t) { |
| 120 int index = insertSwap(one, two, pt); | 130 int index = insertSwap(one, two, pt); |
| 121 int bit = 1 << index; | 131 int bit = 1 << index; |
| 122 fIsCoincident[0] |= bit; | 132 fIsCoincident[0] |= bit; |
| 123 fIsCoincident[1] |= bit; | 133 fIsCoincident[1] |= bit; |
| 124 } | 134 } |
| 125 | 135 |
| 126 int SkIntersections::lineRay(const SkPoint pts[2], const SkDLine& line) { | 136 int SkIntersections::lineRay(const SkPoint pts[2], const SkDLine& line) { |
| 127 SkDLine l; | 137 SkDLine l; |
| 128 l.set(pts); | 138 l.set(pts); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 151 fT[0][index] = fT[0][replace]; | 161 fT[0][index] = fT[0][replace]; |
| 152 } | 162 } |
| 153 } | 163 } |
| 154 | 164 |
| 155 void SkIntersections::removeOne(int index) { | 165 void SkIntersections::removeOne(int index) { |
| 156 int remaining = --fUsed - index; | 166 int remaining = --fUsed - index; |
| 157 if (remaining <= 0) { | 167 if (remaining <= 0) { |
| 158 return; | 168 return; |
| 159 } | 169 } |
| 160 memmove(&fPt[index], &fPt[index + 1], sizeof(fPt[0]) * remaining); | 170 memmove(&fPt[index], &fPt[index + 1], sizeof(fPt[0]) * remaining); |
| 171 memmove(&fPt2[index], &fPt2[index + 1], sizeof(fPt2[0]) * remaining); |
| 161 memmove(&fT[0][index], &fT[0][index + 1], sizeof(fT[0][0]) * remaining); | 172 memmove(&fT[0][index], &fT[0][index + 1], sizeof(fT[0][0]) * remaining); |
| 162 memmove(&fT[1][index], &fT[1][index + 1], sizeof(fT[1][0]) * remaining); | 173 memmove(&fT[1][index], &fT[1][index + 1], sizeof(fT[1][0]) * remaining); |
| 163 SkASSERT(fIsCoincident[0] == 0); | 174 SkASSERT(fIsCoincident[0] == 0); |
| 164 int coBit = fIsCoincident[0] & (1 << index); | 175 int coBit = fIsCoincident[0] & (1 << index); |
| 165 fIsCoincident[0] -= ((fIsCoincident[0] >> 1) & ~((1 << index) - 1)) + coBit; | 176 fIsCoincident[0] -= ((fIsCoincident[0] >> 1) & ~((1 << index) - 1)) + coBit; |
| 166 SkASSERT(!(coBit ^ (fIsCoincident[1] & (1 << index)))); | 177 SkASSERT(!(coBit ^ (fIsCoincident[1] & (1 << index)))); |
| 167 fIsCoincident[1] -= ((fIsCoincident[1] >> 1) & ~((1 << index) - 1)) + coBit; | 178 fIsCoincident[1] -= ((fIsCoincident[1] >> 1) & ~((1 << index) - 1)) + coBit; |
| 168 } | 179 } |
| 169 | 180 |
| 170 void SkIntersections::swapPts() { | 181 void SkIntersections::swapPts() { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 187 quad.set(a); | 198 quad.set(a); |
| 188 return vertical(quad, top, bottom, x, flipped); | 199 return vertical(quad, top, bottom, x, flipped); |
| 189 } | 200 } |
| 190 | 201 |
| 191 int SkIntersections::verticalCubic(const SkPoint a[4], SkScalar top, SkScalar bo
ttom, | 202 int SkIntersections::verticalCubic(const SkPoint a[4], SkScalar top, SkScalar bo
ttom, |
| 192 SkScalar x, bool flipped) { | 203 SkScalar x, bool flipped) { |
| 193 SkDCubic cubic; | 204 SkDCubic cubic; |
| 194 cubic.set(a); | 205 cubic.set(a); |
| 195 return vertical(cubic, top, bottom, x, flipped); | 206 return vertical(cubic, top, bottom, x, flipped); |
| 196 } | 207 } |
| OLD | NEW |