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

#include "SkBitmap.h"
#include "SkCommandLineFlags.h"
#include "SkCommonFlags.h"
#include "SkData.h"
#include "SkImage.h"
#include "SkStream.h"
#include "SkTypes.h"

#include "sk_tool_utils.h"

DEFINE_string(in, "input.png", "Input image");
DEFINE_string(out, "blurred.png", "Output image");
DEFINE_double(sigma, 1, "Sigma to be used for blur (> 0.0f)");


// This tool just performs a blur on an input image
// Return codes:
static const int kSuccess = 0;
static const int kError = 1;

int main(int argc, char** argv) {
    SkCommandLineFlags::SetUsage("Brute force blur of an image.");
    SkCommandLineFlags::Parse(argc, argv);

    if (FLAGS_sigma <= 0) {
        if (!FLAGS_quiet) {
            SkDebugf("Sigma must be greater than zero (it is %f).\n", FLAGS_sigma);
        }
        return kError;
    }

    sk_sp<SkData> data(SkData::MakeFromFileName(FLAGS_in[0]));
    if (nullptr == data) {
        if (!FLAGS_quiet) {
            SkDebugf("Couldn't open file: %s\n", FLAGS_in[0]);
        }
        return kError;
    }

    sk_sp<SkImage> image(SkImage::MakeFromEncoded(data));
    if (!image) {
        if (!FLAGS_quiet) {
            SkDebugf("Couldn't create image for: %s.\n", FLAGS_in[0]);
        }
        return kError;
    }

    SkBitmap src;
    if (!image->asLegacyBitmap(&src, SkImage::kRW_LegacyBitmapMode)) {
        if (!FLAGS_quiet) {
            SkDebugf("Couldn't create bitmap for: %s.\n", FLAGS_in[0]);
        }
        return kError;
    }

    SkBitmap dst = sk_tool_utils::slow_blur(src, (float) FLAGS_sigma);

    if (!sk_tool_utils::EncodeImageToFile(FLAGS_out[0], dst, SkEncodedImageFormat::kPNG, 100)) {
        if (!FLAGS_quiet) {
            SkDebugf("Couldn't write to file: %s\n", FLAGS_out[0]);
        }
        return kError;
    }

    return kSuccess;
}
