From 3a859a00342ed078af683fd1901fd26c93dd40f0 Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Wed, 28 Jan 2009 00:56:29 +0000 Subject: draft of Text benchmark not enabled yet, as having trouble with mac-fonthost port git-svn-id: http://skia.googlecode.com/svn/trunk@87 2bbb7eff-a529-9590-31e7-b0007b416f81 --- bench/TextBench.cpp | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 bench/TextBench.cpp (limited to 'bench/TextBench.cpp') diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp new file mode 100644 index 0000000000..799a3c852c --- /dev/null +++ b/bench/TextBench.cpp @@ -0,0 +1,114 @@ +#include "SkBenchmark.h" +#include "SkCanvas.h" +#include "SkPaint.h" +#include "SkRandom.h" +#include "SkString.h" +#include "SkTemplates.h" + +/* Some considerations for performance: + short -vs- long strings (measuring overhead) + tiny -vs- large pointsize (measure blit -vs- overhead) + 1 -vs- many point sizes (measure cache lookup) + normal -vs- subpixel -vs- lineartext (minor) + force purge after each draw to measure scaler + textencoding? + text -vs- postext - pathtext + */ +class TextBench : public SkBenchmark { + SkPaint fPaint; + int fCount; + SkPoint* fPos; + SkString fText; + SkString fName; + enum { N = 300 }; +public: + TextBench(const char text[], int ps, bool linearText, bool posText) { + fText.set(text); + + fPaint.setAntiAlias(true); + fPaint.setTextSize(SkIntToScalar(ps)); + fPaint.setLinearText(linearText); + + if (posText) { + SkAutoTArray storage(fText.size()); + SkScalar* widths = storage.get(); + fCount = fPaint.getTextWidths(fText.c_str(), fText.size(), widths); + fPos = new SkPoint[fCount]; + SkScalar x = 0; + for (int i = 0; i < fCount; i++) { + fPos[i].set(x, 0); + x += widths[i]; + } + } else { + fCount = 0; + fPos = NULL; + } + } + + virtual ~TextBench() { + delete[] fPos; + } + +protected: + virtual const char* onGetName() { + fName.printf("text_%g", SkScalarToFloat(fPaint.getTextSize())); + if (fPaint.isLinearText()) { + fName.append("_linear"); + } + if (fPos) { + fName.append("_pos"); + } + return fName.c_str(); + } + + virtual void onDraw(SkCanvas* canvas) { + const SkIPoint dim = this->getSize(); + SkRandom rand; + + SkPaint paint(fPaint); + this->setupPaint(&paint); + + const SkScalar x0 = SkIntToScalar(-10); + const SkScalar y0 = SkIntToScalar(-10); + + for (int i = 0; i < N; i++) { + SkScalar x = x0 + rand.nextUScalar1() * dim.fX; + SkScalar y = y0 + rand.nextUScalar1() * dim.fY; + if (fPos) { + canvas->save(SkCanvas::kMatrix_SaveFlag); + canvas->translate(x, y); + canvas->drawPosText(fText.c_str(), fText.size(), fPos, paint); + canvas->restore(); + } else { + canvas->drawText(fText.c_str(), fText.size(), x, y, paint); + } + } + } + +private: + typedef SkBenchmark INHERITED; +}; + +/////////////////////////////////////////////////////////////////////////////// + +#define STR "Hamburgefons" +#define SMALL 9 +#define BIG 48 + +static SkBenchmark* Fact0(void*) { return new TextBench(STR, SMALL, false, false); } +static SkBenchmark* Fact1(void*) { return new TextBench(STR, SMALL, false, true); } +static SkBenchmark* Fact2(void*) { return new TextBench(STR, SMALL, true, false); } +static SkBenchmark* Fact3(void*) { return new TextBench(STR, SMALL, true, true); } +static SkBenchmark* Fact4(void*) { return new TextBench(STR, BIG, false, false); } +static SkBenchmark* Fact5(void*) { return new TextBench(STR, BIG, false, true); } +static SkBenchmark* Fact6(void*) { return new TextBench(STR, BIG, true, false); } +static SkBenchmark* Fact7(void*) { return new TextBench(STR, BIG, true, true); } + +static BenchRegistry gReg0(Fact0); +static BenchRegistry gReg1(Fact1); +static BenchRegistry gReg2(Fact2); +static BenchRegistry gReg3(Fact3); +static BenchRegistry gReg4(Fact4); +static BenchRegistry gReg5(Fact5); +static BenchRegistry gReg6(Fact6); +static BenchRegistry gReg7(Fact7); -- cgit v1.2.3