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.
89 lines
3.1 KiB
89 lines
3.1 KiB
/* |
|
* Copyright 2013 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 "SkBlurMask.h" |
|
#include "SkBlurMaskFilter.h" |
|
#include "SkCanvas.h" |
|
#include "SkColorFilter.h" |
|
#include "SkLayerDrawLooper.h" |
|
#include "SkPaint.h" |
|
#include "SkPath.h" |
|
#include "SkPoint.h" |
|
#include "SkRRect.h" |
|
#include "SkRect.h" |
|
#include "SkString.h" |
|
|
|
// Large blurred RR appear frequently on web pages. This benchmark measures our |
|
// performance in this case. |
|
class BlurRoundRectBench : public Benchmark { |
|
public: |
|
BlurRoundRectBench(int width, int height, int cornerRadius) |
|
: fName("blurroundrect") { |
|
fName.appendf("_WH_%ix%i_cr_%i", width, height, cornerRadius); |
|
SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); |
|
fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius)); |
|
} |
|
|
|
const char* onGetName() override { |
|
return fName.c_str(); |
|
} |
|
|
|
SkIPoint onGetSize() override { |
|
return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()), |
|
SkScalarCeilToInt(fRRect.rect().height())); |
|
} |
|
|
|
void onDraw(int loops, SkCanvas* canvas) override { |
|
SkLayerDrawLooper::Builder looperBuilder; |
|
{ |
|
SkLayerDrawLooper::LayerInfo info; |
|
info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit |
|
| SkLayerDrawLooper::kColorFilter_Bit; |
|
info.fColorMode = SkBlendMode::kSrc; |
|
info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); |
|
info.fPostTranslate = false; |
|
SkPaint* paint = looperBuilder.addLayerOnTop(info); |
|
paint->setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, |
|
SkBlurMask::ConvertRadiusToSigma(0.5), |
|
SkBlurMaskFilter::kHighQuality_BlurFlag)); |
|
paint->setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorLTGRAY, |
|
SkBlendMode::kSrcIn)); |
|
paint->setColor(SK_ColorGRAY); |
|
} |
|
{ |
|
SkLayerDrawLooper::LayerInfo info; |
|
looperBuilder.addLayerOnTop(info); |
|
} |
|
SkPaint dullPaint; |
|
dullPaint.setAntiAlias(true); |
|
|
|
SkPaint loopedPaint; |
|
loopedPaint.setLooper(looperBuilder.detach()); |
|
loopedPaint.setAntiAlias(true); |
|
loopedPaint.setColor(SK_ColorCYAN); |
|
|
|
for (int i = 0; i < loops; i++) { |
|
canvas->drawRect(fRRect.rect(), dullPaint); |
|
canvas->drawRRect(fRRect, loopedPaint); |
|
} |
|
} |
|
|
|
private: |
|
SkString fName; |
|
SkRRect fRRect; |
|
|
|
typedef Benchmark INHERITED; |
|
}; |
|
|
|
// Create one with dimensions/rounded corners based on the skp |
|
DEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);) |
|
// Same radii, much smaller rectangle |
|
DEF_BENCH(return new BlurRoundRectBench(100, 100, 6);) |
|
// Other radii options |
|
DEF_BENCH(return new BlurRoundRectBench(100, 100, 30);) |
|
DEF_BENCH(return new BlurRoundRectBench(100, 100, 90);)
|
|
|