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

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: The C parser and warnings as just AWESOME 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
« no previous file with comments | « 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 916 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 static int build_arc_points(const SkRect& oval, const SkVector& start, const SkV ector& stop, 927 static int build_arc_points(const SkRect& oval, const SkVector& start, const SkV ector& stop,
928 SkRotationDirection dir, SkPoint pts[kSkBuildQuadArc Storage]) { 928 SkRotationDirection dir, SkPoint pts[kSkBuildQuadArc Storage]) {
929 SkMatrix matrix; 929 SkMatrix matrix;
930 930
931 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height())); 931 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height()));
932 matrix.postTranslate(oval.centerX(), oval.centerY()); 932 matrix.postTranslate(oval.centerX(), oval.centerY());
933 933
934 return SkBuildQuadArc(start, stop, dir, &matrix, pts); 934 return SkBuildQuadArc(start, stop, dir, &matrix, pts);
935 } 935 }
936 #else 936 #else
937 /**
938 * If this returns 0, then the caller should just line-to the singlePt, else it should
939 * ignore singlePt and append the specified number of conics.
940 */
937 static int build_arc_conics(const SkRect& oval, const SkVector& start, const SkV ector& stop, 941 static int build_arc_conics(const SkRect& oval, const SkVector& start, const SkV ector& stop,
938 SkRotationDirection dir, SkConic conics[SkConic::kMa xConicsForArc]) { 942 SkRotationDirection dir, SkConic conics[SkConic::kMa xConicsForArc],
943 SkPoint* singlePt) {
939 SkMatrix matrix; 944 SkMatrix matrix;
940 945
941 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height())); 946 matrix.setScale(SkScalarHalf(oval.width()), SkScalarHalf(oval.height()));
942 matrix.postTranslate(oval.centerX(), oval.centerY()); 947 matrix.postTranslate(oval.centerX(), oval.centerY());
943 948
944 return SkConic::BuildUnitArc(start, stop, dir, &matrix, conics); 949 int count = SkConic::BuildUnitArc(start, stop, dir, &matrix, conics);
950 if (0 == count) {
951 matrix.mapXY(start.x(), start.y(), singlePt);
952 }
953 return count;
945 } 954 }
946 #endif 955 #endif
947 956
948 void SkPath::addRoundRect(const SkRect& rect, const SkScalar radii[], 957 void SkPath::addRoundRect(const SkRect& rect, const SkScalar radii[],
949 Direction dir) { 958 Direction dir) {
950 SkRRect rrect; 959 SkRRect rrect;
951 rrect.setRectRadii(rect, (const SkVector*) radii); 960 rrect.setRectRadii(rect, (const SkVector*) radii);
952 this->addRRect(rrect, dir); 961 this->addRRect(rrect, dir);
953 } 962 }
954 963
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 SkPoint pts[kSkBuildQuadArcStorage]; 1178 SkPoint pts[kSkBuildQuadArcStorage];
1170 int count = build_arc_points(oval, startV, stopV, dir, pts); 1179 int count = build_arc_points(oval, startV, stopV, dir, pts);
1171 SkASSERT((count & 1) == 1); 1180 SkASSERT((count & 1) == 1);
1172 1181
1173 this->incReserve(count); 1182 this->incReserve(count);
1174 forceMoveTo ? this->moveTo(pts[0]) : this->lineTo(pts[0]); 1183 forceMoveTo ? this->moveTo(pts[0]) : this->lineTo(pts[0]);
1175 for (int i = 1; i < count; i += 2) { 1184 for (int i = 1; i < count; i += 2) {
1176 this->quadTo(pts[i], pts[i+1]); 1185 this->quadTo(pts[i], pts[i+1]);
1177 } 1186 }
1178 #else 1187 #else
1188 SkPoint singlePt;
1179 SkConic conics[SkConic::kMaxConicsForArc]; 1189 SkConic conics[SkConic::kMaxConicsForArc];
1180 int count = build_arc_conics(oval, startV, stopV, dir, conics); 1190 int count = build_arc_conics(oval, startV, stopV, dir, conics, &singlePt);
1181 if (count) { 1191 if (count) {
1182 this->incReserve(count * 2 + 1); 1192 this->incReserve(count * 2 + 1);
1183 const SkPoint& pt = conics[0].fPts[0]; 1193 const SkPoint& pt = conics[0].fPts[0];
1184 forceMoveTo ? this->moveTo(pt) : this->lineTo(pt); 1194 forceMoveTo ? this->moveTo(pt) : this->lineTo(pt);
1185 for (int i = 0; i < count; ++i) { 1195 for (int i = 0; i < count; ++i) {
1186 this->conicTo(conics[i].fPts[1], conics[i].fPts[2], conics[i].fW); 1196 this->conicTo(conics[i].fPts[1], conics[i].fPts[2], conics[i].fW);
1187 } 1197 }
1198 } else {
1199 forceMoveTo ? this->moveTo(singlePt) : this->lineTo(singlePt);
1188 } 1200 }
1189 #endif 1201 #endif
1190 } 1202 }
1191 1203
1192 void SkPath::addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle ) { 1204 void SkPath::addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle ) {
1193 if (oval.isEmpty() || 0 == sweepAngle) { 1205 if (oval.isEmpty() || 0 == sweepAngle) {
1194 return; 1206 return;
1195 } 1207 }
1196 1208
1197 const SkScalar kFullCircleAngle = SkIntToScalar(360); 1209 const SkScalar kFullCircleAngle = SkIntToScalar(360);
(...skipping 1576 matching lines...) Expand 10 before | Expand all | Expand 10 after
2774 switch (this->getFillType()) { 2786 switch (this->getFillType()) {
2775 case SkPath::kEvenOdd_FillType: 2787 case SkPath::kEvenOdd_FillType:
2776 case SkPath::kInverseEvenOdd_FillType: 2788 case SkPath::kInverseEvenOdd_FillType:
2777 w &= 1; 2789 w &= 1;
2778 break; 2790 break;
2779 default: 2791 default:
2780 break; 2792 break;
2781 } 2793 }
2782 return SkToBool(w); 2794 return SkToBool(w);
2783 } 2795 }
OLDNEW
« no previous file with comments | « include/core/SkPath.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698