/*
 * 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 "SkBenchmark.h"
#include "SkCanvas.h"
#include "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 SkBenchmark {
public:

    static const int kNumIterations = SkBENCHLOOP(10);
    static const int kNumRows = 48;
    static const int kNumCols = 32;

    TableBench(void* param)
        : INHERITED(param) {
    }

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

    virtual void onDraw(SkCanvas* canvas) {

        SkPaint cellPaint;
        cellPaint.setColor(0xFFFFFFF);

        SkPaint borderPaint;
        borderPaint.setColor(0xFFCCCCCC);

        for (int i = 0; i < kNumIterations; ++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:
    typedef SkBenchmark INHERITED;
};

static SkBenchmark* gFactory(void* p) { return new TableBench(p); }

static BenchRegistry gRegistry(gFactory);