draft of Text benchmark
authorreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 28 Jan 2009 00:56:29 +0000 (00:56 +0000)
committerreed@android.com <reed@android.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 28 Jan 2009 00:56:29 +0000 (00:56 +0000)
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

Makefile
bench/TextBench.cpp [new file with mode: 0644]
bench/main.cpp

index 0e3b52d..63fe6e6 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -44,6 +44,7 @@ ifeq ($(SKIA_BUILD_FOR),mac)
        C_INCLUDES += -Iinclude/utils/mac
        SRC_LIST += src/ports/SkImageDecoder_CG.cpp
        SRC_LIST += src/utils/mac/SkCreateCGImageRef.cpp
+       SRC_LIST += src/ports/SkFontHost_mac.cpp
 else
        LINKER_OPTS += -lpng
        DEFINES += -DSK_BUILD_FOR_UNIX
@@ -72,7 +73,9 @@ BENCH_SRCS := RectBench.cpp SkBenchmark.cpp main.cpp BitmapBench.cpp
 BENCH_SRCS := $(addprefix bench/, $(BENCH_SRCS))
 
 # add any optional codecs for this app
-ifneq ($(SKIA_BUILD_FOR),mac)
+ifeq ($(SKIA_BUILD_FOR),mac)
+#    BENCH_SRCS += bench/TextBench.cpp
+else
     BENCH_SRCS += src/images/SkImageDecoder_libpng.cpp
 endif
 
diff --git a/bench/TextBench.cpp b/bench/TextBench.cpp
new file mode 100644 (file)
index 0000000..799a3c8
--- /dev/null
@@ -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);
index 8891154..d66482f 100644 (file)
@@ -1,5 +1,6 @@
 #include "SkCanvas.h"
 #include "SkColorPriv.h"
+#include "SkGraphics.h"
 #include "SkImageEncoder.h"
 #include "SkString.h"
 #include "SkTime.h"
@@ -109,7 +110,19 @@ static int findConfig(const char config[]) {
     return -1;
 }
 
+class SkAutoGraphics {
+public:
+    SkAutoGraphics(bool runUnitTests = false) {
+        SkGraphics::Init(runUnitTests);
+    }
+    ~SkAutoGraphics() {
+        SkGraphics::Term();
+    }
+};
+
 int main (int argc, char * const argv[]) {
+    SkAutoGraphics ag;
+
     int repeatDraw = 1;
     int forceAlpha = 0xFF;
     bool forceAA = true;