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

#include "SkBlurImageFilter.h"
#include "SkMaskFilter.h"
#include "gm.h"
#include "sk_tool_utils.h"


DEF_SIMPLE_GM(blurimagevmask, canvas, 700, 1200) {
    SkPaint paint;
    paint.setAntiAlias(true);
    paint.setColor(SK_ColorBLACK);

    SkPaint textPaint;
    textPaint.setAntiAlias(true);
    sk_tool_utils::set_portable_typeface(&textPaint);
    textPaint.setTextSize(SkIntToScalar(25));

    const double sigmas[] = {3.0, 8.0, 16.0, 24.0, 32.0};

    canvas->drawString("mask blur",  285, 50, textPaint);
    canvas->drawString("image blur", 285 + 250, 50, textPaint);


    SkRect r = {35, 100, 135, 200};
    for (auto sigma:sigmas) {

        canvas->drawRect(r, paint);

        char out[100];
        sprintf(out, "Sigma: %g", sigma);
        canvas->drawString(out, r.left(), r.bottom() + 35, textPaint);

        r.offset(250, 0);

        paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, sigma));
        canvas->drawRect(r, paint);
        paint.setMaskFilter(nullptr);

        SkPaint imageBlurPaint;
        r.offset(250, 0);
        imageBlurPaint.setImageFilter(SkBlurImageFilter::Make(sigma, sigma, nullptr));
        canvas->saveLayer(nullptr, &imageBlurPaint);

        canvas->drawRect(r, paint);
        canvas->restore();
        r.offset(-500, 200);
    }

}

#include "Resources.h"
DEF_SIMPLE_GM(blur_image, canvas, 500, 500) {
    auto image = GetResourceAsImage("images/mandrill_128.png");

    SkPaint paint;
    paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 4));

    // both of these should draw with the blur, but (formerally) we had a bug where the unscaled
    // version (taking the spriteblitter code path) ignore the maskfilter.

    canvas->drawImage(image, 10, 10, &paint);
    canvas->scale(1.01f, 1.01f);
    canvas->drawImage(image, 10 + image->width() + 10.f, 10, &paint);
}
