You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.0 KiB
107 lines
3.0 KiB
/* |
|
* Copyright 2017 Google Inc. |
|
* |
|
* Use of this source code is governed by a BSD-style license that can be |
|
* found in the LICENSE file. |
|
*/ |
|
#include "Benchmark.h" |
|
#include "SkCanvas.h" |
|
#include "SkPaint.h" |
|
#include "SkDrawShadowRec.h" |
|
#include "SkShadowUtils.h" |
|
|
|
class ShadowBench : public Benchmark { |
|
// Draws a set of shadowed rrects filling the canvas, in various modes: |
|
// * opaque or transparent |
|
// * use analytic fast path or geometric tessellation |
|
public: |
|
ShadowBench(bool transparent, bool forceGeometric) |
|
: fTransparent(transparent) |
|
, fForceGeometric(forceGeometric) { |
|
computeName("shadows"); |
|
} |
|
|
|
bool isVisual() override { return true; } |
|
|
|
protected: |
|
enum { |
|
kWidth = 640, |
|
kHeight = 480, |
|
kRRSize = 50, |
|
kRRRadius = 6, |
|
kRRSpace = 8, |
|
kRRStep = kRRSize + kRRSpace, |
|
kElevation = 16, |
|
kNumRRects = ((kWidth - kRRSpace) / kRRStep)*((kHeight - kRRSpace) / kRRStep) |
|
}; |
|
|
|
void computeName(const char root[]) { |
|
static const char kTransChars[2] = { |
|
'o', 't' |
|
}; |
|
static const char kGeomChars[2] = { |
|
'a', 'g' |
|
}; |
|
|
|
fBaseName.printf("%s_%c_%c", root, kTransChars[fTransparent], kGeomChars[fForceGeometric]); |
|
} |
|
|
|
void genRRects() { |
|
int i = 0; |
|
for (int x = kRRSpace; x < kWidth - kRRStep; x += kRRStep) { |
|
for (int y = kRRSpace; y < kHeight - kRRStep; y += kRRStep) { |
|
SkRect rect = SkRect::MakeXYWH(x, y, kRRSize, kRRSize); |
|
fRRects[i].addRRect(SkRRect::MakeRectXY(rect, kRRRadius, kRRRadius)); |
|
++i; |
|
} |
|
} |
|
SkASSERT(i == kNumRRects); |
|
} |
|
|
|
const char* onGetName() override { return fBaseName.c_str(); } |
|
|
|
void onDelayedSetup() override { |
|
fRec.fZPlaneParams = SkPoint3::Make(0, 0, kElevation); |
|
fRec.fLightPos = SkPoint3::Make(270, 0, 600); |
|
fRec.fLightRadius = 800; |
|
fRec.fAmbientAlpha = 0.1f; |
|
fRec.fSpotAlpha = 0.25f; |
|
fRec.fColor = SK_ColorBLACK; |
|
fRec.fFlags = 0; |
|
if (fTransparent) { |
|
fRec.fFlags |= SkShadowFlags::kTransparentOccluder_ShadowFlag; |
|
} |
|
if (fForceGeometric) { |
|
fRec.fFlags |= SkShadowFlags::kGeometricOnly_ShadowFlag; |
|
} |
|
|
|
this->genRRects(); |
|
} |
|
|
|
void onDraw(int loops, SkCanvas* canvas) override { |
|
SkPaint paint; |
|
paint.setColor(SK_ColorWHITE); |
|
this->setupPaint(&paint); |
|
|
|
for (int i = 0; i < loops; ++i) { |
|
// use the private canvas call so we don't include the time to stuff data in the Rec |
|
canvas->private_draw_shadow_rec(fRRects[i % kNumRRects], fRec); |
|
} |
|
} |
|
|
|
private: |
|
SkString fBaseName; |
|
|
|
SkPath fRRects[kNumRRects]; |
|
SkDrawShadowRec fRec; |
|
int fTransparent; |
|
int fForceGeometric; |
|
|
|
typedef Benchmark INHERITED; |
|
}; |
|
|
|
DEF_BENCH(return new ShadowBench(false, false);) |
|
DEF_BENCH(return new ShadowBench(false, true);) |
|
DEF_BENCH(return new ShadowBench(true, false);) |
|
DEF_BENCH(return new ShadowBench(true, true);) |
|
|
|
|