| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 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 "SkBuffer.h" | 8 #include "SkBuffer.h" |
| 9 #include "SkCubicClipper.h" | 9 #include "SkCubicClipper.h" |
| 10 #include "SkErrorInternals.h" | 10 #include "SkErrorInternals.h" |
| (...skipping 1275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1286 } | 1286 } |
| 1287 | 1287 |
| 1288 SkScalar cosh = SkPoint::DotProduct(before, after); | 1288 SkScalar cosh = SkPoint::DotProduct(before, after); |
| 1289 SkScalar sinh = SkPoint::CrossProduct(before, after); | 1289 SkScalar sinh = SkPoint::CrossProduct(before, after); |
| 1290 | 1290 |
| 1291 if (SkScalarNearlyZero(sinh)) { // angle is too tight | 1291 if (SkScalarNearlyZero(sinh)) { // angle is too tight |
| 1292 this->lineTo(x1, y1); | 1292 this->lineTo(x1, y1); |
| 1293 return; | 1293 return; |
| 1294 } | 1294 } |
| 1295 | 1295 |
| 1296 SkScalar dist = SkScalarMulDiv(radius, SK_Scalar1 - cosh, sinh); | 1296 SkScalar dist = SkScalarAbs(SkScalarMulDiv(radius, SK_Scalar1 - cosh, sinh))
; |
| 1297 if (dist < 0) { | |
| 1298 dist = -dist; | |
| 1299 } | |
| 1300 | 1297 |
| 1301 SkScalar xx = x1 - SkScalarMul(dist, before.fX); | 1298 SkScalar xx = x1 - SkScalarMul(dist, before.fX); |
| 1302 SkScalar yy = y1 - SkScalarMul(dist, before.fY); | 1299 SkScalar yy = y1 - SkScalarMul(dist, before.fY); |
| 1300 #ifndef SK_SUPPORT_LEGACY_ARCTO |
| 1301 after.setLength(dist); |
| 1302 this->lineTo(xx, yy); |
| 1303 SkScalar weight = SkScalarSqrt(SK_ScalarHalf + cosh * SK_ScalarHalf); |
| 1304 this->conicTo(x1, y1, x1 + after.fX, y1 + after.fY, weight); |
| 1305 #else |
| 1303 SkRotationDirection arcDir; | 1306 SkRotationDirection arcDir; |
| 1304 | 1307 |
| 1305 // now turn before/after into normals | 1308 // now turn before/after into normals |
| 1306 if (sinh > 0) { | 1309 if (sinh > 0) { |
| 1307 before.rotateCCW(); | 1310 before.rotateCCW(); |
| 1308 after.rotateCCW(); | 1311 after.rotateCCW(); |
| 1309 arcDir = kCW_SkRotationDirection; | 1312 arcDir = kCW_SkRotationDirection; |
| 1310 } else { | 1313 } else { |
| 1311 before.rotateCW(); | 1314 before.rotateCW(); |
| 1312 after.rotateCW(); | 1315 after.rotateCW(); |
| 1313 arcDir = kCCW_SkRotationDirection; | 1316 arcDir = kCCW_SkRotationDirection; |
| 1314 } | 1317 } |
| 1315 | 1318 |
| 1316 SkMatrix matrix; | 1319 SkMatrix matrix; |
| 1317 SkPoint pts[kSkBuildQuadArcStorage]; | 1320 SkPoint pts[kSkBuildQuadArcStorage]; |
| 1318 | 1321 |
| 1319 matrix.setScale(radius, radius); | 1322 matrix.setScale(radius, radius); |
| 1320 matrix.postTranslate(xx - SkScalarMul(radius, before.fX), | 1323 matrix.postTranslate(xx - SkScalarMul(radius, before.fX), |
| 1321 yy - SkScalarMul(radius, before.fY)); | 1324 yy - SkScalarMul(radius, before.fY)); |
| 1322 | 1325 |
| 1323 int count = SkBuildQuadArc(before, after, arcDir, &matrix, pts); | 1326 int count = SkBuildQuadArc(before, after, arcDir, &matrix, pts); |
| 1324 | 1327 |
| 1325 this->incReserve(count); | 1328 this->incReserve(count); |
| 1326 // [xx,yy] == pts[0] | 1329 // [xx,yy] == pts[0] |
| 1327 this->lineTo(xx, yy); | 1330 this->lineTo(xx, yy); |
| 1328 for (int i = 1; i < count; i += 2) { | 1331 for (int i = 1; i < count; i += 2) { |
| 1329 this->quadTo(pts[i], pts[i+1]); | 1332 this->quadTo(pts[i], pts[i+1]); |
| 1330 } | 1333 } |
| 1334 #endif |
| 1331 } | 1335 } |
| 1332 | 1336 |
| 1333 /////////////////////////////////////////////////////////////////////////////// | 1337 /////////////////////////////////////////////////////////////////////////////// |
| 1334 | 1338 |
| 1335 void SkPath::addPath(const SkPath& path, SkScalar dx, SkScalar dy, AddPathMode m
ode) { | 1339 void SkPath::addPath(const SkPath& path, SkScalar dx, SkScalar dy, AddPathMode m
ode) { |
| 1336 SkMatrix matrix; | 1340 SkMatrix matrix; |
| 1337 | 1341 |
| 1338 matrix.setTranslate(dx, dy); | 1342 matrix.setTranslate(dx, dy); |
| 1339 this->addPath(path, matrix, mode); | 1343 this->addPath(path, matrix, mode); |
| 1340 } | 1344 } |
| (...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3084 } | 3088 } |
| 3085 } while (!done); | 3089 } while (!done); |
| 3086 return SkToBool(tangents.count()) ^ isInverse; | 3090 return SkToBool(tangents.count()) ^ isInverse; |
| 3087 } | 3091 } |
| 3088 | 3092 |
| 3089 int SkPath::ConvertConicToQuads(const SkPoint& p0, const SkPoint& p1, const SkPo
int& p2, | 3093 int SkPath::ConvertConicToQuads(const SkPoint& p0, const SkPoint& p1, const SkPo
int& p2, |
| 3090 SkScalar w, SkPoint pts[], int pow2) { | 3094 SkScalar w, SkPoint pts[], int pow2) { |
| 3091 const SkConic conic(p0, p1, p2, w); | 3095 const SkConic conic(p0, p1, p2, w); |
| 3092 return conic.chopIntoQuadsPOW2(pts, pow2); | 3096 return conic.chopIntoQuadsPOW2(pts, pow2); |
| 3093 } | 3097 } |
| OLD | NEW |