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