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

Side by Side Diff: src/core/SkPath.cpp

Issue 931183002: add gm for path-arcs, and catch degenerate arc in conic-case (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 10 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/addarc.cpp ('K') | « include/core/SkPath.h ('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 "SkBuffer.h" 8 #include "SkBuffer.h"
9 #include "SkErrorInternals.h" 9 #include "SkErrorInternals.h"
10 #include "SkGeometry.h" 10 #include "SkGeometry.h"
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 static int build_arc_points(const SkRect& oval, const SkVector& start, const SkV ector& stop, 950 static int build_arc_points(const SkRect& oval, const SkVector& start, const SkV ector& stop,
951 SkRotationDirection dir, SkPoint pts[kSkBuildQuadArc Storage]) { 951 SkRotationDirection dir, SkPoint pts[kSkBuildQuadArc Storage]) {
952 SkMatrix matrix; 952 SkMatrix matrix;
953 953
954 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height())); 954 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height()));
955 matrix.postTranslate(oval.centerX(), oval.centerY()); 955 matrix.postTranslate(oval.centerX(), oval.centerY());
956 956
957 return SkBuildQuadArc(start, stop, dir, &matrix, pts); 957 return SkBuildQuadArc(start, stop, dir, &matrix, pts);
958 } 958 }
959 #else 959 #else
960 /**
961 * If this returns 0, then the caller should just line-to the singlePt, else it should
962 * ignore singlePt and append the specified number of conics.
963 */
960 static int build_arc_conics(const SkRect& oval, const SkVector& start, const SkV ector& stop, 964 static int build_arc_conics(const SkRect& oval, const SkVector& start, const SkV ector& stop,
961 SkRotationDirection dir, SkConic conics[SkConic::kMa xConicsForArc]) { 965 SkRotationDirection dir, SkConic conics[SkConic::kMa xConicsForArc],
966 SkPoint* singlePt) {
962 SkMatrix matrix; 967 SkMatrix matrix;
963 968
964 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height())); 969 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height()));
965 matrix.postTranslate(oval.centerX(), oval.centerY()); 970 matrix.postTranslate(oval.centerX(), oval.centerY());
966 971
967 return SkConic::BuildUnitArc(start, stop, dir, &matrix, conics); 972 int count = SkConic::BuildUnitArc(start, stop, dir, &matrix, conics);
973 if (0 == count) {
974 matrix.mapXY(start.x(), start.y(), singlePt);
975 }
976 return count;
968 } 977 }
969 #endif 978 #endif
970 979
971 void SkPath::addRoundRect(const SkRect& rect, const SkScalar radii[], 980 void SkPath::addRoundRect(const SkRect& rect, const SkScalar radii[],
972 Direction dir) { 981 Direction dir) {
973 SkRRect rrect; 982 SkRRect rrect;
974 rrect.setRectRadii(rect, (const SkVector*) radii); 983 rrect.setRectRadii(rect, (const SkVector*) radii);
975 this->addRRect(rrect, dir); 984 this->addRRect(rrect, dir);
976 } 985 }
977 986
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 SkPoint pts[kSkBuildQuadArcStorage]; 1349 SkPoint pts[kSkBuildQuadArcStorage];
1341 int count = build_arc_points(oval, startV, stopV, dir, pts); 1350 int count = build_arc_points(oval, startV, stopV, dir, pts);
1342 SkASSERT((count & 1) == 1); 1351 SkASSERT((count & 1) == 1);
1343 1352
1344 this->incReserve(count); 1353 this->incReserve(count);
1345 forceMoveTo ? this->moveTo(pts[0]) : this->lineTo(pts[0]); 1354 forceMoveTo ? this->moveTo(pts[0]) : this->lineTo(pts[0]);
1346 for (int i = 1; i < count; i += 2) { 1355 for (int i = 1; i < count; i += 2) {
1347 this->quadTo(pts[i], pts[i+1]); 1356 this->quadTo(pts[i], pts[i+1]);
1348 } 1357 }
1349 #else 1358 #else
1359 SkPoint singlePt;
1350 SkConic conics[SkConic::kMaxConicsForArc]; 1360 SkConic conics[SkConic::kMaxConicsForArc];
1351 int count = build_arc_conics(oval, startV, stopV, dir, conics); 1361 int count = build_arc_conics(oval, startV, stopV, dir, conics, &singlePt);
1352 if (count) { 1362 if (count) {
1353 this->incReserve(count * 2 + 1); 1363 this->incReserve(count * 2 + 1);
1354 const SkPoint& pt = conics[0].fPts[0]; 1364 const SkPoint& pt = conics[0].fPts[0];
1355 forceMoveTo ? this->moveTo(pt) : this->lineTo(pt); 1365 forceMoveTo ? this->moveTo(pt) : this->lineTo(pt);
1356 for (int i = 0; i < count; ++i) { 1366 for (int i = 0; i < count; ++i) {
1357 this->conicTo(conics[i].fPts[1], conics[i].fPts[2], conics[i].fW); 1367 this->conicTo(conics[i].fPts[1], conics[i].fPts[2], conics[i].fW);
1358 } 1368 }
1369 } else {
1370 forceMoveTo ? this->moveTo(singlePt) : this->lineTo(singlePt);
1359 } 1371 }
1360 #endif 1372 #endif
1361 } 1373 }
1362 1374
1363 void SkPath::addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle ) { 1375 void SkPath::addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle ) {
1364 if (oval.isEmpty() || 0 == sweepAngle) { 1376 if (oval.isEmpty() || 0 == sweepAngle) {
1365 return; 1377 return;
1366 } 1378 }
1367 1379
1368 const SkScalar kFullCircleAngle = SkIntToScalar(360); 1380 const SkScalar kFullCircleAngle = SkIntToScalar(360);
(...skipping 1576 matching lines...) Expand 10 before | Expand all | Expand 10 after
2945 switch (this->getFillType()) { 2957 switch (this->getFillType()) {
2946 case SkPath::kEvenOdd_FillType: 2958 case SkPath::kEvenOdd_FillType:
2947 case SkPath::kInverseEvenOdd_FillType: 2959 case SkPath::kInverseEvenOdd_FillType:
2948 w &= 1; 2960 w &= 1;
2949 break; 2961 break;
2950 default: 2962 default:
2951 break; 2963 break;
2952 } 2964 }
2953 return SkToBool(w); 2965 return SkToBool(w);
2954 } 2966 }
OLDNEW
« gm/addarc.cpp ('K') | « include/core/SkPath.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698