Chromium Code Reviews| 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 "SkRRect.h" | 8 #include "SkRRect.h" |
| 9 | 9 |
| 10 /////////////////////////////////////////////////////////////////////////////// | 10 /////////////////////////////////////////////////////////////////////////////// |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 109 } | 109 } |
| 110 | 110 |
| 111 // At this point we're either oval, simple, or complex (not empty or rect) | 111 // At this point we're either oval, simple, or complex (not empty or rect) |
| 112 // but we lazily resolve the type to avoid the work if the information | 112 // but we lazily resolve the type to avoid the work if the information |
| 113 // isn't required. | 113 // isn't required. |
| 114 fType = (SkRRect::Type) kUnknown_Type; | 114 fType = (SkRRect::Type) kUnknown_Type; |
| 115 | 115 |
| 116 SkDEBUGCODE(this->validate();) | 116 SkDEBUGCODE(this->validate();) |
| 117 } | 117 } |
| 118 | 118 |
| 119 bool SkRRect::contains(SkScalar x, SkScalar y) const { | 119 namespace { |
| 120 | |
| 121 bool loose_contains(const SkRect& rect, SkScalar x, SkScalar y) { | |
| 122 return !rect.isEmpty() && | |
| 123 rect.fLeft <= x && x <= rect.fRight && | |
| 124 rect.fTop <= y && y <= rect.fBottom; | |
| 125 } | |
| 126 | |
| 127 }; | |
| 128 | |
| 129 bool SkRRect::contains(SkScalar x, SkScalar y, bool loose) const { | |
| 120 SkDEBUGCODE(this->validate();) | 130 SkDEBUGCODE(this->validate();) |
| 121 | 131 |
| 122 if (kEmpty_Type == this->type()) { | 132 if (kEmpty_Type == this->type()) { |
| 123 return false; | 133 return false; |
| 124 } | 134 } |
| 125 | 135 |
| 126 if (!fRect.contains(x, y)) { | 136 if (loose) { |
| 127 return false; | 137 // points on the left and right edges of a rect have a slightly |
| 138 // different containment definition (since they technically aren't | |
| 139 // "in" the rect) | |
| 140 if (!loose_contains(fRect, x, y)) { | |
| 141 return false; | |
| 142 } | |
| 143 } else { | |
| 144 if (!fRect.contains(x, y)) { | |
| 145 return false; | |
| 146 } | |
| 128 } | 147 } |
| 129 | 148 |
| 130 if (kRect_Type == this->type()) { | 149 if (kRect_Type == this->type()) { |
| 131 // the 'fRect' test above was sufficient | 150 // the 'fRect' test above was sufficient |
| 132 return true; | 151 return true; |
| 133 } | 152 } |
| 134 | 153 |
| 135 // We know the point is inside the RR's bounds. The only way it can | 154 // We know the point is inside the RR's bounds. The only way it can |
| 136 // be out is if it outside one of the corners | 155 // be out is if it outside one of the corners |
| 137 SkPoint canonicalPt; // (x,y) translated to one of the quadrants | 156 SkPoint canonicalPt; // (x,y) translated to one of the quadrants |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 171 SkASSERT(canonicalPt.fX > 0 && canonicalPt.fY > 0); | 190 SkASSERT(canonicalPt.fX > 0 && canonicalPt.fY > 0); |
| 172 } else { | 191 } else { |
| 173 // not in any of the corners | 192 // not in any of the corners |
| 174 return true; | 193 return true; |
| 175 } | 194 } |
| 176 } | 195 } |
| 177 | 196 |
| 178 // A point is in an ellipse (in standard position) if: | 197 // A point is in an ellipse (in standard position) if: |
| 179 // x^2 y^2 | 198 // x^2 y^2 |
| 180 // ----- + ----- <= 1 | 199 // ----- + ----- <= 1 |
| 181 // a^2 b^2 | 200 // a^2 b^2 |
|
jvanverth1
2013/04/24 15:29:30
This can be rewritten as b^2*x^2 + a^2*y^2 <= (ab)
robertphillips
2013/04/24 16:11:57
Done.
| |
| 182 SkScalar dist = SkScalarDiv(SkScalarSquare(canonicalPt.fX), SkScalarSquare( fRadii[index].fX)) + | 201 SkScalar dist = SkScalarDiv(SkScalarSquare(canonicalPt.fX), SkScalarSquare( fRadii[index].fX)) + |
| 183 SkScalarDiv(SkScalarSquare(canonicalPt.fY), SkScalarSquare( fRadii[index].fY)); | 202 SkScalarDiv(SkScalarSquare(canonicalPt.fY), SkScalarSquare( fRadii[index].fY)); |
| 184 return dist <= SK_Scalar1; | 203 return dist <= SK_Scalar1; |
| 185 } | 204 } |
| 186 | 205 |
| 206 bool SkRRect::contains(const SkRect& rect) const { | |
| 207 if (!this->getBounds().contains(rect)) { | |
| 208 // If 'rect' isn't contained by the RR's bounds then the | |
| 209 // RR definitely doesn't contain it | |
| 210 return false; | |
| 211 } | |
| 212 | |
| 213 if (this->isRect()) { | |
| 214 // the prior test was sufficient | |
| 215 return true; | |
| 216 } | |
| 217 | |
|
jvanverth1
2013/04/24 15:29:30
You're checking to see if the corners are in the b
robertphillips
2013/04/24 16:11:57
Done.
| |
| 218 return this->contains(rect.fLeft, rect.fTop, false) && | |
| 219 this->contains(rect.fRight, rect.fTop, true) && | |
| 220 this->contains(rect.fRight, rect.fBottom, true) && | |
| 221 this->contains(rect.fLeft, rect.fBottom, true); | |
| 222 } | |
| 223 | |
| 187 // There is a simplified version of this method in setRectXY | 224 // There is a simplified version of this method in setRectXY |
| 188 void SkRRect::computeType() const { | 225 void SkRRect::computeType() const { |
| 189 SkDEBUGCODE(this->validate();) | 226 SkDEBUGCODE(this->validate();) |
| 190 | 227 |
| 191 if (fRect.isEmpty()) { | 228 if (fRect.isEmpty()) { |
| 192 fType = kEmpty_Type; | 229 fType = kEmpty_Type; |
| 193 return; | 230 return; |
| 194 } | 231 } |
| 195 | 232 |
| 196 bool allRadiiEqual = true; // are all x radii equal and all y radii? | 233 bool allRadiiEqual = true; // are all x radii equal and all y radii? |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 323 SkASSERT(!allRadiiZero && !allRadiiSame && !allCornersSquare); | 360 SkASSERT(!allRadiiZero && !allRadiiSame && !allCornersSquare); |
| 324 break; | 361 break; |
| 325 case kUnknown_Type: | 362 case kUnknown_Type: |
| 326 // no limits on this | 363 // no limits on this |
| 327 break; | 364 break; |
| 328 } | 365 } |
| 329 } | 366 } |
| 330 #endif // SK_DEBUG | 367 #endif // SK_DEBUG |
| 331 | 368 |
| 332 /////////////////////////////////////////////////////////////////////////////// | 369 /////////////////////////////////////////////////////////////////////////////// |
| OLD | NEW |