/*
 * 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 "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRect.h"
#include "include/core/SkRegion.h"
#include "include/core/SkSize.h"
#include "include/core/SkString.h"

/**
 *  This is very similar to the RectGrid macrobench in Android.
 */
class DrawRegionGM : public skiagm::GM {
public:
    DrawRegionGM() {}

protected:
    SkString onShortName() override {
        return SkString("drawregion");
    }

    SkISize onISize() override {
        return SkISize::Make(500, 500);
    }

    bool runAsBench() const override {
        return true;
    }

    void onOnceBeforeDraw() override {
        for (int x = 50; x < 250; x+=2) {
            for (int y = 50; y < 250; y+=2) {
                fRegion.op(x, y, x + 1, y + 1, SkRegion::kUnion_Op);
            }
        }
    }

    void onDraw(SkCanvas* canvas) override {
        canvas->translate(10, 10);

        SkPaint paint;
        paint.setStyle(SkPaint::kFill_Style);
        paint.setColor(0xFFFF00FF);
        canvas->drawRect(SkRect::MakeLTRB(50.0f, 50.0f, 250.0f, 250.0f), paint);

        paint.setColor(0xFF00FFFF);
        canvas->drawRegion(fRegion, paint);
    }

    SkRegion fRegion;

private:
    typedef skiagm::GM INHERITED;
};
DEF_GM( return new DrawRegionGM; )
