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 #include "Benchmark.h" 8 #include "SkCanvas.h" 9 #include "SkPerlinNoiseShader.h" 10 11 class PerlinNoiseBench : public Benchmark { 12 SkISize fSize; 13 14 public: PerlinNoiseBench()15 PerlinNoiseBench() { 16 fSize = SkISize::Make(80, 80); 17 } 18 19 protected: onGetName()20 virtual const char* onGetName() SK_OVERRIDE { 21 return "perlinnoise"; 22 } 23 onDraw(const int loops,SkCanvas * canvas)24 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 25 this->test(loops, canvas, 0, 0, SkPerlinNoiseShader::kFractalNoise_Type, 26 0.1f, 0.1f, 3, 0, false); 27 } 28 29 private: drawClippedRect(SkCanvas * canvas,int x,int y,const SkPaint & paint)30 void drawClippedRect(SkCanvas* canvas, int x, int y, const SkPaint& paint) { 31 canvas->save(); 32 canvas->clipRect(SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y), 33 SkIntToScalar(fSize.width()), SkIntToScalar(fSize.height()))); 34 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y), 35 SkIntToScalar(fSize.width()), 36 SkIntToScalar(fSize.height())); 37 canvas->drawRect(r, paint); 38 canvas->restore(); 39 } 40 test(const int loops,SkCanvas * canvas,int x,int y,SkPerlinNoiseShader::Type type,float baseFrequencyX,float baseFrequencyY,int numOctaves,float seed,bool stitchTiles)41 void test(const int loops, SkCanvas* canvas, int x, int y, SkPerlinNoiseShader::Type type, 42 float baseFrequencyX, float baseFrequencyY, int numOctaves, float seed, 43 bool stitchTiles) { 44 SkShader* shader = (type == SkPerlinNoiseShader::kFractalNoise_Type) ? 45 SkPerlinNoiseShader::CreateFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves, 46 seed, stitchTiles ? &fSize : NULL) : 47 SkPerlinNoiseShader::CreateTurbulence(baseFrequencyX, baseFrequencyY, numOctaves, 48 seed, stitchTiles ? &fSize : NULL); 49 SkPaint paint; 50 paint.setShader(shader)->unref(); 51 52 for (int i = 0; i < loops; i++) { 53 this->drawClippedRect(canvas, x, y, paint); 54 } 55 } 56 57 typedef Benchmark INHERITED; 58 }; 59 60 /////////////////////////////////////////////////////////////////////////////// 61 62 DEF_BENCH( return new PerlinNoiseBench(); ) 63