1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "Benchmark.h" 9 #include "SkBlurMask.h" 10 #include "SkBlurMaskFilter.h" 11 #include "SkCanvas.h" 12 #include "SkColorFilter.h" 13 #include "SkLayerDrawLooper.h" 14 #include "SkPaint.h" 15 #include "SkPath.h" 16 #include "SkPoint.h" 17 #include "SkRRect.h" 18 #include "SkRect.h" 19 #include "SkString.h" 20 #include "SkXfermode.h" 21 22 // Large blurred RR appear frequently on web pages. This benchmark measures our 23 // performance in this case. 24 class BlurRoundRectBench : public Benchmark { 25 public: 26 BlurRoundRectBench(int width, int height, int cornerRadius) 27 : fName("blurroundrect") { 28 fName.appendf("_WH[%ix%i]_cr[%i]", width, height, cornerRadius); 29 SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height)); 30 fRRect.setRectXY(r, SkIntToScalar(cornerRadius), SkIntToScalar(cornerRadius)); 31 } 32 33 virtual const char* onGetName() SK_OVERRIDE { 34 return fName.c_str(); 35 } 36 37 virtual SkIPoint onGetSize() SK_OVERRIDE { 38 return SkIPoint::Make(SkScalarCeilToInt(fRRect.rect().width()), 39 SkScalarCeilToInt(fRRect.rect().height())); 40 } 41 42 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 43 SkLayerDrawLooper::Builder looperBuilder; 44 { 45 SkLayerDrawLooper::LayerInfo info; 46 info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit 47 | SkLayerDrawLooper::kColorFilter_Bit; 48 info.fColorMode = SkXfermode::kSrc_Mode; 49 info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0)); 50 info.fPostTranslate = false; 51 SkPaint* paint = looperBuilder.addLayerOnTop(info); 52 SkMaskFilter* maskFilter = SkBlurMaskFilter::Create( 53 kNormal_SkBlurStyle, 54 SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf), 55 SkBlurMaskFilter::kHighQuality_BlurFlag); 56 paint->setMaskFilter(maskFilter)->unref(); 57 SkColorFilter* colorFilter = SkColorFilter::CreateModeFilter(SK_ColorLTGRAY, 58 SkXfermode::kSrcIn_Mode); 59 paint->setColorFilter(colorFilter)->unref(); 60 paint->setColor(SK_ColorGRAY); 61 } 62 { 63 SkLayerDrawLooper::LayerInfo info; 64 looperBuilder.addLayerOnTop(info); 65 } 66 SkPaint dullPaint; 67 dullPaint.setAntiAlias(true); 68 69 SkPaint loopedPaint; 70 loopedPaint.setLooper(looperBuilder.detachLooper())->unref(); 71 loopedPaint.setAntiAlias(true); 72 loopedPaint.setColor(SK_ColorCYAN); 73 74 for (int i = 0; i < loops; i++) { 75 canvas->drawRect(fRRect.rect(), dullPaint); 76 canvas->drawRRect(fRRect, loopedPaint); 77 } 78 } 79 80 private: 81 SkString fName; 82 SkRRect fRRect; 83 84 typedef Benchmark INHERITED; 85 }; 86 87 // Create one with dimensions/rounded corners based on the skp 88 DEF_BENCH(return new BlurRoundRectBench(600, 5514, 6);) 89 // Same radii, much smaller rectangle 90 DEF_BENCH(return new BlurRoundRectBench(100, 100, 6);) 91 // Other radii options 92 DEF_BENCH(return new BlurRoundRectBench(100, 100, 30);) 93 DEF_BENCH(return new BlurRoundRectBench(100, 100, 90);) 94