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 "SkRandom.h" 10 #include "SkRegion.h" 11 #include "SkString.h" 12 13 static bool sect_proc(SkRegion& a, SkRegion& b) { 14 SkRegion result; 15 return result.op(a, b, SkRegion::kIntersect_Op); 16 } 17 18 class RegionContainBench : public Benchmark { 19 public: 20 typedef bool (*Proc)(SkRegion& a, SkRegion& b); 21 SkRegion fA, fB; 22 Proc fProc; 23 SkString fName; 24 25 enum { 26 W = 200, 27 H = 200, 28 COUNT = 10, 29 }; 30 31 SkIRect randrect(SkRandom& rand, int i) { 32 int w = rand.nextU() % W; 33 return SkIRect::MakeXYWH(0, i*H/COUNT, w, H/COUNT); 34 } 35 36 RegionContainBench(Proc proc, const char name[]) { 37 fProc = proc; 38 fName.printf("region_contains_%s", name); 39 40 SkRandom rand; 41 for (int i = 0; i < COUNT; i++) { 42 fA.op(randrect(rand, i), SkRegion::kXOR_Op); 43 } 44 45 fB.setRect(0, 0, H, W); 46 } 47 48 bool isSuitableFor(Backend backend) override { 49 return backend == kNonRendering_Backend; 50 } 51 52 protected: 53 const char* onGetName() override { return fName.c_str(); } 54 55 void onDraw(int loops, SkCanvas*) override { 56 Proc proc = fProc; 57 58 for (int i = 0; i < loops; ++i) { 59 proc(fA, fB); 60 } 61 } 62 63 private: 64 typedef Benchmark INHERITED; 65 }; 66 67 DEF_BENCH(return new RegionContainBench(sect_proc, "sect");) 68