/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/**
 * Pathologically simple drawing tests, designed to generate consistent
 * output images across platforms for gm/tests/run.sh
 */

#include "gm.h"
#include "SkCanvas.h"
#include "SkPaint.h"

class SelfTestGM : public skiagm::GM {
public:
    SelfTestGM(const char name[], SkColor color, uint32_t flags) :
        fName(name), fColor(color), fFlags(flags) {}
    const static int kWidth = 300;
    const static int kHeight = 200;

protected:
    SkString onShortName() {
        return fName;
    }

    SkISize onISize() { return skiagm::make_isize(kWidth, kHeight); }

    virtual void onDraw(SkCanvas* canvas) {
        SkPaint paint;
        paint.setStyle(SkPaint::kFill_Style);
        paint.setColor(fColor);
        canvas->drawRectCoords(0, 0, SkIntToScalar(kWidth), SkIntToScalar(kHeight), paint);
    }

    virtual uint32_t onGetFlags() const { return fFlags; }

private:
    const SkString fName;
    const SkColor fColor;
    const uint32_t fFlags;
};

//////////////////////////////////////////////////////////////////////////////

// We use translucent colors to make sure we are properly handling cases like
// those which caused https://code.google.com/p/skia/issues/detail?id=1079
// ('gm generating spurious pixel_error messages as of r7258')
static SkColor kTranslucentGreen = 0x7700EE00;
static SkColor kTranslucentBlue  = 0x770000DD;

static skiagm::GM* F1(void*) {
    return new SelfTestGM("selftest1", kTranslucentGreen, 0);
}
static skiagm::GM* F2(void*) {
    return new SelfTestGM("selftest2", kTranslucentBlue,  skiagm::GM::kSkipPipe_Flag);
}

static skiagm::GMRegistry gR1(F1);
static skiagm::GMRegistry gR2(F2);
