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