172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth/*
272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth * Copyright 2017 Google Inc.
372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth *
472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth * Use of this source code is governed by a BSD-style license that can be
572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth * found in the LICENSE file.
672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth */
772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth#include "Benchmark.h"
872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth#include "SkCanvas.h"
972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth#include "SkPaint.h"
1072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth#include "SkDrawShadowRec.h"
1172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth#include "SkShadowUtils.h"
1272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
1372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verthclass ShadowBench : public Benchmark {
1472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth// Draws a set of shadowed rrects filling the canvas, in various modes:
1572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth// * opaque or transparent
1672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth// * use analytic fast path or geometric tessellation
1772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verthpublic:
1872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    ShadowBench(bool transparent, bool forceGeometric)
1972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        : fTransparent(transparent)
2072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        , fForceGeometric(forceGeometric) {
2172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        computeName("shadows");
2272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    }
2372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
2472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    bool isVisual() override { return true; }
2572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
2672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verthprotected:
2772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    enum {
2872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kWidth = 640,
2972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kHeight = 480,
3072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kRRSize = 50,
3172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kRRRadius = 6,
3272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kRRSpace = 8,
3372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kRRStep = kRRSize + kRRSpace,
3472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kElevation = 16,
3572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        kNumRRects = ((kWidth - kRRSpace) / kRRStep)*((kHeight - kRRSpace) / kRRStep)
3672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    };
3772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
3872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    void computeName(const char root[]) {
3972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        static const char kTransChars[2] = {
4072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            'o', 't'
4172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        };
4272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        static const char kGeomChars[2] = {
4372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            'a', 'g'
4472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        };
4572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
4672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fBaseName.printf("%s_%c_%c", root, kTransChars[fTransparent], kGeomChars[fForceGeometric]);
4772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    }
4872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
4972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    void genRRects() {
5072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        int i = 0;
5172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        for (int x = kRRSpace; x < kWidth - kRRStep; x += kRRStep) {
5272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            for (int y = kRRSpace; y < kHeight - kRRStep; y += kRRStep) {
5372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth                SkRect rect = SkRect::MakeXYWH(x, y, kRRSize, kRRSize);
5472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth                fRRects[i].addRRect(SkRRect::MakeRectXY(rect, kRRRadius, kRRRadius));
5572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth                ++i;
5672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            }
5772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        }
5872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        SkASSERT(i == kNumRRects);
5972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    }
6072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
6172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    const char* onGetName() override { return fBaseName.c_str(); }
6272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
6372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    void onDelayedSetup() override {
6472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fRec.fZPlaneParams = SkPoint3::Make(0, 0, kElevation);
6572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fRec.fLightPos = SkPoint3::Make(270, 0, 600);
6672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fRec.fLightRadius = 800;
6772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fRec.fAmbientAlpha = 0.1f;
6872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fRec.fSpotAlpha = 0.25f;
6972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fRec.fColor = SK_ColorBLACK;
7072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        fRec.fFlags = 0;
7172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        if (fTransparent) {
7272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            fRec.fFlags |= SkShadowFlags::kTransparentOccluder_ShadowFlag;
7372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        }
7472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        if (fForceGeometric) {
7572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            fRec.fFlags |= SkShadowFlags::kGeometricOnly_ShadowFlag;
7672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        }
7772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
7872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        this->genRRects();
7972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    }
8072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
8172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    void onDraw(int loops, SkCanvas* canvas) override {
8272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        SkPaint paint;
8372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        paint.setColor(SK_ColorWHITE);
8472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        this->setupPaint(&paint);
8572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
8672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        for (int i = 0; i < loops; ++i) {
8772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            // use the private canvas call so we don't include the time to stuff data in the Rec
8872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth            canvas->private_draw_shadow_rec(fRRects[i % kNumRRects], fRec);
8972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth        }
9072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    }
9172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
9272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verthprivate:
9372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    SkString fBaseName;
9472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
9572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    SkPath  fRRects[kNumRRects];
9672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    SkDrawShadowRec fRec;
9772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    int    fTransparent;
9872f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    int    fForceGeometric;
9972f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
10072f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth    typedef Benchmark INHERITED;
10172f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth};
10272f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
10372f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van VerthDEF_BENCH(return new ShadowBench(false, false);)
10472f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van VerthDEF_BENCH(return new ShadowBench(false, true);)
10572f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van VerthDEF_BENCH(return new ShadowBench(true, false);)
10672f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van VerthDEF_BENCH(return new ShadowBench(true, true);)
10772f4891bf8e11fed52cb4e524a537f8c8625f093Jim Van Verth
108