1a3c134897602f878da9dd858109498392a5daae9reed@google.com/*
2a3c134897602f878da9dd858109498392a5daae9reed@google.com * Copyright 2013 Google Inc.
3a3c134897602f878da9dd858109498392a5daae9reed@google.com *
4a3c134897602f878da9dd858109498392a5daae9reed@google.com * Use of this source code is governed by a BSD-style license that can be
5a3c134897602f878da9dd858109498392a5daae9reed@google.com * found in the LICENSE file.
6a3c134897602f878da9dd858109498392a5daae9reed@google.com */
7a3c134897602f878da9dd858109498392a5daae9reed@google.com
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
9a3c134897602f878da9dd858109498392a5daae9reed@google.com#include "SkRandom.h"
10a3c134897602f878da9dd858109498392a5daae9reed@google.com#include "SkRegion.h"
11a3c134897602f878da9dd858109498392a5daae9reed@google.com#include "SkString.h"
12a3c134897602f878da9dd858109498392a5daae9reed@google.com
13a3c134897602f878da9dd858109498392a5daae9reed@google.comstatic bool sect_proc(SkRegion& a, SkRegion& b) {
14a3c134897602f878da9dd858109498392a5daae9reed@google.com    SkRegion result;
15a3c134897602f878da9dd858109498392a5daae9reed@google.com    return result.op(a, b, SkRegion::kIntersect_Op);
16a3c134897602f878da9dd858109498392a5daae9reed@google.com}
17a3c134897602f878da9dd858109498392a5daae9reed@google.com
18f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RegionContainBench : public Benchmark {
19a3c134897602f878da9dd858109498392a5daae9reed@google.compublic:
20a3c134897602f878da9dd858109498392a5daae9reed@google.com    typedef bool (*Proc)(SkRegion& a, SkRegion& b);
21a3c134897602f878da9dd858109498392a5daae9reed@google.com    SkRegion fA, fB;
22a3c134897602f878da9dd858109498392a5daae9reed@google.com    Proc     fProc;
23a3c134897602f878da9dd858109498392a5daae9reed@google.com    SkString fName;
24a3c134897602f878da9dd858109498392a5daae9reed@google.com
25a3c134897602f878da9dd858109498392a5daae9reed@google.com    enum {
26a3c134897602f878da9dd858109498392a5daae9reed@google.com        W = 200,
27a3c134897602f878da9dd858109498392a5daae9reed@google.com        H = 200,
28a3c134897602f878da9dd858109498392a5daae9reed@google.com        COUNT = 10,
29a3c134897602f878da9dd858109498392a5daae9reed@google.com    };
30a3c134897602f878da9dd858109498392a5daae9reed@google.com
31e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkIRect randrect(SkRandom& rand, int i) {
32a3c134897602f878da9dd858109498392a5daae9reed@google.com        int w = rand.nextU() % W;
33a3c134897602f878da9dd858109498392a5daae9reed@google.com        return SkIRect::MakeXYWH(0, i*H/COUNT, w, H/COUNT);
34a3c134897602f878da9dd858109498392a5daae9reed@google.com    }
35a3c134897602f878da9dd858109498392a5daae9reed@google.com
36410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com    RegionContainBench(Proc proc, const char name[])  {
37a3c134897602f878da9dd858109498392a5daae9reed@google.com        fProc = proc;
38a3c134897602f878da9dd858109498392a5daae9reed@google.com        fName.printf("region_contains_%s", name);
39a3c134897602f878da9dd858109498392a5daae9reed@google.com
40e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand;
41a3c134897602f878da9dd858109498392a5daae9reed@google.com        for (int i = 0; i < COUNT; i++) {
42a3c134897602f878da9dd858109498392a5daae9reed@google.com            fA.op(randrect(rand, i), SkRegion::kXOR_Op);
43a3c134897602f878da9dd858109498392a5daae9reed@google.com        }
44a3c134897602f878da9dd858109498392a5daae9reed@google.com
45a3c134897602f878da9dd858109498392a5daae9reed@google.com        fB.setRect(0, 0, H, W);
46644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    }
47a3c134897602f878da9dd858109498392a5daae9reed@google.com
48644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org    virtual bool isSuitableFor(Backend backend) SK_OVERRIDE {
49644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org        return backend == kNonRendering_Backend;
50a3c134897602f878da9dd858109498392a5daae9reed@google.com    }
51a3c134897602f878da9dd858109498392a5daae9reed@google.com
52a3c134897602f878da9dd858109498392a5daae9reed@google.comprotected:
53a3c134897602f878da9dd858109498392a5daae9reed@google.com    virtual const char* onGetName() { return fName.c_str(); }
54a3c134897602f878da9dd858109498392a5daae9reed@google.com
553361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org    virtual void onDraw(const int loops, SkCanvas*) {
56a3c134897602f878da9dd858109498392a5daae9reed@google.com        Proc proc = fProc;
57a3c134897602f878da9dd858109498392a5daae9reed@google.com
583361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org        for (int i = 0; i < loops; ++i) {
59a3c134897602f878da9dd858109498392a5daae9reed@google.com           proc(fA, fB);
60a3c134897602f878da9dd858109498392a5daae9reed@google.com        }
61a3c134897602f878da9dd858109498392a5daae9reed@google.com    }
62a3c134897602f878da9dd858109498392a5daae9reed@google.com
63a3c134897602f878da9dd858109498392a5daae9reed@google.comprivate:
64f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
65a3c134897602f878da9dd858109498392a5daae9reed@google.com};
66a3c134897602f878da9dd858109498392a5daae9reed@google.com
67410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionContainBench, (sect_proc, "sect")); )
68