| Index: bench/GradientBench.cpp
|
| diff --git a/bench/GradientBench.cpp b/bench/GradientBench.cpp
|
| index fa07bce4fd1f1404f686b9ee44584765782b226e..671134062c0225ae5bcd8595e0588e1d6b41e337 100644
|
| --- a/bench/GradientBench.cpp
|
| +++ b/bench/GradientBench.cpp
|
| @@ -34,12 +34,15 @@ static const SkColor gColors[] = {
|
| SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK, // 10 lines, 50 colors
|
| };
|
|
|
| +static const SkColor gShallowColors[] = { 0xFF555555, 0xFF444444 };
|
| +
|
| // We have several special-cases depending on the number (and spacing) of colors, so
|
| // try to exercise those here.
|
| static const GradData gGradData[] = {
|
| { 2, gColors, NULL, "" },
|
| { 50, gColors, NULL, "_hicolor" }, // many color gradient
|
| { 3, gColors, NULL, "_3color" },
|
| + { 2, gShallowColors, NULL, "_shallow" },
|
| };
|
|
|
| /// Ignores scale
|
| @@ -200,12 +203,22 @@ static const char* geomtypename(GeomType gt) {
|
| class GradientBench : public SkBenchmark {
|
| SkString fName;
|
| SkShader* fShader;
|
| + bool fDither;
|
| enum {
|
| W = 400,
|
| H = 400,
|
| kRepeat = 15,
|
| };
|
| 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,
|
| @@ -224,15 +237,27 @@ public:
|
|
|
| fName.append(data.fName);
|
|
|
| - const SkPoint pts[2] = {
|
| - { 0, 0 },
|
| - { SkIntToScalar(W), SkIntToScalar(H) }
|
| - };
|
| -
|
| - fShader = gGrads[gradType].fMaker(pts, data, tm, scale);
|
| + fDither = false;
|
| + fShader = this->makeShader(gradType, data, tm, scale);
|
| fGeomType = geomType;
|
| }
|
|
|
| + GradientBench(GradType gradType, GradData data, bool dither) {
|
| + const char *tmname = tilemodename(SkShader::kClamp_TileMode);
|
| + fName.printf("gradient_%s_%s", gGrads[gradType].fName, tmname);
|
| + fName.append(data.fName);
|
| +
|
| + if (dither) {
|
| + fDither = true;
|
| + fName.appendf("_dither");
|
| + } else {
|
| + fDither = false;
|
| + }
|
| +
|
| + fShader = this->makeShader(gradType, data, SkShader::kClamp_TileMode, 1.0f);
|
| + fGeomType = kRect_GeomType;
|
| + }
|
| +
|
| virtual ~GradientBench() {
|
| fShader->unref();
|
| }
|
| @@ -247,6 +272,9 @@ protected:
|
| this->setupPaint(&paint);
|
|
|
| paint.setShader(fShader);
|
| + if (fDither) {
|
| + paint.setDither(true);
|
| + }
|
|
|
| SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
|
| for (int i = 0; i < loops * kRepeat; i++) {
|
| @@ -304,6 +332,16 @@ DEF_BENCH( return new GradientBench(kConicalOutZero_GradType); )
|
| DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[1]); )
|
| DEF_BENCH( return new GradientBench(kConicalOutZero_GradType, gGradData[2]); )
|
|
|
| +// Dithering
|
| +DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], true); )
|
| +DEF_BENCH( return new GradientBench(kLinear_GradType, gGradData[3], false); )
|
| +DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], true); )
|
| +DEF_BENCH( return new GradientBench(kRadial_GradType, gGradData[3], false); )
|
| +DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], true); )
|
| +DEF_BENCH( return new GradientBench(kSweep_GradType, gGradData[3], false); )
|
| +DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], true); )
|
| +DEF_BENCH( return new GradientBench(kConical_GradType, gGradData[3], false); )
|
| +
|
| ///////////////////////////////////////////////////////////////////////////////
|
|
|
| class Gradient2Bench : public SkBenchmark {
|
|
|