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 "SkBenchmark.h" 8#include "SkCanvas.h" 9#include "SkPerlinNoiseShader.h" 10 11class PerlinNoiseBench : public SkBenchmark { 12 SkISize fSize; 13 14public: 15 PerlinNoiseBench() { 16 fSize = SkISize::Make(80, 80); 17 } 18 19protected: 20 virtual const char* onGetName() SK_OVERRIDE { 21 return "perlinnoise"; 22 } 23 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 29private: 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 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::CreateTubulence(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 SkBenchmark INHERITED; 58}; 59 60/////////////////////////////////////////////////////////////////////////////// 61 62DEF_BENCH( return new PerlinNoiseBench(); ) 63