1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2013 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 9cb93a386Sopenharmony_ci#include "include/core/SkRegion.h" 10cb93a386Sopenharmony_ci#include "include/core/SkString.h" 11cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cistatic bool sect_proc(SkRegion& a, SkRegion& b) { 14cb93a386Sopenharmony_ci SkRegion result; 15cb93a386Sopenharmony_ci return result.op(a, b, SkRegion::kIntersect_Op); 16cb93a386Sopenharmony_ci} 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ciclass RegionContainBench : public Benchmark { 19cb93a386Sopenharmony_cipublic: 20cb93a386Sopenharmony_ci typedef bool (*Proc)(SkRegion& a, SkRegion& b); 21cb93a386Sopenharmony_ci SkRegion fA, fB; 22cb93a386Sopenharmony_ci Proc fProc; 23cb93a386Sopenharmony_ci SkString fName; 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci enum { 26cb93a386Sopenharmony_ci W = 200, 27cb93a386Sopenharmony_ci H = 200, 28cb93a386Sopenharmony_ci COUNT = 10, 29cb93a386Sopenharmony_ci }; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci SkIRect randrect(SkRandom& rand, int i) { 32cb93a386Sopenharmony_ci int w = rand.nextU() % W; 33cb93a386Sopenharmony_ci return SkIRect::MakeXYWH(0, i*H/COUNT, w, H/COUNT); 34cb93a386Sopenharmony_ci } 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci RegionContainBench(Proc proc, const char name[]) { 37cb93a386Sopenharmony_ci fProc = proc; 38cb93a386Sopenharmony_ci fName.printf("region_contains_%s", name); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci SkRandom rand; 41cb93a386Sopenharmony_ci for (int i = 0; i < COUNT; i++) { 42cb93a386Sopenharmony_ci fA.op(randrect(rand, i), SkRegion::kXOR_Op); 43cb93a386Sopenharmony_ci } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci fB.setRect({0, 0, H, W}); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 49cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ciprotected: 53cb93a386Sopenharmony_ci const char* onGetName() override { return fName.c_str(); } 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 56cb93a386Sopenharmony_ci Proc proc = fProc; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci for (int i = 0; i < loops; ++i) { 59cb93a386Sopenharmony_ci proc(fA, fB); 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ciprivate: 64cb93a386Sopenharmony_ci using INHERITED = Benchmark; 65cb93a386Sopenharmony_ci}; 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ciDEF_BENCH(return new RegionContainBench(sect_proc, "sect");) 68