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