Index: bench/GradientBench.cpp |
diff --git a/bench/GradientBench.cpp b/bench/GradientBench.cpp |
index 53b9e95fff50841be1fc62f31606b5ffb8b58978..73014f7bae2ba55ad960097c2bb70167eb644d10 100644 |
--- a/bench/GradientBench.cpp |
+++ b/bench/GradientBench.cpp |
@@ -10,6 +10,7 @@ |
#include "SkCanvas.h" |
#include "SkColorPriv.h" |
#include "SkGradientShader.h" |
+#include "SkLinearGradient.h" |
#include "SkPaint.h" |
#include "SkShader.h" |
#include "SkString.h" |
@@ -47,12 +48,14 @@ static const GradData gGradData[] = { |
/// Ignores scale |
static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale) { |
- return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm); |
+ SkShader::TileMode tm, float scale, bool force4f) { |
+ const uint32_t flags = force4f ? SkLinearGradient::kForce4fContext_PrivateFlag : 0; |
+ return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, |
+ data.fCount, tm, flags, nullptr); |
} |
static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale) { |
+ SkShader::TileMode tm, float scale, bool force4f) { |
SkPoint center; |
center.set(SkScalarAve(pts[0].fX, pts[1].fX), |
SkScalarAve(pts[0].fY, pts[1].fY)); |
@@ -63,7 +66,7 @@ static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, |
/// Ignores scale |
static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale) { |
+ SkShader::TileMode tm, float scale, bool force4f) { |
SkPoint center; |
center.set(SkScalarAve(pts[0].fX, pts[1].fX), |
SkScalarAve(pts[0].fY, pts[1].fY)); |
@@ -73,7 +76,7 @@ static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, |
/// Ignores scale |
static SkShader* MakeConical(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale) { |
+ SkShader::TileMode tm, float scale, bool force4f) { |
SkPoint center0, center1; |
center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
SkScalarAve(pts[0].fY, pts[1].fY)); |
@@ -86,7 +89,7 @@ static SkShader* MakeConical(const SkPoint pts[2], const GradData& data, |
/// Ignores scale |
static SkShader* MakeConicalZeroRad(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale) { |
+ SkShader::TileMode tm, float scale, bool force4f) { |
SkPoint center0, center1; |
center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
SkScalarAve(pts[0].fY, pts[1].fY)); |
@@ -99,7 +102,7 @@ static SkShader* MakeConicalZeroRad(const SkPoint pts[2], const GradData& data, |
/// Ignores scale |
static SkShader* MakeConicalOutside(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale) { |
+ SkShader::TileMode tm, float scale, bool force4f) { |
SkPoint center0, center1; |
SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10; |
SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3; |
@@ -113,7 +116,7 @@ static SkShader* MakeConicalOutside(const SkPoint pts[2], const GradData& data, |
/// Ignores scale |
static SkShader* MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale) { |
+ SkShader::TileMode tm, float scale, bool force4f) { |
SkPoint center0, center1; |
SkScalar radius0 = (pts[1].fX - pts[0].fX) / 10; |
SkScalar radius1 = (pts[1].fX - pts[0].fX) / 3; |
@@ -126,7 +129,7 @@ static SkShader* MakeConicalOutsideZeroRad(const SkPoint pts[2], const GradData& |
} |
typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, |
- SkShader::TileMode tm, float scale); |
+ SkShader::TileMode tm, float scale, bool force4f); |
static const struct { |
GradMaker fMaker; |
@@ -185,33 +188,19 @@ static const char* geomtypename(GeomType gt) { |
/////////////////////////////////////////////////////////////////////////////// |
class GradientBench : public Benchmark { |
- SkString fName; |
- SkShader* fShader; |
- bool fDither; |
- enum { |
- W = 400, |
- H = 400, |
- }; |
public: |
- SkShader* makeShader(GradType gradType, GradData data, SkShader::TileMode tm, float scale) { |
- const SkPoint pts[2] = { |
- { 0, 0 }, |
- { SkIntToScalar(W), SkIntToScalar(H) } |
- }; |
- |
- return gGrads[gradType].fMaker(pts, data, tm, scale); |
- } |
- |
GradientBench(GradType gradType, |
GradData data = gGradData[0], |
SkShader::TileMode tm = SkShader::kClamp_TileMode, |
GeomType geomType = kRect_GeomType, |
- float scale = 1.0f) { |
+ float scale = 1.0f, |
+ bool force4f = false) |
+ : fGeomType(geomType) { |
+ |
fName.printf("gradient_%s_%s", gGrads[gradType].fName, |
tilemodename(tm)); |
if (geomType != kRect_GeomType) { |
- fName.append("_"); |
- fName.append(geomtypename(geomType)); |
+ fName.appendf("_%s", geomtypename(geomType)); |
} |
if (scale != 1.f) { |
@@ -220,51 +209,52 @@ public: |
fName.append(data.fName); |
- fDither = false; |
- fShader = this->makeShader(gradType, data, tm, scale); |
- fGeomType = geomType; |
+ if (force4f) { |
+ fName.append("_4f"); |
+ } |
+ |
+ SkAutoTUnref<SkShader> shader(MakeShader(gradType, data, tm, scale, force4f)); |
+ this->setupPaint(&fPaint); |
+ fPaint.setShader(shader); |
} |
- GradientBench(GradType gradType, GradData data, bool dither) { |
+ GradientBench(GradType gradType, GradData data, bool dither, bool force4f = false) |
+ : fGeomType(kRect_GeomType) { |
+ |
const char *tmname = tilemodename(SkShader::kClamp_TileMode); |
fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname); |
fName.append(data.fName); |
- fDither = dither; |
if (dither) { |
fName.appendf("_dither"); |
} |
- fShader = this->makeShader(gradType, data, SkShader::kClamp_TileMode, 1.0f); |
- fGeomType = kRect_GeomType; |
- } |
- |
- virtual ~GradientBench() { |
- fShader->unref(); |
+ SkAutoTUnref<SkShader> shader( |
+ MakeShader(gradType, data, SkShader::kClamp_TileMode, 1.0f, force4f)); |
+ this->setupPaint(&fPaint); |
+ fPaint.setShader(shader); |
+ fPaint.setDither(dither); |
} |
protected: |
- virtual const char* onGetName() { |
+ const char* onGetName() override { |
return fName.c_str(); |
} |
- virtual void onDraw(int loops, SkCanvas* canvas) { |
- SkPaint paint; |
- this->setupPaint(&paint); |
+ SkIPoint onGetSize() override { |
+ return SkIPoint::Make(kSize, kSize); |
+ } |
- paint.setShader(fShader); |
- if (fDither) { |
- paint.setDither(true); |
- } |
+ void onDraw(int loops, SkCanvas* canvas) override { |
+ const SkRect r = SkRect::MakeIWH(kSize, kSize); |
- SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) }; |
for (int i = 0; i < loops; i++) { |
switch (fGeomType) { |
case kRect_GeomType: |
- canvas->drawRect(r, paint); |
+ canvas->drawRect(r, fPaint); |
break; |
case kOval_GeomType: |
- canvas->drawOval(r, paint); |
+ canvas->drawOval(r, fPaint); |
break; |
} |
} |
@@ -273,13 +263,52 @@ protected: |
private: |
typedef Benchmark INHERITED; |
- GeomType fGeomType; |
+ SkShader* MakeShader(GradType gradType, GradData data, |
+ SkShader::TileMode tm, float scale, bool force4f) { |
+ const SkPoint pts[2] = { |
+ { 0, 0 }, |
+ { SkIntToScalar(kSize), SkIntToScalar(kSize) } |
+ }; |
+ |
+ return gGrads[gradType].fMaker(pts, data, tm, scale, force4f); |
+ } |
+ |
+ static const int kSize = 400; |
+ |
+ SkString fName; |
+ SkPaint fPaint; |
+ const GeomType fGeomType; |
}; |
-DEF_BENCH( return new GradientBench(kLinear_GradType); ) |
+// 4f |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kClamp_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kClamp_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kClamp_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode, |
+ kRect_GeomType, 1, true); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode, |
+ kRect_GeomType, 1, true); ) |
+ |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0]); ) |
DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1]); ) |
DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2]); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kRepeat_TileMode); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kRepeat_TileMode); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kRepeat_TileMode); ) |
DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[0], SkShader::kMirror_TileMode); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[1], SkShader::kMirror_TileMode); ) |
+DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[2], SkShader::kMirror_TileMode); ) |
DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[0]); ) |
DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[1]); ) |