diff --git a/bench/FPSBench.cpp b/bench/FPSBench.cpp
new file mode 100644
index 0000000..f103dc1
--- /dev/null
+++ b/bench/FPSBench.cpp
@@ -0,0 +1,93 @@
+#include "SkBenchmark.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkRandom.h"
+#include "SkString.h"
+
+class FPSBench : public SkBenchmark {
+    int32_t fWidth;
+    int32_t fHeight;
+public:
+    FPSBench(void* p) : INHERITED(p) {
+        fWidth = 640;
+        (void)this->findDefine32("width", &fWidth);
+        fHeight = 480;
+        (void)this->findDefine32("height", &fHeight);
+    }
+
+    int width() const { return fWidth; }
+    int height() const { return fHeight; }
+
+protected:
+    virtual SkIPoint onGetSize() { return SkIPoint::Make(fWidth, fHeight); }
+
+private:
+    typedef SkBenchmark INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
+class Color_FPSBench : public FPSBench {
+public:
+    Color_FPSBench(void* p, SkColor c, const char name[]) : INHERITED(p) {
+        fColor = c;
+        fName = name;
+    }
+    
+protected:
+    virtual const char* onGetName() { return fName; }
+    virtual void onDraw(SkCanvas* canvas) {
+        canvas->drawColor(fColor);
+    }
+    
+private:
+    const char* fName;
+    SkColor     fColor;
+    
+    typedef FPSBench INHERITED;
+};
+
+class Bitmap_FPSBench : public FPSBench {
+public:
+    Bitmap_FPSBench(void* p, SkBitmap::Config config, bool doScale) : INHERITED(p) {
+        fBitmap.setConfig(config, this->width(), this->height());
+        fBitmap.allocPixels();
+        fBitmap.eraseColor(0xFFFF0000);
+
+        fName.printf("fps_bitmap_%d_%s", fBitmap.bytesPerPixel(),
+                     doScale ? "scale" : "noscale");
+
+        fMatrix.reset();
+        if (doScale) {
+            fMatrix.setScale(SkIntToScalar(3)/2, SkIntToScalar(3)/2);
+        }
+    }
+    
+protected:
+    virtual const char* onGetName() { return fName.c_str(); }
+    virtual void onDraw(SkCanvas* canvas) {
+        canvas->drawBitmapMatrix(fBitmap, fMatrix);
+    }
+    
+private:
+    SkBitmap    fBitmap;
+    SkMatrix    fMatrix;
+    SkString    fName;
+    
+    typedef FPSBench INHERITED;
+};
+
+static SkBenchmark* FillFactory(void* p) { return SkNEW_ARGS(Color_FPSBench, (p, 0xFFFF0000, "fps_fill")); }
+static SkBenchmark* BlendFactory(void* p) { return SkNEW_ARGS(Color_FPSBench, (p, 0x80FF0000, "fps_blend")); }
+static SkBenchmark* BMFactory0(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kARGB_8888_Config, false)); }
+static SkBenchmark* BMFactory1(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kARGB_8888_Config, true)); }
+static SkBenchmark* BMFactory2(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kRGB_565_Config, false)); }
+static SkBenchmark* BMFactory3(void* p) { return SkNEW_ARGS(Bitmap_FPSBench, (p, SkBitmap::kRGB_565_Config, true)); }
+
+static BenchRegistry gFillReg(FillFactory);
+static BenchRegistry gBlendReg(BlendFactory);
+static BenchRegistry gBMReg0(BMFactory0);
+static BenchRegistry gBMReg1(BMFactory1);
+static BenchRegistry gBMReg2(BMFactory2);
+static BenchRegistry gBMReg3(BMFactory3);
+
diff --git a/bench/Makefile.am b/bench/Makefile.am
index be0ebdb..2b67862 100644
--- a/bench/Makefile.am
+++ b/bench/Makefile.am
@@ -3,6 +3,7 @@
 
 bin_PROGRAMS = Bench
 Bench_SOURCES = RectBench.cpp \
+                FPSBench.cpp \
                 SkBenchmark.cpp \
                 BenchTool/main.cpp \
                 $(top_builddir)/src/images/SkImageDecoder.cpp \
diff --git a/bench/SkBenchmark.cpp b/bench/SkBenchmark.cpp
index 36280ac..e8bea6e 100644
--- a/bench/SkBenchmark.cpp
+++ b/bench/SkBenchmark.cpp
@@ -1,5 +1,6 @@
 #include "SkBenchmark.h"
 #include "SkPaint.h"
+#include "SkParse.h"
 
 template BenchRegistry* BenchRegistry::gHead;
 
@@ -42,8 +43,26 @@
     return NULL;
 }
 
+bool SkBenchmark::findDefine32(const char* key, int32_t* value) const {
+    const char* valueStr = this->findDefine(key);
+    if (valueStr) {
+        SkParse::FindS32(valueStr, value);
+        return true;
+    }
+    return false;
+}
+
+bool SkBenchmark::findDefineScalar(const char* key, SkScalar* value) const {
+    const char* valueStr = this->findDefine(key);
+    if (valueStr) {
+        SkParse::FindScalar(valueStr, value);
+        return true;
+    }
+    return false;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 SkIPoint SkBenchmark::onGetSize() {
-    return SkMakeIPoint(640, 480);
+    return SkIPoint::Make(640, 480);
 }
diff --git a/bench/SkBenchmark.h b/bench/SkBenchmark.h
index a9c4085..bc9794a 100644
--- a/bench/SkBenchmark.h
+++ b/bench/SkBenchmark.h
@@ -43,6 +43,8 @@
     }
 
     const char* findDefine(const char* key) const;
+    bool findDefine32(const char* key, int32_t* value) const;
+    bool findDefineScalar(const char* key, SkScalar* value) const;
 
 protected:
     void setupPaint(SkPaint* paint);
@@ -60,12 +62,6 @@
     SkTriState::State  fDither;
 };
 
-static inline SkIPoint SkMakeIPoint(int x, int y) {
-    SkIPoint p;
-    p.set(x, y);
-    return p;
-}
-
 typedef SkTRegistry<SkBenchmark*, void*> BenchRegistry;
 
 #endif
diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp
index 23a0c85..598eb84 100644
--- a/bench/benchmain.cpp
+++ b/bench/benchmain.cpp
@@ -284,9 +284,9 @@
                 log_error("missing arg for -config\n");
                 return -1;
             }
-        } else if (strncmp(*argv, "-D", 2) == 0) {
+        } else if (strlen(*argv) > 2 && strncmp(*argv, "-D", 2) == 0) {
             argv++;
-            if (strlen(*argv) > 2 && argv < stop) {
+            if (argv < stop) {
                 defineDict.set(argv[-1] + 2, *argv);
             } else {
                 log_error("incomplete '-Dfoo bar' definition\n");
@@ -320,7 +320,8 @@
 
         {
             SkString str;
-            str.printf("running bench %16s", bench->getName());
+            str.printf("running bench [%d %d] %16s", dim.fX, dim.fY,
+                       bench->getName());
             log_progress(str);
         }
 
