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 "SkBenchmark.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 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 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 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 SkBenchmark { 57 SkString fName; 58 SkPaint::Join fJoin; 59 RRectRec fRec; 60 DrawProc fProc; 61 public: 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: 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 90 private: 91 typedef SkBenchmark 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