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