TileImageFilterBench.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright 2016 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "bench/Benchmark.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/core/SkPaint.h"
  10. #include "include/core/SkString.h"
  11. #include "include/effects/SkTileImageFilter.h"
  12. #define WIDTH 512
  13. #define HEIGHT 512
  14. // This bench exercises SkTileImageFilter drawn from a 50x50 source to
  15. // a 512x512 destination. It is drawn using a single rect, or "tiled"
  16. // rendering (using 32x32, 64x64 tiles). Tiled rendering is currently an order
  17. // of magnitude slower, since SkTileImageFilter does not clip the
  18. // source or destination rects.
  19. class TileImageFilterBench : public Benchmark {
  20. public:
  21. TileImageFilterBench(int tileSize) : fTileSize(tileSize) {
  22. if (tileSize > 0) {
  23. fName.printf("tile_image_filter_tiled_%d", tileSize);
  24. } else {
  25. fName.printf("tile_image_filter");
  26. }
  27. }
  28. protected:
  29. const char* onGetName() override {
  30. return fName.c_str();
  31. }
  32. void onDraw(int loops, SkCanvas* canvas) override {
  33. SkPaint paint;
  34. paint.setImageFilter(SkTileImageFilter::Make(SkRect::MakeWH(50, 50),
  35. SkRect::MakeWH(WIDTH, HEIGHT),
  36. nullptr));
  37. for (int i = 0; i < loops; i++) {
  38. if (fTileSize > 0) {
  39. for (int y = 0; y < HEIGHT; y += fTileSize) {
  40. for (int x = 0; x < WIDTH; x += fTileSize) {
  41. canvas->save();
  42. SkIRect clipIRect = SkIRect::MakeXYWH(x, y, fTileSize, fTileSize);
  43. canvas->clipRect(SkRect::Make(clipIRect));
  44. canvas->drawRect(SkRect::MakeWH(WIDTH, HEIGHT), paint);
  45. canvas->restore();
  46. }
  47. }
  48. } else {
  49. canvas->drawRect(SkRect::MakeWH(WIDTH, HEIGHT), paint);
  50. }
  51. }
  52. }
  53. private:
  54. SkString fName;
  55. // Note: this is the tile size used for tiled rendering, not for the size
  56. // of the SkTileImageFilter source rect.
  57. int fTileSize;
  58. typedef Benchmark INHERITED;
  59. };
  60. DEF_BENCH(return new TileImageFilterBench(0);)
  61. DEF_BENCH(return new TileImageFilterBench(32);)
  62. DEF_BENCH(return new TileImageFilterBench(64);)