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