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

Side by Side 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 unified diff | Download patch
« gm/strokes.cpp ('K') | « gm/strokes.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "SkGeometry.h" 8 #include "SkGeometry.h"
9 #include "SkMatrix.h" 9 #include "SkMatrix.h"
10 #include "SkNx.h" 10 #include "SkNx.h"
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
149 coeff[2] = pts[0]; // C 149 coeff[2] = pts[0]; // C
150 } 150 }
151 151
152 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange nt) { 152 void SkEvalQuadAt(const SkPoint src[3], SkScalar t, SkPoint* pt, SkVector* tange nt) {
153 SkASSERT(src); 153 SkASSERT(src);
154 SkASSERT(t >= 0 && t <= SK_Scalar1); 154 SkASSERT(t >= 0 && t <= SK_Scalar1);
155 155
156 if (pt) { 156 if (pt) {
157 pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t)); 157 pt->set(eval_quad(&src[0].fX, t), eval_quad(&src[0].fY, t));
158 } 158 }
159 if (tangent) { 159 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.
160 tangent->set(eval_quad_derivative(&src[0].fX, t), 160 if ((t == 0 && src[0] == src[1]) || (t == 1 && src[1] == src[2])) {
161 eval_quad_derivative(&src[0].fY, t)); 161 *tangent = src[2] - src[0];
162 } else {
163 tangent->set(eval_quad_derivative(&src[0].fX, t),
164 eval_quad_derivative(&src[0].fY, t));
165 }
162 } 166 }
163 } 167 }
164 168
165 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) { 169 SkPoint SkEvalQuadAt(const SkPoint src[3], SkScalar t) {
166 SkASSERT(src); 170 SkASSERT(src);
167 SkASSERT(t >= 0 && t <= SK_Scalar1); 171 SkASSERT(t >= 0 && t <= SK_Scalar1);
168 172
169 const Sk2s t2(t); 173 const Sk2s t2(t);
170 174
171 Sk2s P0 = from_point(src[0]); 175 Sk2s P0 = from_point(src[0]);
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 395
392 void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc, 396 void SkEvalCubicAt(const SkPoint src[4], SkScalar t, SkPoint* loc,
393 SkVector* tangent, SkVector* curvature) { 397 SkVector* tangent, SkVector* curvature) {
394 SkASSERT(src); 398 SkASSERT(src);
395 SkASSERT(t >= 0 && t <= SK_Scalar1); 399 SkASSERT(t >= 0 && t <= SK_Scalar1);
396 400
397 if (loc) { 401 if (loc) {
398 loc->set(eval_cubic(&src[0].fX, t), eval_cubic(&src[0].fY, t)); 402 loc->set(eval_cubic(&src[0].fX, t), eval_cubic(&src[0].fY, t));
399 } 403 }
400 if (tangent) { 404 if (tangent) {
401 tangent->set(eval_cubic_derivative(&src[0].fX, t), 405 if ((t == 0 && src[0] == src[1]) || (t == 1 && src[2] == src[3])) {
402 eval_cubic_derivative(&src[0].fY, t)); 406 if (t == 0) {
407 *tangent = src[2] - src[0];
408 } else {
409 *tangent = src[3] - src[1];
410 }
411 if (!tangent->fX && !tangent->fY) {
412 *tangent = src[3] - src[0];
413 }
414 } else {
415 tangent->set(eval_cubic_derivative(&src[0].fX, t),
416 eval_cubic_derivative(&src[0].fY, t));
417 }
403 } 418 }
404 if (curvature) { 419 if (curvature) {
405 curvature->set(eval_cubic_2ndDerivative(&src[0].fX, t), 420 curvature->set(eval_cubic_2ndDerivative(&src[0].fX, t),
406 eval_cubic_2ndDerivative(&src[0].fY, t)); 421 eval_cubic_2ndDerivative(&src[0].fY, t));
407 } 422 }
408 } 423 }
409 424
410 /** Cubic'(t) = At^2 + Bt + C, where 425 /** Cubic'(t) = At^2 + Bt + C, where
411 A = 3(-a + 3(b - c) + d) 426 A = 3(-a + 3(b - c) + d)
412 B = 6(a - 2b + c) 427 B = 6(a - 2b + c)
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 } 1240 }
1226 1241
1227 void SkConic::evalAt(SkScalar t, SkPoint* pt, SkVector* tangent) const { 1242 void SkConic::evalAt(SkScalar t, SkPoint* pt, SkVector* tangent) const {
1228 SkASSERT(t >= 0 && t <= SK_Scalar1); 1243 SkASSERT(t >= 0 && t <= SK_Scalar1);
1229 1244
1230 if (pt) { 1245 if (pt) {
1231 pt->set(conic_eval_pos(&fPts[0].fX, fW, t), 1246 pt->set(conic_eval_pos(&fPts[0].fX, fW, t),
1232 conic_eval_pos(&fPts[0].fY, fW, t)); 1247 conic_eval_pos(&fPts[0].fY, fW, t));
1233 } 1248 }
1234 if (tangent) { 1249 if (tangent) {
1235 tangent->set(conic_eval_tan(&fPts[0].fX, fW, t), 1250 if ((t == 0 && fPts[0] == fPts[1]) || (t == 1 && fPts[1] == fPts[2])) {
1236 conic_eval_tan(&fPts[0].fY, fW, t)); 1251 *tangent = fPts[2] - fPts[0];
1252 } else {
1253 tangent->set(conic_eval_tan(&fPts[0].fX, fW, t),
1254 conic_eval_tan(&fPts[0].fY, fW, t));
1255 }
1237 } 1256 }
1238 } 1257 }
1239 1258
1240 void SkConic::chopAt(SkScalar t, SkConic dst[2]) const { 1259 void SkConic::chopAt(SkScalar t, SkConic dst[2]) const {
1241 SkP3D tmp[3], tmp2[3]; 1260 SkP3D tmp[3], tmp2[3];
1242 1261
1243 ratquad_mapTo3D(fPts, fW, tmp); 1262 ratquad_mapTo3D(fPts, fW, tmp);
1244 1263
1245 p3d_interp(&tmp[0].fX, &tmp2[0].fX, t); 1264 p3d_interp(&tmp[0].fX, &tmp2[0].fX, t);
1246 p3d_interp(&tmp[0].fY, &tmp2[0].fY, t); 1265 p3d_interp(&tmp[0].fY, &tmp2[0].fY, t);
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1579 matrix.preScale(SK_Scalar1, -SK_Scalar1); 1598 matrix.preScale(SK_Scalar1, -SK_Scalar1);
1580 } 1599 }
1581 if (userMatrix) { 1600 if (userMatrix) {
1582 matrix.postConcat(*userMatrix); 1601 matrix.postConcat(*userMatrix);
1583 } 1602 }
1584 for (int i = 0; i < conicCount; ++i) { 1603 for (int i = 0; i < conicCount; ++i) {
1585 matrix.mapPoints(dst[i].fPts, 3); 1604 matrix.mapPoints(dst[i].fPts, 3);
1586 } 1605 }
1587 return conicCount; 1606 return conicCount;
1588 } 1607 }
OLDNEW
« 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