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