1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h"
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRegion.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h"
11*c8dee2aaSAndroid Build Coastguard Worker
union_proc(SkRegion & a,SkRegion & b)12*c8dee2aaSAndroid Build Coastguard Worker static bool union_proc(SkRegion& a, SkRegion& b) {
13*c8dee2aaSAndroid Build Coastguard Worker SkRegion result;
14*c8dee2aaSAndroid Build Coastguard Worker return result.op(a, b, SkRegion::kUnion_Op);
15*c8dee2aaSAndroid Build Coastguard Worker }
16*c8dee2aaSAndroid Build Coastguard Worker
sect_proc(SkRegion & a,SkRegion & b)17*c8dee2aaSAndroid Build Coastguard Worker static bool sect_proc(SkRegion& a, SkRegion& b) {
18*c8dee2aaSAndroid Build Coastguard Worker SkRegion result;
19*c8dee2aaSAndroid Build Coastguard Worker return result.op(a, b, SkRegion::kIntersect_Op);
20*c8dee2aaSAndroid Build Coastguard Worker }
21*c8dee2aaSAndroid Build Coastguard Worker
diff_proc(SkRegion & a,SkRegion & b)22*c8dee2aaSAndroid Build Coastguard Worker static bool diff_proc(SkRegion& a, SkRegion& b) {
23*c8dee2aaSAndroid Build Coastguard Worker SkRegion result;
24*c8dee2aaSAndroid Build Coastguard Worker return result.op(a, b, SkRegion::kDifference_Op);
25*c8dee2aaSAndroid Build Coastguard Worker }
26*c8dee2aaSAndroid Build Coastguard Worker
diffrect_proc(SkRegion & a,SkRegion & b)27*c8dee2aaSAndroid Build Coastguard Worker static bool diffrect_proc(SkRegion& a, SkRegion& b) {
28*c8dee2aaSAndroid Build Coastguard Worker SkRegion result;
29*c8dee2aaSAndroid Build Coastguard Worker return result.op(a, b.getBounds(), SkRegion::kDifference_Op);
30*c8dee2aaSAndroid Build Coastguard Worker }
31*c8dee2aaSAndroid Build Coastguard Worker
diffrectbig_proc(SkRegion & a,SkRegion & b)32*c8dee2aaSAndroid Build Coastguard Worker static bool diffrectbig_proc(SkRegion& a, SkRegion& b) {
33*c8dee2aaSAndroid Build Coastguard Worker SkRegion result;
34*c8dee2aaSAndroid Build Coastguard Worker return result.op(a, a.getBounds(), SkRegion::kDifference_Op);
35*c8dee2aaSAndroid Build Coastguard Worker }
36*c8dee2aaSAndroid Build Coastguard Worker
containsrect_proc(SkRegion & a,SkRegion & b)37*c8dee2aaSAndroid Build Coastguard Worker static bool containsrect_proc(SkRegion& a, SkRegion& b) {
38*c8dee2aaSAndroid Build Coastguard Worker SkIRect r = a.getBounds();
39*c8dee2aaSAndroid Build Coastguard Worker r.inset(r.width()/4, r.height()/4);
40*c8dee2aaSAndroid Build Coastguard Worker (void)a.contains(r);
41*c8dee2aaSAndroid Build Coastguard Worker
42*c8dee2aaSAndroid Build Coastguard Worker r = b.getBounds();
43*c8dee2aaSAndroid Build Coastguard Worker r.inset(r.width()/4, r.height()/4);
44*c8dee2aaSAndroid Build Coastguard Worker return b.contains(r);
45*c8dee2aaSAndroid Build Coastguard Worker }
46*c8dee2aaSAndroid Build Coastguard Worker
sectsrgn_proc(SkRegion & a,SkRegion & b)47*c8dee2aaSAndroid Build Coastguard Worker static bool sectsrgn_proc(SkRegion& a, SkRegion& b) {
48*c8dee2aaSAndroid Build Coastguard Worker return a.intersects(b);
49*c8dee2aaSAndroid Build Coastguard Worker }
50*c8dee2aaSAndroid Build Coastguard Worker
sectsrect_proc(SkRegion & a,SkRegion & b)51*c8dee2aaSAndroid Build Coastguard Worker static bool sectsrect_proc(SkRegion& a, SkRegion& b) {
52*c8dee2aaSAndroid Build Coastguard Worker SkIRect r = a.getBounds();
53*c8dee2aaSAndroid Build Coastguard Worker r.inset(r.width()/4, r.height()/4);
54*c8dee2aaSAndroid Build Coastguard Worker return a.intersects(r);
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker
containsxy_proc(SkRegion & a,SkRegion & b)57*c8dee2aaSAndroid Build Coastguard Worker static bool containsxy_proc(SkRegion& a, SkRegion& b) {
58*c8dee2aaSAndroid Build Coastguard Worker const SkIRect& r = a.getBounds();
59*c8dee2aaSAndroid Build Coastguard Worker const int dx = r.width() / 8;
60*c8dee2aaSAndroid Build Coastguard Worker const int dy = r.height() / 8;
61*c8dee2aaSAndroid Build Coastguard Worker for (int y = r.fTop; y < r.fBottom; y += dy) {
62*c8dee2aaSAndroid Build Coastguard Worker for (int x = r.fLeft; x < r.fRight; x += dx) {
63*c8dee2aaSAndroid Build Coastguard Worker (void)a.contains(x, y);
64*c8dee2aaSAndroid Build Coastguard Worker }
65*c8dee2aaSAndroid Build Coastguard Worker }
66*c8dee2aaSAndroid Build Coastguard Worker return true;
67*c8dee2aaSAndroid Build Coastguard Worker }
68*c8dee2aaSAndroid Build Coastguard Worker
69*c8dee2aaSAndroid Build Coastguard Worker class RegionBench : public Benchmark {
70*c8dee2aaSAndroid Build Coastguard Worker public:
71*c8dee2aaSAndroid Build Coastguard Worker typedef bool (*Proc)(SkRegion& a, SkRegion& b);
72*c8dee2aaSAndroid Build Coastguard Worker
73*c8dee2aaSAndroid Build Coastguard Worker SkRegion fA, fB;
74*c8dee2aaSAndroid Build Coastguard Worker Proc fProc;
75*c8dee2aaSAndroid Build Coastguard Worker SkString fName;
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker enum {
78*c8dee2aaSAndroid Build Coastguard Worker W = 1024,
79*c8dee2aaSAndroid Build Coastguard Worker H = 768,
80*c8dee2aaSAndroid Build Coastguard Worker };
81*c8dee2aaSAndroid Build Coastguard Worker
randrect(SkRandom & rand)82*c8dee2aaSAndroid Build Coastguard Worker SkIRect randrect(SkRandom& rand) {
83*c8dee2aaSAndroid Build Coastguard Worker int x = rand.nextU() % W;
84*c8dee2aaSAndroid Build Coastguard Worker int y = rand.nextU() % H;
85*c8dee2aaSAndroid Build Coastguard Worker int w = rand.nextU() % W;
86*c8dee2aaSAndroid Build Coastguard Worker int h = rand.nextU() % H;
87*c8dee2aaSAndroid Build Coastguard Worker return SkIRect::MakeXYWH(x, y, w >> 1, h >> 1);
88*c8dee2aaSAndroid Build Coastguard Worker }
89*c8dee2aaSAndroid Build Coastguard Worker
RegionBench(int count,Proc proc,const char name[])90*c8dee2aaSAndroid Build Coastguard Worker RegionBench(int count, Proc proc, const char name[]) {
91*c8dee2aaSAndroid Build Coastguard Worker fProc = proc;
92*c8dee2aaSAndroid Build Coastguard Worker fName.printf("region_%s_%d", name, count);
93*c8dee2aaSAndroid Build Coastguard Worker
94*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand;
95*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < count; i++) {
96*c8dee2aaSAndroid Build Coastguard Worker fA.op(randrect(rand), SkRegion::kXOR_Op);
97*c8dee2aaSAndroid Build Coastguard Worker fB.op(randrect(rand), SkRegion::kXOR_Op);
98*c8dee2aaSAndroid Build Coastguard Worker }
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker
isSuitableFor(Backend backend)101*c8dee2aaSAndroid Build Coastguard Worker bool isSuitableFor(Backend backend) override {
102*c8dee2aaSAndroid Build Coastguard Worker return backend == Backend::kNonRendering;
103*c8dee2aaSAndroid Build Coastguard Worker }
104*c8dee2aaSAndroid Build Coastguard Worker
105*c8dee2aaSAndroid Build Coastguard Worker protected:
onGetName()106*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { return fName.c_str(); }
107*c8dee2aaSAndroid Build Coastguard Worker
onDraw(int loops,SkCanvas * canvas)108*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override {
109*c8dee2aaSAndroid Build Coastguard Worker Proc proc = fProc;
110*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) {
111*c8dee2aaSAndroid Build Coastguard Worker proc(fA, fB);
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker }
114*c8dee2aaSAndroid Build Coastguard Worker
115*c8dee2aaSAndroid Build Coastguard Worker private:
116*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark;
117*c8dee2aaSAndroid Build Coastguard Worker };
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
120*c8dee2aaSAndroid Build Coastguard Worker
121*c8dee2aaSAndroid Build Coastguard Worker #define SMALL 16
122*c8dee2aaSAndroid Build Coastguard Worker
123*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, union_proc, "union");)
124*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, sect_proc, "intersect");)
125*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, diff_proc, "difference");)
126*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, diffrect_proc, "differencerect");)
127*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, diffrectbig_proc, "differencerectbig");)
128*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, containsrect_proc, "containsrect");)
129*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, sectsrgn_proc, "intersectsrgn");)
130*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, sectsrect_proc, "intersectsrect");)
131*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH(return new RegionBench(SMALL, containsxy_proc, "containsxy");)
132