Reland [svg] Add svg_tool

A simple svg -> png converter, to demonstrate basic API usage.

TBR=

Change-Id: Id723946e2c1cbdaf324a24202279cb6a6d7082b6
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/325460
Reviewed-by: Florin Malita <fmalita@google.com>
Commit-Queue: Florin Malita <fmalita@google.com>
diff --git a/experimental/svg/utils/SvgTool.cpp b/experimental/svg/utils/SvgTool.cpp
new file mode 100644
index 0000000..34236f6
--- /dev/null
+++ b/experimental/svg/utils/SvgTool.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2020 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <iostream>
+
+#include "experimental/svg/model/SkSVGDOM.h"
+#include "include/core/SkMatrix.h"
+#include "include/core/SkStream.h"
+#include "include/core/SkSurface.h"
+#include "include/encode/SkPngEncoder.h"
+#include "tools/flags/CommandLineFlags.h"
+
+static DEFINE_string2(input , i, nullptr, "Input SVG file.");
+static DEFINE_string2(output, o, nullptr, "Output PNG file.");
+
+static DEFINE_int(width , 1024, "Output width.");
+static DEFINE_int(height, 1024, "Output height.");
+
+int main(int argc, char** argv) {
+    CommandLineFlags::Parse(argc, argv);
+
+    if (FLAGS_input.isEmpty() || FLAGS_output.isEmpty()) {
+        std::cerr << "Missing required 'input' and 'output' args.\n";
+        return 1;
+    }
+
+    if (FLAGS_width <= 0 || FLAGS_height <= 0) {
+        std::cerr << "Invalid width/height.\n";
+        return 1;
+    }
+
+    SkFILEStream in(FLAGS_input[0]);
+    if (!in.isValid()) {
+        std::cerr << "Could not open " << FLAGS_input[0] << "\n";
+        return 1;
+    }
+
+    auto svg_dom = SkSVGDOM::MakeFromStream(in);
+    if (!svg_dom) {
+        std::cerr << "Could not parse " << FLAGS_input[0] << "\n";
+        return 1;
+    }
+
+    auto surface = SkSurface::MakeRasterN32Premul(FLAGS_width, FLAGS_height);
+
+    svg_dom->setContainerSize(SkSize::Make(FLAGS_width, FLAGS_height));
+    svg_dom->render(surface->getCanvas());
+
+    SkPixmap pixmap;
+    surface->peekPixels(&pixmap);
+
+    SkFILEWStream out(FLAGS_output[0]);
+    if (!out.isValid()) {
+        std::cerr << "Could not open " << FLAGS_output[0] << " for writing.\n";
+        return 1;
+    }
+
+    // Use default encoding options.
+    SkPngEncoder::Options png_options;
+
+    if (!SkPngEncoder::Encode(&out, pixmap, png_options)) {
+        std::cerr << "PNG encoding failed.\n";
+        return 1;
+    }
+
+    return 0;
+}