RegionBench.cpp revision 26dc5b6362cf5defa4158b61e2338e12f9e752ca
18c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
28c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com/*
38c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com * Copyright 2011 Google Inc.
48c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com *
58c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com * Use of this source code is governed by a BSD-style license that can be
68c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com * found in the LICENSE file.
78c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com */
88c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkBenchmark.h"
98c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkRandom.h"
108c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkRegion.h"
118c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com#include "SkString.h"
128c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
138c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic bool union_proc(SkRegion& a, SkRegion& b) {
148c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    SkRegion result;
158c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    return result.op(a, b, SkRegion::kUnion_Op);
168c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com}
178c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
188c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic bool sect_proc(SkRegion& a, SkRegion& b) {
198c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    SkRegion result;
208c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    return result.op(a, b, SkRegion::kIntersect_Op);
218c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com}
228c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
238c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic bool diff_proc(SkRegion& a, SkRegion& b) {
248c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    SkRegion result;
258c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    return result.op(a, b, SkRegion::kDifference_Op);
268c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com}
278c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
2801049d5e21a266f307a25a6f884ffacdbbf256edreed@google.comstatic bool containsrect_proc(SkRegion& a, SkRegion& b) {
2950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    SkIRect r = a.getBounds();
308c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    r.inset(r.width()/4, r.height()/4);
3150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    (void)a.contains(r);
3250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com
3350129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    r = b.getBounds();
3450129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    r.inset(r.width()/4, r.height()/4);
3571937d6618d7c80be3f5e79ab7090731c6f7495areed@google.com    return b.contains(r);
368c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com}
378c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
384b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic bool sectsrgn_proc(SkRegion& a, SkRegion& b) {
398c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    return a.intersects(b);
408c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com}
418c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
424b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic bool sectsrect_proc(SkRegion& a, SkRegion& b) {
434b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com    SkIRect r = a.getBounds();
444b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com    r.inset(r.width()/4, r.height()/4);
4526dc5b6362cf5defa4158b61e2338e12f9e752careed@google.com    return a.intersects(r);
464b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com}
474b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com
4850129dbfaa3be4414933dec5d6c202ac0de71501reed@google.comstatic bool containsxy_proc(SkRegion& a, SkRegion& b) {
4950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    const SkIRect& r = a.getBounds();
5050129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    const int dx = r.width() / 8;
5150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    const int dy = r.height() / 8;
5250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    for (int y = r.fTop; y < r.fBottom; y += dy) {
5350129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com        for (int x = r.fLeft; x < r.fRight; x += dx) {
5450129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com            (void)a.contains(x, y);
5550129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com        }
5650129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    }
5750129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com    return true;
5850129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com}
5950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com
608c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comclass RegionBench : public SkBenchmark {
618c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.compublic:
628c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    typedef bool (*Proc)(SkRegion& a, SkRegion& b);
638c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
648c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    SkRegion fA, fB;
658c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    Proc     fProc;
668c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    SkString fName;
6746af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com    int      fLoopMul;
688c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
698c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    enum {
708c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        W = 1024,
718c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        H = 768,
7250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com        N = SkBENCHLOOP(2000)
738c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    };
748c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
758c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    SkIRect randrect(SkRandom& rand) {
768c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        int x = rand.nextU() % W;
778c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        int y = rand.nextU() % H;
788c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        int w = rand.nextU() % W;
798c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        int h = rand.nextU() % H;
808c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        return SkIRect::MakeXYWH(x, y, w >> 1, h >> 1);
818c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    }
828c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
8346af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com    RegionBench(void* param, int count, Proc proc, const char name[], int mul = 1) : INHERITED(param) {
848c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        fProc = proc;
85515d99840f566360ad8d6a4b7b0969ce179c1d50reed@google.com        fName.printf("region_%s_%d", name, count);
8646af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com        fLoopMul = mul;
878c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
888c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        SkRandom rand;
8950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com        for (int i = 0; i < count; i++) {
9050129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com            fA.op(randrect(rand), SkRegion::kXOR_Op);
9150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com            fB.op(randrect(rand), SkRegion::kXOR_Op);
928c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        }
938c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    }
948c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
958c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comprotected:
968c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    virtual const char* onGetName() { return fName.c_str(); }
978c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
988c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    virtual void onDraw(SkCanvas* canvas) {
998c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        Proc proc = fProc;
10046af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com        int n = fLoopMul * N;
10146af7efbeecca4c0d9650378c8fe6add194f231ereed@google.com        for (int i = 0; i < n; ++i) {
1028c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com            proc(fA, fB);
1038c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com        }
1048c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    }
1058c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
1068c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comprivate:
1078c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com    typedef SkBenchmark INHERITED;
1088c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com};
1098c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
11050129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com#define SMALL   16
1118c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
1128c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic SkBenchmark* gF0(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, union_proc, "union")); }
1138c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic SkBenchmark* gF1(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, sect_proc, "intersect")); }
1148c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic SkBenchmark* gF2(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, diff_proc, "difference")); }
11546af7efbeecca4c0d9650378c8fe6add194f231ereed@google.comstatic SkBenchmark* gF3(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, containsrect_proc, "containsrect", 100)); }
1164b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic SkBenchmark* gF4(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, sectsrgn_proc, "intersectsrgn", 10)); }
1174b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic SkBenchmark* gF5(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, sectsrect_proc, "intersectsrect", 200)); }
1184b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic SkBenchmark* gF6(void* p) { return SkNEW_ARGS(RegionBench, (p, SMALL, containsxy_proc, "containsxy")); }
1198c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com
1208c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR0(gF0);
1218c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR1(gF1);
1228c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR2(gF2);
1238c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR3(gF3);
1248c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comstatic BenchRegistry gR4(gF4);
12550129dbfaa3be4414933dec5d6c202ac0de71501reed@google.comstatic BenchRegistry gR5(gF5);
1264b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic BenchRegistry gR6(gF6);
127