|  | /* | 
|  | * 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 "Benchmark.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 Benchmark { | 
|  | SkString fName; | 
|  | SkPaint::Join fJoin; | 
|  | RRectRec fRec; | 
|  | DrawProc fProc; | 
|  | public: | 
|  | StrokeRRectBench(SkPaint::Join j, DrawProc proc) { | 
|  | 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(const int loops, 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, loops); | 
|  | } | 
|  |  | 
|  | private: | 
|  | typedef Benchmark INHERITED; | 
|  | }; | 
|  |  | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rect); ) | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rect); ) | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rect); ) | 
|  |  | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rrect); ) | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rrect); ) | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rrect); ) | 
|  |  | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_oval); ) | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_oval); ) | 
|  | DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_oval); ) |