--- /dev/null
+#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<SkScalar> 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);