OLD | NEW |
---|---|
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "SkGeometry.h" | 10 #include "SkGeometry.h" |
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1249 (base[0] > base[4] && value < base[2])) // should root have been 1 | 1249 (base[0] > base[4] && value < base[2])) // should root have been 1 |
1250 { | 1250 { |
1251 dest[0] = quad[1]; | 1251 dest[0] = quad[1]; |
1252 dest[1].set(x, y); | 1252 dest[1].set(x, y); |
1253 return true; | 1253 return true; |
1254 } | 1254 } |
1255 } | 1255 } |
1256 return false; | 1256 return false; |
1257 } | 1257 } |
1258 | 1258 |
1259 #ifdef SK_SCALAR_IS_FLOAT | 1259 static const SkPoint gQuadCirclePts[kSkBuildQuadArcStorage] = { |
robertphillips
2013/10/28 14:16:55
Possibly a comment here explaining what/how SK_MID
caryclark
2013/10/28 14:25:32
Done.
| |
1260 #define SK_MID_RRECT_OFFSET (SK_Scalar1 + SK_ScalarTanPIOver8 + FLT_EPSILON * 4) / 2 | |
1261 { SK_Scalar1, 0 }, | |
1262 { SK_Scalar1, SK_ScalarTanPIOver8 }, | |
1263 { SK_MID_RRECT_OFFSET, SK_MID_RRECT_OFFSET }, | |
1264 { SK_ScalarTanPIOver8, SK_Scalar1 }, | |
1260 | 1265 |
1261 // Due to floating point issues (i.e., 1.0f - SK_ScalarRoot2Over2 != | 1266 { 0, SK_Scalar1 }, |
1262 // SK_ScalarRoot2Over2 - SK_ScalarTanPIOver8), the "correct" off curve | 1267 { -SK_ScalarTanPIOver8, SK_Scalar1 }, |
1263 // control points cause the quadratic circle approximation to be concave. | 1268 { -SK_MID_RRECT_OFFSET, SK_MID_RRECT_OFFSET }, |
1264 // SK_OffEps is used to pull in the off-curve control points a bit | 1269 { -SK_Scalar1, SK_ScalarTanPIOver8 }, |
1265 // to make the quadratic approximation convex. | |
1266 // Pulling the off-curve controls points in is preferable to pushing some | |
1267 // of the on-curve points off. | |
1268 #define SK_OffEps 0.0001f | |
1269 #else | |
1270 #define SK_OffEps 0 | |
1271 #endif | |
1272 | 1270 |
1271 { -SK_Scalar1, 0 }, | |
1272 { -SK_Scalar1, -SK_ScalarTanPIOver8 }, | |
1273 { -SK_MID_RRECT_OFFSET, -SK_MID_RRECT_OFFSET }, | |
1274 { -SK_ScalarTanPIOver8, -SK_Scalar1 }, | |
1273 | 1275 |
1274 static const SkPoint gQuadCirclePts[kSkBuildQuadArcStorage] = { | 1276 { 0, -SK_Scalar1 }, |
1275 { SK_Scalar1, 0 }, | 1277 { SK_ScalarTanPIOver8, -SK_Scalar1 }, |
1276 { SK_Scalar1 - SK_OffEps, SK_ScalarTanPIOver8 - SK_OffEps }, | 1278 { SK_MID_RRECT_OFFSET, -SK_MID_RRECT_OFFSET }, |
1277 { SK_ScalarRoot2Over2, SK_ScalarRoot2Over2 }, | 1279 { SK_Scalar1, -SK_ScalarTanPIOver8 }, |
1278 { SK_ScalarTanPIOver8 - SK_OffEps, SK_Scalar1 - SK_OffEps }, | |
1279 | 1280 |
1280 { 0, SK_Scalar1 }, | 1281 { SK_Scalar1, 0 } |
1281 { -SK_ScalarTanPIOver8 + SK_OffEps,SK_Scalar1 - SK_OffEps }, | 1282 #undef SK_MID_RRECT_OFFSET |
1282 { -SK_ScalarRoot2Over2, SK_ScalarRoot2Over2 }, | |
1283 { -SK_Scalar1 + SK_OffEps, SK_ScalarTanPIOver8 - SK_OffEps }, | |
1284 | |
1285 { -SK_Scalar1, 0 }, | |
1286 { -SK_Scalar1 + SK_OffEps, -SK_ScalarTanPIOver8 + SK_OffEps }, | |
1287 { -SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2 }, | |
1288 { -SK_ScalarTanPIOver8 + SK_OffEps,-SK_Scalar1 + SK_OffEps }, | |
1289 | |
1290 { 0, -SK_Scalar1 }, | |
1291 { SK_ScalarTanPIOver8 - SK_OffEps, -SK_Scalar1 + SK_OffEps }, | |
1292 { SK_ScalarRoot2Over2, -SK_ScalarRoot2Over2 }, | |
1293 { SK_Scalar1 - SK_OffEps, -SK_ScalarTanPIOver8 + SK_OffEps }, | |
1294 | |
1295 { SK_Scalar1, 0 } | |
1296 }; | 1283 }; |
1297 | 1284 |
1298 int SkBuildQuadArc(const SkVector& uStart, const SkVector& uStop, | 1285 int SkBuildQuadArc(const SkVector& uStart, const SkVector& uStop, |
1299 SkRotationDirection dir, const SkMatrix* userMatrix, | 1286 SkRotationDirection dir, const SkMatrix* userMatrix, |
1300 SkPoint quadPoints[]) | 1287 SkPoint quadPoints[]) |
1301 { | 1288 { |
1302 // rotate by x,y so that uStart is (1.0) | 1289 // rotate by x,y so that uStart is (1.0) |
1303 SkScalar x = SkPoint::DotProduct(uStart, uStop); | 1290 SkScalar x = SkPoint::DotProduct(uStart, uStop); |
1304 SkScalar y = SkPoint::CrossProduct(uStart, uStop); | 1291 SkScalar y = SkPoint::CrossProduct(uStart, uStop); |
1305 | 1292 |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1650 } | 1637 } |
1651 if (this->findYExtrema(&t)) { | 1638 if (this->findYExtrema(&t)) { |
1652 this->evalAt(t, &pts[count++]); | 1639 this->evalAt(t, &pts[count++]); |
1653 } | 1640 } |
1654 bounds->set(pts, count); | 1641 bounds->set(pts, count); |
1655 } | 1642 } |
1656 | 1643 |
1657 void SkConic::computeFastBounds(SkRect* bounds) const { | 1644 void SkConic::computeFastBounds(SkRect* bounds) const { |
1658 bounds->set(fPts, 3); | 1645 bounds->set(fPts, 3); |
1659 } | 1646 } |
OLD | NEW |