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

Unified Diff: src/core/SkPath.cpp

Issue 792493005: use conics for addRRect (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkPath.cpp
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
index 6e09af78dd1a03a5ac80f5aa0d87dfc379f19465..cee93d352e7537aa4b95fa98ea3efa2f78a6d622 100644
--- a/src/core/SkPath.cpp
+++ b/src/core/SkPath.cpp
@@ -14,7 +14,10 @@
#include "SkRRect.h"
#include "SkThread.h"
+// These two should be removed once we fix any gpu bugs, and then
+// just move them into skia_for_chromium_defines.gypi
#define SK_SUPPORT_LEGACY_ADDOVAL
+#define SK_SUPPORT_LEGACY_ADDRRECT
////////////////////////////////////////////////////////////////////////////
@@ -970,6 +973,7 @@ void SkPath::addRoundRect(const SkRect& rect, const SkScalar radii[],
this->addRRect(rrect, dir);
}
+#ifdef SK_SUPPORT_LEGACY_ADDRRECT
/* The inline clockwise and counterclockwise round rect quad approximations
make it easier to see the symmetry patterns used by add corner quads.
Clockwise corner value
@@ -1096,6 +1100,7 @@ static void add_corner_quads(SkPath* path, const SkRRect& rrect,
path->lineTo(xOff[4], yOff[4]);
}
}
+#endif
void SkPath::addRRect(const SkRRect& rrect, Direction dir) {
assert_known_direction(dir);
@@ -1116,6 +1121,7 @@ void SkPath::addRRect(const SkRRect& rrect, Direction dir) {
SkAutoPathBoundsUpdate apbu(this, bounds);
SkAutoDisableDirectionCheck addc(this);
+#ifdef SK_SUPPORT_LEGACY_ADDRRECT
this->incReserve(21);
if (kCW_Direction == dir) {
this->moveTo(bounds.fLeft,
@@ -1132,6 +1138,44 @@ void SkPath::addRRect(const SkRRect& rrect, Direction dir) {
add_corner_quads(this, rrect, SkRRect::kUpperRight_Corner, dir);
add_corner_quads(this, rrect, SkRRect::kUpperLeft_Corner, dir);
}
+#else
+ const SkScalar L = bounds.fLeft;
+ const SkScalar T = bounds.fTop;
+ const SkScalar R = bounds.fRight;
+ const SkScalar B = bounds.fBottom;
+ const SkScalar W = SK_ScalarRoot2Over2;
+
+ this->incReserve(13);
+ if (kCW_Direction == dir) {
+ this->moveTo(L, B - rrect.fRadii[SkRRect::kLowerLeft_Corner].fY);
+
+ this->lineTo(L, T + rrect.fRadii[SkRRect::kUpperLeft_Corner].fY);
+ this->conicTo(L, T, L + rrect.fRadii[SkRRect::kUpperLeft_Corner].fX, T, W);
+
+ this->lineTo(R - rrect.fRadii[SkRRect::kUpperRight_Corner].fX, T);
+ this->conicTo(R, T, R, T + rrect.fRadii[SkRRect::kUpperRight_Corner].fY, W);
+
+ this->lineTo(R, B - rrect.fRadii[SkRRect::kLowerRight_Corner].fY);
+ this->conicTo(R, B, R - rrect.fRadii[SkRRect::kLowerRight_Corner].fX, B, W);
+
+ this->lineTo(L + rrect.fRadii[SkRRect::kLowerLeft_Corner].fX, B);
+ this->conicTo(L, B, L, B - rrect.fRadii[SkRRect::kLowerLeft_Corner].fY, W);
+ } else {
+ this->moveTo(L, T + rrect.fRadii[SkRRect::kUpperLeft_Corner].fY);
+
+ this->lineTo(L, B - rrect.fRadii[SkRRect::kLowerLeft_Corner].fY);
+ this->conicTo(L, B, L + rrect.fRadii[SkRRect::kLowerLeft_Corner].fX, B, W);
+
+ this->lineTo(R - rrect.fRadii[SkRRect::kLowerRight_Corner].fX, B);
+ this->conicTo(R, B, R, B - rrect.fRadii[SkRRect::kLowerRight_Corner].fY, W);
+
+ this->lineTo(R, T + rrect.fRadii[SkRRect::kUpperRight_Corner].fY);
+ this->conicTo(R, T, R - rrect.fRadii[SkRRect::kUpperRight_Corner].fX, T, W);
+
+ this->lineTo(L + rrect.fRadii[SkRRect::kUpperLeft_Corner].fX, T);
+ this->conicTo(L, T, L, T + rrect.fRadii[SkRRect::kUpperLeft_Corner].fY, W);
+ }
+#endif
this->close();
}
SkDEBUGCODE(fPathRef->validate();)
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698