xref: /aosp_15_r20/external/skia/bench/RegionBench.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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