Home | History | Annotate | Download | only in bench
      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     enum { N = SkBENCHLOOP(500) };
     62 public:
     63     StrokeRRectBench(void* param, SkPaint::Join j, DrawProc proc) : SkBenchmark(param) {
     64         static const char* gJoinName[] = {
     65             "miter", "round", "bevel"
     66         };
     67 
     68         fJoin = j;
     69         fProc = proc;
     70         fName.printf("draw_stroke_%s_%s", proc(NULL, 0), gJoinName[j]);
     71 
     72         SkRect r = { 20, 20, 40, 40 };
     73         SkScalar rad = 4;
     74         fRec.fRRect.setRectXY(r, rad, rad);
     75     }
     76 
     77 protected:
     78     virtual const char* onGetName() {
     79         return fName.c_str();
     80     }
     81 
     82     virtual void onDraw(SkCanvas* canvas) {
     83         fRec.fCanvas = canvas;
     84         this->setupPaint(&fRec.fPaint);
     85         fRec.fPaint.setStyle(SkPaint::kStroke_Style);
     86         fRec.fPaint.setStrokeJoin(fJoin);
     87         fRec.fPaint.setStrokeWidth(5);
     88         fProc(&fRec, N);
     89     }
     90 
     91 private:
     92     typedef SkBenchmark INHERITED;
     93 };
     94 
     95 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kRound_Join, draw_rect); )
     96 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kBevel_Join, draw_rect); )
     97 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kMiter_Join, draw_rect); )
     98 
     99 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kRound_Join, draw_rrect); )
    100 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kBevel_Join, draw_rrect); )
    101 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kMiter_Join, draw_rrect); )
    102 
    103 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kRound_Join, draw_oval); )
    104 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kBevel_Join, draw_oval); )
    105 DEF_BENCH( return new StrokeRRectBench(p, SkPaint::kMiter_Join, draw_oval); )
    106