diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-06 19:45:18 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-05-06 19:45:18 +0000 |
commit | 545a21a71419edcee015fbf7fecaded6bd1477c1 (patch) | |
tree | a38de9a0f6283e2ad60f9a6df915fbbbd14d6135 /tools | |
parent | 105775b82341d7c86986b3fb03698d4e471bc3ab (diff) |
Add dump_record to make inspecting before/after SkRecordOptimize easy.
E.g.
dump_record -r http___groupcloned_com_test_plain_list_animation_simple_html_layer_109.skp
0 Save
1 DrawRect
2 DrawRect
3 DrawRect
4 DrawRect
5 Save
6 ClipRect
7 Restore
8 Save
9 ClipRect
10 Restore
11 Restore
dump_record -O -r http___groupcloned_com_test_plain_list_animation_simple_html_layer_109.skp
0 Save
1 DrawRect
2 DrawRect
3 DrawRect
4 DrawRect
5 NoOp
6 NoOp
7 NoOp
8 NoOp
9 NoOp
10 NoOp
11 Restore
(Reitveld sadly eats my kickass indentation.)
BUG=skia:2378
R=fmalita@chromium.org, mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/265983007
git-svn-id: http://skia.googlecode.com/svn/trunk@14596 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tools')
-rw-r--r-- | tools/dump_record.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/tools/dump_record.cpp b/tools/dump_record.cpp new file mode 100644 index 0000000000..4abf77a4d4 --- /dev/null +++ b/tools/dump_record.cpp @@ -0,0 +1,129 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <stdio.h> + +#include "LazyDecodeBitmap.h" +#include "SkCommandLineFlags.h" +#include "SkGraphics.h" +#include "SkOSFile.h" +#include "SkPicture.h" +#include "SkRecord.h" +#include "SkRecordOpts.h" +#include "SkRecorder.h" +#include "SkStream.h" + +DEFINE_string2(skps, r, "", ".SKPs to dump."); +DEFINE_string(match, "", "The usual filters on file names to dump."); +DEFINE_bool2(optimize, O, false, "Run SkRecordOptimize before dumping."); + +class Dumper { +public: + Dumper() : fIndent(0) {} + + template <typename T> + void operator()(const T& command) { + this->printIndentedName(command); + } + + void operator()(const SkRecords::Restore& command) { + --fIndent; + this->printIndentedName(command); + } + + void operator()(const SkRecords::Save& command) { + this->printIndentedName(command); + ++fIndent; + } + + void operator()(const SkRecords::SaveLayer& command) { + this->printIndentedName(command); + ++fIndent; + } + +private: + template <typename T> + void printIndentedName(const T& command) { + for (int i = 0; i < fIndent; i++) { + putchar('\t'); + } + puts(NameOf(command)); + } + + template <typename T> + static const char* NameOf(const T&) { + #define CASE(U) case SkRecords::U##_Type: return #U; + switch(T::kType) { SK_RECORD_TYPES(CASE); } + #undef CASE + } + + static const char* NameOf(const SkRecords::SaveLayer&) { + return "\x1b[31;1mSaveLayer\x1b[0m"; // Bold red. + } + + int fIndent; +}; + + +static void dump(const char* name, const SkRecord& record) { + Dumper dumper; + + unsigned count = record.count(); + int digits = 0; + while (count > 0) { + count /= 10; + digits++; + } + + printf("%s %s\n", FLAGS_optimize ? "optimized" : "not-optimized", name); + for (unsigned i = 0; i < record.count(); i++) { + printf("%*d ", digits, i); + record.visit(i, dumper); + } +} + +int tool_main(int argc, char** argv); +int tool_main(int argc, char** argv) { + SkCommandLineFlags::Parse(argc, argv); + SkAutoGraphics ag; + + for (int i = 0; i < FLAGS_skps.count(); i++) { + if (SkCommandLineFlags::ShouldSkip(FLAGS_match, FLAGS_skps[i])) { + continue; + } + + SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(FLAGS_skps[i])); + if (!stream) { + SkDebugf("Could not read %s.\n", FLAGS_skps[i]); + exit(1); + } + SkAutoTUnref<SkPicture> src( + SkPicture::CreateFromStream(stream, sk_tools::LazyDecodeBitmap)); + if (!src) { + SkDebugf("Could not read %s as an SkPicture.\n", FLAGS_skps[i]); + exit(1); + } + + SkRecord record; + SkRecorder canvas(SkRecorder::kWriteOnly_Mode, &record, src->width(), src->height()); + src->draw(&canvas); + + if (FLAGS_optimize) { + SkRecordOptimize(&record); + } + + dump(FLAGS_skps[i], record); + } + + return 0; +} + +#if !defined SK_BUILD_FOR_IOS +int main(int argc, char * const argv[]) { + return tool_main(argc, (char**) argv); +} +#endif |