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 
14 struct RRectRec {
15     SkCanvas*   fCanvas;
16     SkRRect     fRRect;
17     SkPaint     fPaint;
18 };
19 
20 typedef const char* (*DrawProc)(const RRectRec*, int);
21 
draw_rect(const RRectRec * rec,int count)22 static 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 
draw_rrect(const RRectRec * rec,int count)32 static 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 
draw_oval(const RRectRec * rec,int count)41 static 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 //
56 class StrokeRRectBench : public Benchmark {
57     SkString fName;
58     SkPaint::Join fJoin;
59     RRectRec fRec;
60     DrawProc fProc;
61 public:
StrokeRRectBench(SkPaint::Join j,DrawProc proc)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 
76 protected:
onGetName()77     virtual const char* onGetName() {
78         return fName.c_str();
79     }
80 
onDraw(const int loops,SkCanvas * canvas)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 
90 private:
91     typedef Benchmark INHERITED;
92 };
93 
94 DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rect); )
95 DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rect); )
96 DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rect); )
97 
98 DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rrect); )
99 DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rrect); )
100 DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rrect); )
101 
102 DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_oval); )
103 DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_oval); )
104 DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_oval); )
105