diff --git a/Makefile b/Makefile
index 0e3b52d..63fe6e6 100644
--- a/Makefile
+++ b/Makefile
@@ -44,6 +44,7 @@
 	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 := $(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 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);
diff --git a/bench/main.cpp b/bench/main.cpp
index 8891154..d66482f 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 @@
     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;
