aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-03-26 09:10:22 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-03-26 09:10:22 -0700
commit55011038816a3fc7f0c0a39d482fb85347cc2e78 (patch)
treef2f677cfb84e7bda5f5827883fac48ace5f2312c
parent384181c8100e059a94b1708f8af766e598fab3d9 (diff)
use new faster/vector impl for chopping conics
-rw-r--r--bench/PathBench.cpp55
-rw-r--r--src/core/SkGeometry.cpp27
-rw-r--r--src/core/SkGeometry.h1
-rw-r--r--tests/GeometryTest.cpp16
4 files changed, 16 insertions, 83 deletions
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index 2e91a0b390..a429e2f972 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -806,44 +806,16 @@ private:
#include "SkGeometry.h"
-class ConicBench_Chop5 : public Benchmark {
- SkConic fRQ;
-public:
- ConicBench_Chop5() {
- fRQ.fPts[0].set(0, 0);
- fRQ.fPts[1].set(100, 0);
- fRQ.fPts[2].set(100, 100);
- fRQ.fW = SkScalarCos(SK_ScalarPI/4);
- }
-
-private:
- const char* onGetName() override {
- return "ratquad-chop-0.5";
- }
-
- void onDraw(const int loops, SkCanvas*) override {
- SkConic dst[2];
- for (int i = 0; i < loops; ++i) {
- fRQ.chopAt(0.5f, dst);
- }
- }
-
- typedef Benchmark INHERITED;
-};
-
-class ConicBench_ChopHalf : public Benchmark {
+class ConicBench_Chop : public Benchmark {
protected:
SkConic fRQ, fDst[2];
SkString fName;
- const bool fUseV2;
public:
- ConicBench_ChopHalf(bool useV2) : fUseV2(useV2) {
+ ConicBench_Chop() : fName("conic-chop") {
fRQ.fPts[0].set(0, 0);
fRQ.fPts[1].set(100, 0);
fRQ.fPts[2].set(100, 100);
fRQ.fW = SkScalarCos(SK_ScalarPI/4);
-
- fName.printf("conic-chop-half%d", useV2);
}
bool isSuitableFor(Backend backend) override {
@@ -854,25 +826,19 @@ private:
const char* onGetName() override { return fName.c_str(); }
void onDraw(const int loops, SkCanvas*) override {
- if (fUseV2) {
- for (int i = 0; i < loops; ++i) {
- fRQ.chop2(fDst);
- }
- } else {
- for (int i = 0; i < loops; ++i) {
- fRQ.chop(fDst);
- }
+ for (int i = 0; i < loops; ++i) {
+ fRQ.chop(fDst);
}
}
typedef Benchmark INHERITED;
};
-DEF_BENCH( return new ConicBench_ChopHalf(false); )
-DEF_BENCH( return new ConicBench_ChopHalf(true); )
+DEF_BENCH( return new ConicBench_Chop; )
-class ConicBench_EvalPos : public ConicBench_ChopHalf {
+class ConicBench_EvalPos : public ConicBench_Chop {
+ const bool fUseV2;
public:
- ConicBench_EvalPos(bool useV2) : ConicBench_ChopHalf(useV2) {
+ ConicBench_EvalPos(bool useV2) : fUseV2(useV2) {
fName.printf("conic-eval-pos%d", useV2);
}
void onDraw(const int loops, SkCanvas*) override {
@@ -894,9 +860,10 @@ public:
DEF_BENCH( return new ConicBench_EvalPos(false); )
DEF_BENCH( return new ConicBench_EvalPos(true); )
-class ConicBench_EvalTan : public ConicBench_ChopHalf {
+class ConicBench_EvalTan : public ConicBench_Chop {
+ const bool fUseV2;
public:
- ConicBench_EvalTan(bool useV2) : ConicBench_ChopHalf(useV2) {
+ ConicBench_EvalTan(bool useV2) : fUseV2(useV2) {
fName.printf("conic-eval-tan%d", useV2);
}
void onDraw(const int loops, SkCanvas*) override {
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp
index 24946b9972..d542695fbe 100644
--- a/src/core/SkGeometry.cpp
+++ b/src/core/SkGeometry.cpp
@@ -1285,38 +1285,21 @@ static SkScalar subdivide_w_value(SkScalar w) {
return SkScalarSqrt(SK_ScalarHalf + w * SK_ScalarHalf);
}
-void SkConic::chop(SkConic dst[2]) const {
- SkScalar scale = SkScalarInvert(SK_Scalar1 + fW);
- SkScalar p1x = fW * fPts[1].fX;
- SkScalar p1y = fW * fPts[1].fY;
- SkScalar mx = (fPts[0].fX + 2 * p1x + fPts[2].fX) * scale * SK_ScalarHalf;
- SkScalar my = (fPts[0].fY + 2 * p1y + fPts[2].fY) * scale * SK_ScalarHalf;
-
- dst[0].fPts[0] = fPts[0];
- dst[0].fPts[1].set((fPts[0].fX + p1x) * scale,
- (fPts[0].fY + p1y) * scale);
- dst[0].fPts[2].set(mx, my);
-
- dst[1].fPts[0].set(mx, my);
- dst[1].fPts[1].set((p1x + fPts[2].fX) * scale,
- (p1y + fPts[2].fY) * scale);
- dst[1].fPts[2] = fPts[2];
-
- dst[0].fW = dst[1].fW = subdivide_w_value(fW);
+static Sk2s twice(const Sk2s& value) {
+ return value + value;
}
-void SkConic::chop2(SkConic * SK_RESTRICT dst) const {
- Sk2s scale = Sk2s(SK_Scalar1 + fW).invert(); // approxInvert is wicked faster!!!
+void SkConic::chop(SkConic * SK_RESTRICT dst) const {
+ Sk2s scale = Sk2s(SkScalarInvert(SK_Scalar1 + fW));
SkScalar newW = subdivide_w_value(fW);
Sk2s p0 = from_point(fPts[0]);
Sk2s p1 = from_point(fPts[1]);
Sk2s p2 = from_point(fPts[2]);
Sk2s ww(fW);
- Sk2s half(0.5f);
Sk2s wp1 = ww * p1;
- Sk2s m = ((p0 + wp1 + wp1 + p2) * half) * scale;
+ Sk2s m = (p0 + twice(wp1) + p2) * scale * Sk2s(0.5f);
dst[0].fPts[0] = fPts[0];
dst[0].fPts[1] = to_point((p0 + wp1) * scale);
diff --git a/src/core/SkGeometry.h b/src/core/SkGeometry.h
index a87a19fc0b..bafde61155 100644
--- a/src/core/SkGeometry.h
+++ b/src/core/SkGeometry.h
@@ -221,7 +221,6 @@ struct SkConic {
SkPoint evalAt(SkScalar t) const;
SkVector evalTangentAt(SkScalar t) const;
- void chop2(SkConic dst[2]) const;
void computeAsQuadError(SkVector* err) const;
bool asQuadTol(SkScalar tol) const;
diff --git a/tests/GeometryTest.cpp b/tests/GeometryTest.cpp
index 846afaed2d..0ec7d68abf 100644
--- a/tests/GeometryTest.cpp
+++ b/tests/GeometryTest.cpp
@@ -83,21 +83,6 @@ static void test_conic_eval_tan(skiatest::Reporter* reporter, const SkConic& con
check_pairs(reporter, 0, t, "conic-tan", v0.fX, v0.fY, v1.fX, v1.fY);
}
-static void test_conic_chop_half(skiatest::Reporter* reporter, const SkConic& conic) {
- SkConic dst0[2], dst1[2];
- conic.chop(dst0);
- conic.chop2(dst1);
-
- for (int i = 0; i < 2; ++i) {
- REPORTER_ASSERT(reporter, dst0[i].fW == dst1[i].fW);
- for (int j = 0; j < 3; ++j) {
- check_pairs(reporter, j, 0.5f, "conic-chop",
- dst0[i].fPts[j].fX, dst0[i].fPts[j].fY,
- dst0[i].fPts[j].fX, dst1[i].fPts[j].fY);
- }
- }
-}
-
static void test_conic(skiatest::Reporter* reporter) {
SkRandom rand;
for (int i = 0; i < 1000; ++i) {
@@ -108,7 +93,6 @@ static void test_conic(skiatest::Reporter* reporter) {
for (int k = 0; k < 10; ++k) {
SkScalar w = rand.nextUScalar1() * 2;
SkConic conic(pts, w);
- test_conic_chop_half(reporter, conic);
const SkScalar dt = SK_Scalar1 / 128;
SkScalar t = dt;