/*
 * 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 "gm.h"
#include "SkMorphologyImageFilter.h"

#define WIDTH 640
#define HEIGHT 480

namespace skiagm {

class MorphologyGM : public GM {
public:
    MorphologyGM() {
        this->setBGColor(0xFF000000);
        fOnce = false;
    }
    
protected:
    virtual SkString onShortName() {
        return SkString("morphology");
    }

    void make_bitmap() {
        fBitmap.setConfig(SkBitmap::kARGB_8888_Config, 135, 135);
        fBitmap.allocPixels();
        SkDevice device(fBitmap);
        SkCanvas canvas(&device);
        canvas.clear(0x0);
        SkPaint paint;
        paint.setAntiAlias(true);
        const char* str1 = "ABC";
        const char* str2 = "XYZ";
        paint.setColor(0xFFFFFFFF);
        paint.setTextSize(64);
        canvas.drawText(str1, strlen(str1), 10, 55, paint);
        canvas.drawText(str2, strlen(str2), 10, 110, paint);
    }

    virtual SkISize onISize() {
        return make_isize(WIDTH, HEIGHT);
    }
    virtual void onDraw(SkCanvas* canvas) {
        if (!fOnce) {
            make_bitmap();
            fOnce = true;
        }
        struct {
            int fWidth, fHeight;
            int fRadiusX, fRadiusY;
        } samples[] = {
            { 140, 140,   0,   0 },
            { 140, 140,   0,   2 },
            { 140, 140,   2,   0 },
            { 140, 140,   2,   2 },
            {  24,  24,  25,  25 },
        };
        SkPaint paint;
        for (unsigned j = 0; j < 2; ++j) {
            for (unsigned i = 0; i < SK_ARRAY_COUNT(samples); ++i) {
                SkScalar x = SkIntToScalar(i * 140), y = SkIntToScalar(j * 140);
                if (j) {
                    paint.setImageFilter(new SkErodeImageFilter(
                        samples[i].fRadiusX,
                        samples[i].fRadiusY))->unref();
                } else {
                    paint.setImageFilter(new SkDilateImageFilter(
                        samples[i].fRadiusX,
                        samples[i].fRadiusY))->unref();
                }
                SkRect bounds = SkRect::MakeXYWH(
                    x,
                    y,
                    SkIntToScalar(samples[i].fWidth),
                    SkIntToScalar(samples[i].fHeight));
                canvas->saveLayer(&bounds, &paint);
                canvas->drawBitmap(fBitmap, x, y);
                canvas->restore();
            }
        }
    }
    
private:
    typedef GM INHERITED;
    SkBitmap fBitmap;
    bool fOnce;
};

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

static GM* MyFactory(void*) { return new MorphologyGM; }
static GMRegistry reg(MyFactory);

}
