diff options
author | robertphillips <robertphillips@google.com> | 2015-10-19 06:39:17 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-19 06:39:17 -0700 |
commit | 9c4909b50ff9d0fdf9bce2a67cd459aeb28cdc3c (patch) | |
tree | e5ca55588af4b047c73ea0df40fd9557b57b7a54 /tools/imgblur.cpp | |
parent | b3f1636ec80e66188ddc01306672a9a79a954dfe (diff) |
Add imgblur tool to assist BlurMaskFilter debugging
imgblur is intended to establish a ground truth for debugging mask blur issues. It performs a brute force (non-separable) Gaussian blur of the provided image.
The blur code itself is in sk_tools_utils so it can be more easily used programmatically in other places (e.g., blur unit tests).
Review URL: https://codereview.chromium.org/1384203002
Diffstat (limited to 'tools/imgblur.cpp')
-rw-r--r-- | tools/imgblur.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/tools/imgblur.cpp b/tools/imgblur.cpp new file mode 100644 index 0000000000..5ee8b12370 --- /dev/null +++ b/tools/imgblur.cpp @@ -0,0 +1,83 @@ +/* + * 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 "SkCommandLineFlags.h" +#include "SkCommonFlags.h" +#include "SkImageDecoder.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 tool_main(int argc, char** argv); +int tool_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; + } + + SkFILEStream inputStream(FLAGS_in[0]); + if (!inputStream.isValid()) { + if (!FLAGS_quiet) { + SkDebugf("Couldn't open file: %s\n", FLAGS_in[0]); + } + return kError; + } + + SkAutoTDelete<SkImageDecoder> codec(SkImageDecoder::Factory(&inputStream)); + if (!codec) { + if (!FLAGS_quiet) { + SkDebugf("Couldn't create codec for: %s.\n", FLAGS_in[0]); + } + return kError; + } + + SkBitmap src; + + inputStream.rewind(); + SkImageDecoder::Result res = codec->decode(&inputStream, &src, + kN32_SkColorType, + SkImageDecoder::kDecodePixels_Mode); + if (SkImageDecoder::kSuccess != res) { + if (!FLAGS_quiet) { + SkDebugf("Couldn't decode image: %s.\n", FLAGS_in[0]); + } + return kError; + } + + SkBitmap dst = sk_tool_utils::slow_blur(src, (float) FLAGS_sigma); + + if (!SkImageEncoder::EncodeFile(FLAGS_out[0], dst, SkImageEncoder::kPNG_Type, 100)) { + if (!FLAGS_quiet) { + SkDebugf("Couldn't write to file: %s\n", FLAGS_out[0]); + } + return kError; + } + + return kSuccess; +} + +#if !defined SK_BUILD_FOR_IOS +int main(int argc, char * const argv[]) { + return tool_main(argc, (char**) argv); +} +#endif |