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

Unified Diff: src/core/SkGeometry.cpp

Issue 1311273002: fix zero-length tangent (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 4 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 side-by-side diff with in-line comments
Download patch
« gm/strokes.cpp ('K') | « gm/strokes.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkGeometry.cpp
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp
index 6afd9d7ffb0ed1478b6afd0062a76ce93f2db02a..e35bc8cb3ddfd1384a27275a9837c8f6ade94a03 100644
--- a/src/core/SkGeometry.cpp
+++ b/src/core/SkGeometry.cpp
@@ -157,8 +157,12 @@ void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange
pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t));
}
if (tangent) {
reed1 2015/08/24 20:15:46 // The derivative equation is just 2(b - a +(a - 2
caryclark 2015/08/25 12:04:48 Done.
- tangent->set(eval_quad_derivative(&src[0].fX, t),
- eval_quad_derivative(&src[0].fY, t));
+ if ((t == 0 && src[0] == src[1]) || (t == 1 && src[1] == src[2])) {
+ *tangent = src[2] - src[0];
+ } else {
+ tangent->set(eval_quad_derivative(&src[0].fX, t),
+ eval_quad_derivative(&src[0].fY, t));
+ }
}
}
@@ -398,8 +402,19 @@ void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc,
loc->set(eval_cubic(&src[0].fX, t), eval_cubic(&src[0].fY, t));
}
if (tangent) {
- tangent->set(eval_cubic_derivative(&src[0].fX, t),
- eval_cubic_derivative(&src[0].fY, t));
+ if ((t == 0 && src[0] == src[1]) || (t == 1 && src[2] == src[3])) {
+ if (t == 0) {
+ *tangent = src[2] - src[0];
+ } else {
+ *tangent = src[3] - src[1];
+ }
+ if (!tangent->fX && !tangent->fY) {
+ *tangent = src[3] - src[0];
+ }
+ } else {
+ tangent->set(eval_cubic_derivative(&src[0].fX, t),
+ eval_cubic_derivative(&src[0].fY, t));
+ }
}
if (curvature) {
curvature->set(eval_cubic_2ndDerivative(&src[0].fX, t),
@@ -1232,8 +1247,12 @@ void SkConic::evalAt(SkScalar t, SkPoint* pt, SkVector* tangent) const {
conic_eval_pos(&fPts[0].fY, fW, t));
}
if (tangent) {
- tangent->set(conic_eval_tan(&fPts[0].fX, fW, t),
- conic_eval_tan(&fPts[0].fY, fW, t));
+ if ((t == 0 && fPts[0] == fPts[1]) || (t == 1 && fPts[1] == fPts[2])) {
+ *tangent = fPts[2] - fPts[0];
+ } else {
+ tangent->set(conic_eval_tan(&fPts[0].fX, fW, t),
+ conic_eval_tan(&fPts[0].fY, fW, t));
+ }
}
}
« gm/strokes.cpp ('K') | « gm/strokes.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698