Home | History | Annotate | Download | only in bench
      1 /*
      2  * Copyright 2017 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 #include "Benchmark.h"
      8 #include "SkCanvas.h"
      9 #include "SkDrawShadowInfo.h"
     10 #include "SkPaint.h"
     11 #include "SkPath.h"
     12 #include "SkShadowUtils.h"
     13 
     14 class ShadowBench : public Benchmark {
     15 // Draws a set of shadowed rrects filling the canvas, in various modes:
     16 // * opaque or transparent
     17 // * use analytic fast path or geometric tessellation
     18 public:
     19     ShadowBench(bool transparent, bool forceGeometric)
     20         : fTransparent(transparent)
     21         , fForceGeometric(forceGeometric) {
     22         computeName("shadows");
     23     }
     24 
     25 protected:
     26     enum {
     27         kWidth = 640,
     28         kHeight = 480,
     29         kRRSize = 50,
     30         kRRRadius = 6,
     31         kRRSpace = 8,
     32         kRRStep = kRRSize + kRRSpace,
     33         kElevation = 16,
     34         kNumRRects = ((kWidth - kRRSpace) / kRRStep)*((kHeight - kRRSpace) / kRRStep)
     35     };
     36 
     37     void computeName(const char root[]) {
     38         static const char kTransChars[2] = {
     39             'o', 't'
     40         };
     41         static const char kGeomChars[2] = {
     42             'a', 'g'
     43         };
     44 
     45         fBaseName.printf("%s_%c_%c", root, kTransChars[fTransparent], kGeomChars[fForceGeometric]);
     46     }
     47 
     48     void genRRects() {
     49         int i = 0;
     50         for (int x = kRRSpace; x < kWidth - kRRStep; x += kRRStep) {
     51             for (int y = kRRSpace; y < kHeight - kRRStep; y += kRRStep) {
     52                 SkRect rect = SkRect::MakeXYWH(x, y, kRRSize, kRRSize);
     53                 fRRects[i].addRRect(SkRRect::MakeRectXY(rect, kRRRadius, kRRRadius));
     54                 ++i;
     55             }
     56         }
     57         SkASSERT(i == kNumRRects);
     58     }
     59 
     60     const char* onGetName() override { return fBaseName.c_str(); }
     61 
     62     void onDelayedSetup() override {
     63         fRec.fZPlaneParams = SkPoint3::Make(0, 0, kElevation);
     64         fRec.fLightPos = SkPoint3::Make(270, 0, 600);
     65         fRec.fLightRadius = 800;
     66         fRec.fAmbientColor = 0x19000000;
     67         fRec.fSpotColor = 0x40000000;
     68         fRec.fFlags = 0;
     69         if (fTransparent) {
     70             fRec.fFlags |= SkShadowFlags::kTransparentOccluder_ShadowFlag;
     71         }
     72         if (fForceGeometric) {
     73             fRec.fFlags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
     74         }
     75 
     76         this->genRRects();
     77     }
     78 
     79     void onDraw(int loops, SkCanvas* canvas) override {
     80         SkPaint paint;
     81         paint.setColor(SK_ColorWHITE);
     82         this->setupPaint(&paint);
     83 
     84         for (int i = 0; i < loops; ++i) {
     85             // use the private canvas call so we don't include the time to stuff data in the Rec
     86             canvas->private_draw_shadow_rec(fRRects[i % kNumRRects], fRec);
     87         }
     88     }
     89 
     90 private:
     91     SkString fBaseName;
     92 
     93     SkPath  fRRects[kNumRRects];
     94     SkDrawShadowRec fRec;
     95     int    fTransparent;
     96     int    fForceGeometric;
     97 
     98     typedef Benchmark INHERITED;
     99 };
    100 
    101 DEF_BENCH(return new ShadowBench(false, false);)
    102 DEF_BENCH(return new ShadowBench(false, true);)
    103 DEF_BENCH(return new ShadowBench(true, false);)
    104 DEF_BENCH(return new ShadowBench(true, true);)
    105 
    106