| Index: bench/TileImageFilterBench.cpp
|
| diff --git a/bench/TileImageFilterBench.cpp b/bench/TileImageFilterBench.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..350b0ac21483be30df0507d4035733a3903a041d
|
| --- /dev/null
|
| +++ b/bench/TileImageFilterBench.cpp
|
| @@ -0,0 +1,73 @@
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "Benchmark.h"
|
| +#include "SkTileImageFilter.h"
|
| +#include "SkCanvas.h"
|
| +#include "SkPaint.h"
|
| +#include "SkString.h"
|
| +
|
| +#define WIDTH 512
|
| +#define HEIGHT 512
|
| +
|
| +// This bench exercises SkTileImageFilter drawn from a 50x50 source to
|
| +// a 512x512 destination. It is drawn using a single rect, or "tiled"
|
| +// rendering (using 32x32, 64x64 tiles). Tiled rendering is currently an order
|
| +// of magnitude slower, since SkTileImageFilter does not clip the
|
| +// source or destination rects.
|
| +
|
| +class TileImageFilterBench : public Benchmark {
|
| +public:
|
| + TileImageFilterBench(int tileSize) : fTileSize(tileSize) {
|
| + if (tileSize > 0) {
|
| + fName.printf("tile_image_filter_tiled_%d", tileSize);
|
| + } else {
|
| + fName.printf("tile_image_filter");
|
| + }
|
| + }
|
| +
|
| +protected:
|
| + const char* onGetName() override {
|
| + return fName.c_str();
|
| + }
|
| +
|
| + void onDraw(int loops, SkCanvas* canvas) override {
|
| + SkPaint paint;
|
| + SkAutoTUnref<SkImageFilter> tile(SkTileImageFilter::Create(
|
| + SkRect::MakeWH(50, 50),
|
| + SkRect::MakeWH(WIDTH, HEIGHT),
|
| + nullptr));
|
| + paint.setImageFilter(tile);
|
| +
|
| + for (int i = 0; i < loops; i++) {
|
| + if (fTileSize > 0) {
|
| + for (int y = 0; y < HEIGHT; y += fTileSize) {
|
| + for (int x = 0; x < WIDTH; x += fTileSize) {
|
| + canvas->save();
|
| + SkIRect clipIRect = SkIRect::MakeXYWH(x, y, fTileSize, fTileSize);
|
| + canvas->clipRect(SkRect::Make(clipIRect));
|
| + canvas->drawRect(SkRect::MakeWH(WIDTH, HEIGHT), paint);
|
| + canvas->restore();
|
| + }
|
| + }
|
| + } else {
|
| + canvas->drawRect(SkRect::MakeWH(WIDTH, HEIGHT), paint);
|
| + }
|
| + }
|
| + }
|
| +
|
| +private:
|
| + SkString fName;
|
| + // Note: this is the tile size used for tiled rendering, not for the size
|
| + // of the SkTileImageFilter source rect.
|
| + int fTileSize;
|
| + typedef Benchmark INHERITED;
|
| +};
|
| +
|
| +DEF_BENCH(return new TileImageFilterBench(0);)
|
| +DEF_BENCH(return new TileImageFilterBench(32);)
|
| +DEF_BENCH(return new TileImageFilterBench(64);)
|
|
|