/*
 * Copyright 2012 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/SkRect.h"

static const SkScalar kCellWidth = SkIntToScalar(20);
static const SkScalar kCellHeight = SkIntToScalar(10);

// This bench draws a table in the manner of Google spreadsheet and sahadan.com.
//           ____________ ___
//          |     1      | 2 |
//          |____________|___|
//          |     3      | 4 |
//          |____________|___|
//
// Areas 1-4 are first all draw white. Areas 3&4 are then drawn grey. Areas
// 2&4 are then drawn grey. Areas 2&3 are thus double drawn while area 4 is
// triple drawn.
// This trio of drawRects is then repeat for the next cell.
class TableBench : public Benchmark {
public:
    static const int kNumRows = 48;
    static const int kNumCols = 32;

protected:
    const char* onGetName() override {
        return "tablebench";
    }

    void onDraw(int loops, SkCanvas* canvas) override {
        SkPaint cellPaint;
        cellPaint.setColor(0xFFFFFFF);

        SkPaint borderPaint;
        borderPaint.setColor(0xFFCCCCCC);

        for (int i = 0; i < loops; ++i) {
            for (int row = 0; row < kNumRows; ++row) {
                for (int col = 0; col < kNumCols; ++col) {
                    SkRect cell = SkRect::MakeLTRB(col * kCellWidth,
                                                   row * kCellHeight,
                                                   (col+1) * kCellWidth,
                                                   (row+1) * kCellHeight);
                    canvas->drawRect(cell, cellPaint);

                    SkRect bottom = SkRect::MakeLTRB(col * kCellWidth,
                                                     row * kCellHeight + (kCellHeight-SK_Scalar1),
                                                     (col+1) * kCellWidth,
                                                     (row+1) * kCellHeight);
                    canvas->drawRect(bottom, borderPaint);

                    SkRect right = SkRect::MakeLTRB(col * kCellWidth + (kCellWidth-SK_Scalar1),
                                                    row * kCellHeight,
                                                    (col+1) * kCellWidth,
                                                    (row+1) * kCellHeight);
                    canvas->drawRect(right, borderPaint);
                }
            }
        }
    }

private:
    using INHERITED = Benchmark;
};

DEF_BENCH( return new TableBench(); )
