aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2015-07-08 10:06:01 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-07-08 10:06:01 -0700
commit60c047557559e5410063452e59d65377e813e5f2 (patch)
tree1b2ed7dda6db8edac349e3cac21586658915d11e /tools
parentb2456053c7e20e5439915cd2954c71f73bc85375 (diff)
Add tools/flatten to flatten nested pictures in .skps.
Tested by running on skps/sp_desk_nytimes.skp. The output .skp had no nested draw picture calls, and the files were both 9.3M. BUG=skia: Review URL: https://codereview.chromium.org/1221303020
Diffstat (limited to 'tools')
-rw-r--r--tools/flatten.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/tools/flatten.cpp b/tools/flatten.cpp
new file mode 100644
index 0000000000..832bd1426d
--- /dev/null
+++ b/tools/flatten.cpp
@@ -0,0 +1,49 @@
+/*
+ * 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 "SkData.h"
+#include "SkForceLinking.h"
+#include "SkImageGenerator.h"
+#include "SkPicture.h"
+#include "SkPictureRecorder.h"
+#include "SkStream.h"
+#include <stdio.h>
+
+__SK_FORCE_IMAGE_DECODER_LINKING;
+
+#define ASSERTF(cond, fmt, ...) if (!(cond)) { fprintf(stderr, fmt"\n", __VA_ARGS__); exit(1); }
+
+static bool lazy_decode_bitmap(const void* src, size_t size, SkBitmap* dst) {
+ SkAutoTUnref<SkData> encoded(SkData::NewWithCopy(src, size));
+ return encoded && SkInstallDiscardablePixelRef(encoded, dst);
+}
+
+int main(int argc, char** argv) {
+ ASSERTF(argc == 3, "usage: %s nested.skp flat.skp", argv[0]);
+ const char *nestedPath = argv[1],
+ *flatPath = argv[2];
+
+ // Read nested.skp.
+ SkFILEStream stream(nestedPath);
+ ASSERTF(stream.isValid(), "Couldn't read %s.", nestedPath);
+ SkAutoTUnref<const SkPicture> nested(SkPicture::CreateFromStream(&stream, &lazy_decode_bitmap));
+ ASSERTF(nested, "Couldn't parse %s as a picture.", nestedPath);
+
+ // Play it back into a new picture using kPlaybackDrawPicture_RecordFlag.
+ SkPictureRecorder recorder;
+ uint32_t flags = SkPictureRecorder::kPlaybackDrawPicture_RecordFlag;
+ nested->playback(recorder.beginRecording(nested->cullRect(), nullptr, flags));
+ SkAutoTUnref<const SkPicture> flat(recorder.endRecordingAsPicture());
+
+ // Write out that flat.skp
+ SkFILEWStream wstream(flatPath);
+ ASSERTF(wstream.isValid(), "Could not open %s.", flatPath);
+ flat->serialize(&wstream);
+ wstream.flush();
+
+ return 0;
+}