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