1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "Benchmark.h"
9#include "SkCanvas.h"
10#include "SkPaint.h"
11#include "SkRRect.h"
12#include "SkString.h"
13
14struct RRectRec {
15    SkCanvas*   fCanvas;
16    SkRRect     fRRect;
17    SkPaint     fPaint;
18};
19
20typedef const char* (*DrawProc)(const RRectRec*, int);
21
22static const char* draw_rect(const RRectRec* rec, int count) {
23    if (rec) {
24        const SkRect& r = rec->fRRect.getBounds();
25        for (int i = 0; i < count; ++i) {
26            rec->fCanvas->drawRect(r, rec->fPaint);
27        }
28    }
29    return "rect";
30}
31
32static const char* draw_rrect(const RRectRec* rec, int count) {
33    if (rec) {
34        for (int i = 0; i < count; ++i) {
35            rec->fCanvas->drawRRect(rec->fRRect, rec->fPaint);
36        }
37    }
38    return "rrect";
39}
40
41static const char* draw_oval(const RRectRec* rec, int count) {
42    if (rec) {
43        const SkRect& r = rec->fRRect.getBounds();
44        for (int i = 0; i < count; ++i) {
45            rec->fCanvas->drawOval(r, rec->fPaint);
46        }
47    }
48    return "oval";
49}
50
51// Handles rect, rrect, and oval
52//
53// Test drawing a small stroked version to see the effect of special-casing
54// our stroke code for these convex single-contour shapes.
55//
56class StrokeRRectBench : public Benchmark {
57    SkString fName;
58    SkPaint::Join fJoin;
59    RRectRec fRec;
60    DrawProc fProc;
61public:
62    StrokeRRectBench(SkPaint::Join j, DrawProc proc) {
63        static const char* gJoinName[] = {
64            "miter", "round", "bevel"
65        };
66
67        fJoin = j;
68        fProc = proc;
69        fName.printf("draw_stroke_%s_%s", proc(NULL, 0), gJoinName[j]);
70
71        SkRect r = { 20, 20, 40, 40 };
72        SkScalar rad = 4;
73        fRec.fRRect.setRectXY(r, rad, rad);
74    }
75
76protected:
77    virtual const char* onGetName() {
78        return fName.c_str();
79    }
80
81    virtual void onDraw(const int loops, SkCanvas* canvas) {
82        fRec.fCanvas = canvas;
83        this->setupPaint(&fRec.fPaint);
84        fRec.fPaint.setStyle(SkPaint::kStroke_Style);
85        fRec.fPaint.setStrokeJoin(fJoin);
86        fRec.fPaint.setStrokeWidth(5);
87        fProc(&fRec, loops);
88    }
89
90private:
91    typedef Benchmark INHERITED;
92};
93
94DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rect); )
95DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rect); )
96DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rect); )
97
98DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rrect); )
99DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rrect); )
100DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rrect); )
101
102DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_oval); )
103DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_oval); )
104DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_oval); )
105