diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-02-04 14:57:28 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-02-04 14:57:28 +0000 |
commit | c1f9011ceba380967cde2019b352f963f90f9589 (patch) | |
tree | 863f4842e2be791f4a63a668365a3bee5ccb6efd /bench/StrokeBench.cpp | |
parent | f9502d7dfad5b361a3cdaa42eb75b593c95f79d8 (diff) |
add benchmark for stroked drawRect/drawOval/drawRRect, to prepare for optimizing
those based on special-casing stroking for single-contour-convex shapes.
git-svn-id: http://skia.googlecode.com/svn/trunk@7537 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'bench/StrokeBench.cpp')
-rw-r--r-- | bench/StrokeBench.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/bench/StrokeBench.cpp b/bench/StrokeBench.cpp new file mode 100644 index 0000000000..b6bfaf7c49 --- /dev/null +++ b/bench/StrokeBench.cpp @@ -0,0 +1,105 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkBenchmark.h" +#include "SkCanvas.h" +#include "SkPaint.h" +#include "SkRRect.h" +#include "SkString.h" + +struct RRectRec { + SkCanvas* fCanvas; + SkRRect fRRect; + SkPaint fPaint; +}; + +typedef const char* (*DrawProc)(const RRectRec*, int); + +static const char* draw_rect(const RRectRec* rec, int count) { + if (rec) { + const SkRect& r = rec->fRRect.getBounds(); + for (int i = 0; i < count; ++i) { + rec->fCanvas->drawRect(r, rec->fPaint); + } + } + return "rect"; +} + +static const char* draw_rrect(const RRectRec* rec, int count) { + if (rec) { + for (int i = 0; i < count; ++i) { + rec->fCanvas->drawRRect(rec->fRRect, rec->fPaint); + } + } + return "rrect"; +} + +static const char* draw_oval(const RRectRec* rec, int count) { + if (rec) { + const SkRect& r = rec->fRRect.getBounds(); + for (int i = 0; i < count; ++i) { + rec->fCanvas->drawOval(r, rec->fPaint); + } + } + return "oval"; +} + +// Handles rect, rrect, and oval +// +// Test drawing a small stroked version to see the effect of special-casing +// our stroke code for these convex single-contour shapes. +// +class StrokeRRectBench : public SkBenchmark { + SkString fName; + SkPaint::Join fJoin; + RRectRec fRec; + DrawProc fProc; + enum { N = SkBENCHLOOP(500) }; +public: + StrokeRRectBench(void* param, SkPaint::Join j, DrawProc proc) : SkBenchmark(param) { + static const char* gJoinName[] = { + "miter", "round", "bevel" + }; + + fJoin = j; + fProc = proc; + fName.printf("draw_stroke_%s_%s", proc(NULL, 0), gJoinName[j]); + + SkRect r = { 20, 20, 40, 40 }; + SkScalar rad = 4; + fRec.fRRect.setRectXY(r, rad, rad); + } + +protected: + virtual const char* onGetName() { + return fName.c_str(); + } + + virtual void onDraw(SkCanvas* canvas) { + fRec.fCanvas = canvas; + this->setupPaint(&fRec.fPaint); + fRec.fPaint.setStyle(SkPaint::kStroke_Style); + fRec.fPaint.setStrokeJoin(fJoin); + fRec.fPaint.setStrokeWidth(5); + fProc(&fRec, N); + } + +private: + typedef SkBenchmark INHERITED; +}; + +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kRound_Join, draw_rect); ) +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kBevel_Join, draw_rect); ) +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kMiter_Join, draw_rect); ) + +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kRound_Join, draw_rrect); ) +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kBevel_Join, draw_rrect); ) +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kMiter_Join, draw_rrect); ) + +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kRound_Join, draw_oval); ) +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kBevel_Join, draw_oval); ) +DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kMiter_Join, draw_oval); ) |