13c1468188924ede1e6589cddee84031c16782226senorblanco/* 23c1468188924ede1e6589cddee84031c16782226senorblanco * Copyright 2016 Google Inc. 33c1468188924ede1e6589cddee84031c16782226senorblanco * 43c1468188924ede1e6589cddee84031c16782226senorblanco * Use of this source code is governed by a BSD-style license that can be 53c1468188924ede1e6589cddee84031c16782226senorblanco * found in the LICENSE file. 63c1468188924ede1e6589cddee84031c16782226senorblanco */ 73c1468188924ede1e6589cddee84031c16782226senorblanco 83c1468188924ede1e6589cddee84031c16782226senorblanco#include "Benchmark.h" 93c1468188924ede1e6589cddee84031c16782226senorblanco#include "SkTileImageFilter.h" 103c1468188924ede1e6589cddee84031c16782226senorblanco#include "SkCanvas.h" 113c1468188924ede1e6589cddee84031c16782226senorblanco#include "SkPaint.h" 123c1468188924ede1e6589cddee84031c16782226senorblanco#include "SkString.h" 133c1468188924ede1e6589cddee84031c16782226senorblanco 143c1468188924ede1e6589cddee84031c16782226senorblanco#define WIDTH 512 153c1468188924ede1e6589cddee84031c16782226senorblanco#define HEIGHT 512 163c1468188924ede1e6589cddee84031c16782226senorblanco 173c1468188924ede1e6589cddee84031c16782226senorblanco// This bench exercises SkTileImageFilter drawn from a 50x50 source to 183c1468188924ede1e6589cddee84031c16782226senorblanco// a 512x512 destination. It is drawn using a single rect, or "tiled" 193c1468188924ede1e6589cddee84031c16782226senorblanco// rendering (using 32x32, 64x64 tiles). Tiled rendering is currently an order 203c1468188924ede1e6589cddee84031c16782226senorblanco// of magnitude slower, since SkTileImageFilter does not clip the 213c1468188924ede1e6589cddee84031c16782226senorblanco// source or destination rects. 223c1468188924ede1e6589cddee84031c16782226senorblanco 233c1468188924ede1e6589cddee84031c16782226senorblancoclass TileImageFilterBench : public Benchmark { 243c1468188924ede1e6589cddee84031c16782226senorblancopublic: 253c1468188924ede1e6589cddee84031c16782226senorblanco TileImageFilterBench(int tileSize) : fTileSize(tileSize) { 263c1468188924ede1e6589cddee84031c16782226senorblanco if (tileSize > 0) { 273c1468188924ede1e6589cddee84031c16782226senorblanco fName.printf("tile_image_filter_tiled_%d", tileSize); 283c1468188924ede1e6589cddee84031c16782226senorblanco } else { 293c1468188924ede1e6589cddee84031c16782226senorblanco fName.printf("tile_image_filter"); 303c1468188924ede1e6589cddee84031c16782226senorblanco } 313c1468188924ede1e6589cddee84031c16782226senorblanco } 323c1468188924ede1e6589cddee84031c16782226senorblanco 333c1468188924ede1e6589cddee84031c16782226senorblancoprotected: 343c1468188924ede1e6589cddee84031c16782226senorblanco const char* onGetName() override { 353c1468188924ede1e6589cddee84031c16782226senorblanco return fName.c_str(); 363c1468188924ede1e6589cddee84031c16782226senorblanco } 373c1468188924ede1e6589cddee84031c16782226senorblanco 383c1468188924ede1e6589cddee84031c16782226senorblanco void onDraw(int loops, SkCanvas* canvas) override { 393c1468188924ede1e6589cddee84031c16782226senorblanco SkPaint paint; 40534c270465a9824893d5c9d6c5bacef7726cc389robertphillips paint.setImageFilter(SkTileImageFilter::Make(SkRect::MakeWH(50, 50), 41534c270465a9824893d5c9d6c5bacef7726cc389robertphillips SkRect::MakeWH(WIDTH, HEIGHT), 42534c270465a9824893d5c9d6c5bacef7726cc389robertphillips nullptr)); 433c1468188924ede1e6589cddee84031c16782226senorblanco 443c1468188924ede1e6589cddee84031c16782226senorblanco for (int i = 0; i < loops; i++) { 453c1468188924ede1e6589cddee84031c16782226senorblanco if (fTileSize > 0) { 463c1468188924ede1e6589cddee84031c16782226senorblanco for (int y = 0; y < HEIGHT; y += fTileSize) { 473c1468188924ede1e6589cddee84031c16782226senorblanco for (int x = 0; x < WIDTH; x += fTileSize) { 483c1468188924ede1e6589cddee84031c16782226senorblanco canvas->save(); 493c1468188924ede1e6589cddee84031c16782226senorblanco SkIRect clipIRect = SkIRect::MakeXYWH(x, y, fTileSize, fTileSize); 503c1468188924ede1e6589cddee84031c16782226senorblanco canvas->clipRect(SkRect::Make(clipIRect)); 513c1468188924ede1e6589cddee84031c16782226senorblanco canvas->drawRect(SkRect::MakeWH(WIDTH, HEIGHT), paint); 523c1468188924ede1e6589cddee84031c16782226senorblanco canvas->restore(); 533c1468188924ede1e6589cddee84031c16782226senorblanco } 543c1468188924ede1e6589cddee84031c16782226senorblanco } 553c1468188924ede1e6589cddee84031c16782226senorblanco } else { 563c1468188924ede1e6589cddee84031c16782226senorblanco canvas->drawRect(SkRect::MakeWH(WIDTH, HEIGHT), paint); 573c1468188924ede1e6589cddee84031c16782226senorblanco } 583c1468188924ede1e6589cddee84031c16782226senorblanco } 593c1468188924ede1e6589cddee84031c16782226senorblanco } 603c1468188924ede1e6589cddee84031c16782226senorblanco 613c1468188924ede1e6589cddee84031c16782226senorblancoprivate: 623c1468188924ede1e6589cddee84031c16782226senorblanco SkString fName; 633c1468188924ede1e6589cddee84031c16782226senorblanco // Note: this is the tile size used for tiled rendering, not for the size 643c1468188924ede1e6589cddee84031c16782226senorblanco // of the SkTileImageFilter source rect. 653c1468188924ede1e6589cddee84031c16782226senorblanco int fTileSize; 663c1468188924ede1e6589cddee84031c16782226senorblanco typedef Benchmark INHERITED; 673c1468188924ede1e6589cddee84031c16782226senorblanco}; 683c1468188924ede1e6589cddee84031c16782226senorblanco 693c1468188924ede1e6589cddee84031c16782226senorblancoDEF_BENCH(return new TileImageFilterBench(0);) 703c1468188924ede1e6589cddee84031c16782226senorblancoDEF_BENCH(return new TileImageFilterBench(32);) 713c1468188924ede1e6589cddee84031c16782226senorblancoDEF_BENCH(return new TileImageFilterBench(64);) 72