/*
 * 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;
    typedef Benchmark INHERITED;
};

DEF_BENCH(return new TileImageFilterBench(0);)
DEF_BENCH(return new TileImageFilterBench(32);)
DEF_BENCH(return new TileImageFilterBench(64);)
