[fiddle] Add simple animation support.
authorJoe Gregorio <jcgregorio@google.com>
Wed, 19 Apr 2017 18:05:14 +0000 (14:05 -0400)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Wed, 19 Apr 2017 18:46:52 +0000 (18:46 +0000)
BUG=skia:

Change-Id: I6453afb1fe18e210d3c505b56777b8b19501ca2f
Reviewed-on: https://skia-review.googlesource.com/13810
Commit-Queue: Joe Gregorio <jcgregorio@google.com>
Reviewed-by: Hal Canary <halcanary@google.com>
BUILD.gn
tools/fiddle/animate.sh [new file with mode: 0755]
tools/fiddle/draw.cpp
tools/fiddle/fiddle_main.cpp
tools/fiddle/fiddle_main.h

index 85ae068..75a5d10 100644 (file)
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -778,7 +778,9 @@ if (skia_enable_tools) {
         "tools/fiddle/draw.cpp",
         "tools/fiddle/fiddle_main.cpp",
       ]
+      testonly = true
       deps = [
+        ":flags",
         ":skia",
         ":skia.h",
       ]
diff --git a/tools/fiddle/animate.sh b/tools/fiddle/animate.sh
new file mode 100755 (executable)
index 0000000..cbd62bb
--- /dev/null
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Copyright 2017 Google Inc.
+#
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Create a 3 second long animation from the Raster output of fiddle at 15 fps.
+FPS=15
+DURATION=3
+FRAMES=$((DURATION * FPS))
+mkdir -p /tmp/animation
+for i in $(seq -f "%05g" 0 $FRAMES)
+do
+    ./out/Release/fiddle --duration $DURATION --frame `bc -l <<< "$i/$FRAMES"` | ./tools/fiddle/parse-fiddle-output
+    cp /tmp/fiddle_Raster.png /tmp/animation/image-"$i".png
+done
+cd /tmp/animation; ffmpeg -r $FPS -pattern_type glob -i '*.png' -c:v libvpx-vp9 -lossless 1 output.webm
index 9eabd3b..8e94883 100644 (file)
@@ -19,7 +19,7 @@ void draw(SkCanvas* canvas) {
     canvas->clear(SK_ColorWHITE);
     SkMatrix matrix;
     matrix.setScale(0.75f, 0.75f);
-    matrix.preRotate(30.0f);
+    matrix.preRotate(frame * 30.0f * duration); // If an animation, rotate at 30 deg/s.
     SkPaint paint;
     paint.setShader(image->makeShader(SkShader::kRepeat_TileMode,
                                       SkShader::kRepeat_TileMode,
index 62289d2..2ce9beb 100644 (file)
 #include <sstream>
 #include <string>
 
+#include "SkCommandLineFlags.h"
+
 #include "fiddle_main.h"
 
+DEFINE_double(duration, 1.0, "The total duration, in seconds, of the animation we are drawing.");
+DEFINE_double(frame, 1.0, "A double value in [0, 1] that specifies the point in animation to draw.");
+
 // Globals externed in fiddle_main.h
 SkBitmap source;
 sk_sp<SkImage> image;
+double duration; // The total duration of the animation in seconds.
+double frame;    // A value in [0, 1] of where we are in the animation.
 
 // Global used by the local impl of SkDebugf.
 std::ostringstream gTextOutput;
@@ -111,7 +118,10 @@ static SkData* encode_snapshot(const sk_sp<SkSurface>& surface) {
 
 
 
-int main() {
+int main(int argc, char** argv) {
+    SkCommandLineFlags::Parse(argc, argv);
+    duration = FLAGS_duration;
+    frame = FLAGS_frame;
     DrawOptions options = GetDrawOptions();
     // If textOnly then only do one type of image, otherwise the text
     // output is duplicated for each type.
index 078c26c..7be317b 100644 (file)
@@ -22,6 +22,8 @@
 
 extern SkBitmap source;
 extern sk_sp<SkImage> image;
+extern double duration; // The total duration of the animation in seconds.
+extern double frame;    // A value in [0, 1] of where we are in the animation.
 
 struct DrawOptions {
     DrawOptions(int w, int h, bool r, bool g, bool p, bool k, bool srgb, bool f16, bool textOnly, const char* s)