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
diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp
new file mode 100644
index 0000000..799a3c8
--- /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<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);