1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCommandLineFlags.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCommonFlags.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkData.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImage.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStream.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypes.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEFINE_string(in, "input.png", "Input image"); 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEFINE_string(out, "blurred.png", "Output image"); 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEFINE_double(sigma, 1, "Sigma to be used for blur (> 0.0f)"); 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This tool just performs a blur on an input image 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Return codes: 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const int kSuccess = 0; 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const int kError = 1; 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint main(int argc, char** argv) { 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCommandLineFlags::SetUsage("Brute force blur of an image."); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCommandLineFlags::Parse(argc, argv); 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (FLAGS_sigma <= 0) { 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!FLAGS_quiet) { 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDebugf("Sigma must be greater than zero (it is %f).\n", FLAGS_sigma); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return kError; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkData> data(SkData::MakeFromFileName(FLAGS_in[0])); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (nullptr == data) { 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!FLAGS_quiet) { 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDebugf("Couldn't open file: %s\n", FLAGS_in[0]); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return kError; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkImage> image(SkImage::MakeFromEncoded(data)); 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!image) { 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!FLAGS_quiet) { 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDebugf("Couldn't create image for: %s.\n", FLAGS_in[0]); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return kError; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap src; 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!image->asLegacyBitmap(&src, SkImage::kRW_LegacyBitmapMode)) { 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!FLAGS_quiet) { 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDebugf("Couldn't create bitmap for: %s.\n", FLAGS_in[0]); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return kError; 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap dst = sk_tool_utils::slow_blur(src, (float) FLAGS_sigma); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!sk_tool_utils::EncodeImageToFile(FLAGS_out[0], dst, SkEncodedImageFormat::kPNG, 100)) { 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!FLAGS_quiet) { 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDebugf("Couldn't write to file: %s\n", FLAGS_out[0]); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return kError; 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return kSuccess; 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 74