|  | /* | 
|  | * 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 "bench/Benchmark.h" | 
|  | #include "include/core/SkCanvas.h" | 
|  | #include "include/core/SkPaint.h" | 
|  | #include "include/core/SkString.h" | 
|  | #include "include/effects/SkImageFilters.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; | 
|  | paint.setImageFilter(SkImageFilters::Tile( | 
|  | SkRect::MakeWH(50, 50), SkRect::MakeWH(WIDTH, HEIGHT), nullptr)); | 
|  |  | 
|  | 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; | 
|  | using INHERITED = Benchmark; | 
|  | }; | 
|  |  | 
|  | DEF_BENCH(return new TileImageFilterBench(0);) | 
|  | DEF_BENCH(return new TileImageFilterBench(32);) | 
|  | DEF_BENCH(return new TileImageFilterBench(64);) |