aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--bench/TextBench.cpp114
-rw-r--r--bench/main.cpp13
3 files changed, 131 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 0e3b52dd79..63fe6e66e9 100644
--- 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
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<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);
diff --git a/bench/main.cpp b/bench/main.cpp
index 88911541b2..d66482f5cc 100644
--- a/bench/main.cpp
+++ b/bench/main.cpp
@@ -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;