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 */ 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.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 280d10280190c411b18feb569a2248552047d1aa93reed@google.comstatic bool diffrect_proc(SkRegion& a, SkRegion& b) { 290d10280190c411b18feb569a2248552047d1aa93reed@google.com SkRegion result; 300d10280190c411b18feb569a2248552047d1aa93reed@google.com return result.op(a, b.getBounds(), SkRegion::kDifference_Op); 310d10280190c411b18feb569a2248552047d1aa93reed@google.com} 320d10280190c411b18feb569a2248552047d1aa93reed@google.com 330d10280190c411b18feb569a2248552047d1aa93reed@google.comstatic bool diffrectbig_proc(SkRegion& a, SkRegion& b) { 340d10280190c411b18feb569a2248552047d1aa93reed@google.com SkRegion result; 350d10280190c411b18feb569a2248552047d1aa93reed@google.com return result.op(a, a.getBounds(), SkRegion::kDifference_Op); 360d10280190c411b18feb569a2248552047d1aa93reed@google.com} 370d10280190c411b18feb569a2248552047d1aa93reed@google.com 3801049d5e21a266f307a25a6f884ffacdbbf256edreed@google.comstatic bool containsrect_proc(SkRegion& a, SkRegion& b) { 3950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com SkIRect r = a.getBounds(); 408c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com r.inset(r.width()/4, r.height()/4); 4150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com (void)a.contains(r); 4250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com 4350129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com r = b.getBounds(); 4450129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com r.inset(r.width()/4, r.height()/4); 4571937d6618d7c80be3f5e79ab7090731c6f7495areed@google.com return b.contains(r); 468c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com} 478c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 484b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic bool sectsrgn_proc(SkRegion& a, SkRegion& b) { 498c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com return a.intersects(b); 508c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com} 518c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 524b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.comstatic bool sectsrect_proc(SkRegion& a, SkRegion& b) { 534b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com SkIRect r = a.getBounds(); 544b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com r.inset(r.width()/4, r.height()/4); 5526dc5b6362cf5defa4158b61e2338e12f9e752careed@google.com return a.intersects(r); 564b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com} 574b4f86d34de000e38cc03bce5995a132e13e3c8creed@google.com 5850129dbfaa3be4414933dec5d6c202ac0de71501reed@google.comstatic bool containsxy_proc(SkRegion& a, SkRegion& b) { 5950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com const SkIRect& r = a.getBounds(); 6050129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com const int dx = r.width() / 8; 6150129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com const int dy = r.height() / 8; 6250129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com for (int y = r.fTop; y < r.fBottom; y += dy) { 6350129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com for (int x = r.fLeft; x < r.fRight; x += dx) { 6450129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com (void)a.contains(x, y); 6550129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com } 6650129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com } 6750129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com return true; 6850129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com} 6950129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com 70f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RegionBench : public Benchmark { 718c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.compublic: 728c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com typedef bool (*Proc)(SkRegion& a, SkRegion& b); 738c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 748c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkRegion fA, fB; 758c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com Proc fProc; 768c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com SkString fName; 77fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 788c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com enum { 798c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com W = 1024, 808c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com H = 768, 818c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com }; 828c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 83e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkIRect randrect(SkRandom& rand) { 848c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int x = rand.nextU() % W; 858c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int y = rand.nextU() % H; 868c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int w = rand.nextU() % W; 878c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com int h = rand.nextU() % H; 888c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com return SkIRect::MakeXYWH(x, y, w >> 1, h >> 1); 898c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 908c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 91410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com RegionBench(int count, Proc proc, const char name[]) { 928c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com fProc = proc; 93515d99840f566360ad8d6a4b7b0969ce179c1d50reed@google.com fName.printf("region_%s_%d", name, count); 948c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 95e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 9650129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com for (int i = 0; i < count; i++) { 9750129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com fA.op(randrect(rand), SkRegion::kXOR_Op); 9850129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com fB.op(randrect(rand), SkRegion::kXOR_Op); 998c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 100644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 101644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 102644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 103644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 1048c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 1058c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 1068c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comprotected: 1078c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com virtual const char* onGetName() { return fName.c_str(); } 1088c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 1093361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) { 1108c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com Proc proc = fProc; 1113361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 1128c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com proc(fA, fB); 1138c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 1148c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com } 1158c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 1168c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.comprivate: 117f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 1188c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com}; 1198c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 120f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RectSectBench : public Benchmark { 121ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org enum { 122ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org N = 1000 123ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org }; 124ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org SkRect fArray0[N]; 125ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org SkRect fArray1[N]; 126ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org SkString fName; 127ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org bool fNewWay; 128ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org 129ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.orgpublic: 130ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org static void RandRect(SkRect* r, SkRandom& rand) { 131ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org r->set(rand.nextSScalar1(), rand.nextSScalar1(), 132ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org rand.nextSScalar1(), rand.nextSScalar1()); 133ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org r->sort(); 134ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 135f8affa2e5cf9d4e0c8b020ba322f03355050794eskia.committer@gmail.com 136ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org RectSectBench(bool newWay) : fNewWay(newWay) { 137ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org fName.printf("rect_intersect_%s", newWay ? "new" : "old"); 138f8affa2e5cf9d4e0c8b020ba322f03355050794eskia.committer@gmail.com 139ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org SkRandom rand; 140ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org for (int i = 0; i < N; i++) { 141ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org RandRect(&fArray0[i], rand); 142ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org RandRect(&fArray1[i], rand); 143ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 144ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 145ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org 146ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 147ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org return backend == kNonRendering_Backend; 148ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 149ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org 150ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.orgprotected: 151ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org virtual const char* onGetName() { return fName.c_str(); } 152f8affa2e5cf9d4e0c8b020ba322f03355050794eskia.committer@gmail.com 153ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org virtual void onDraw(const int loops, SkCanvas* canvas) { 154ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org for (int i = 0; i < loops; ++i) { 155ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org if (fNewWay) { 156ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org for (int j = 0; j < N; ++j) { 157ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org SkRect r = fArray0[j]; 158ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org r.intersect2(fArray1[j]); 159ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 160ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } else { 161ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org for (int j = 0; j < N; ++j) { 162ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org SkRect r = fArray0[j]; 163ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org r.intersect(fArray1[j]); 164ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 165ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 166ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 167ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org } 168f8affa2e5cf9d4e0c8b020ba322f03355050794eskia.committer@gmail.com 169ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.orgprivate: 170f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 171ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org}; 172ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org 173ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 174ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org 17550129dbfaa3be4414933dec5d6c202ac0de71501reed@google.com#define SMALL 16 1768c2cc1a4ddbc99be2435674bc3512af9c9f03452reed@google.com 177410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, union_proc, "union")); ) 178410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, sect_proc, "intersect")); ) 179410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, diff_proc, "difference")); ) 180410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, diffrect_proc, "differencerect")); ) 181410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, diffrectbig_proc, "differencerectbig")); ) 182410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, containsrect_proc, "containsrect")); ) 183410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, sectsrgn_proc, "intersectsrgn")); ) 184410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, sectsrect_proc, "intersectsrect")); ) 185410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return SkNEW_ARGS(RegionBench, (SMALL, containsxy_proc, "containsxy")); ) 186ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.org 187ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.orgDEF_BENCH( return SkNEW_ARGS(RectSectBench, (false)); ) 188ae8f9528fd0052e06653272abb44a1f49a3b726bmike@reedtribe.orgDEF_BENCH( return SkNEW_ARGS(RectSectBench, (true)); ) 189