From 545a21a71419edcee015fbf7fecaded6bd1477c1 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Tue, 6 May 2014 19:45:18 +0000 Subject: 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 --- tools/dump_record.cpp | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 tools/dump_record.cpp (limited to 'tools/dump_record.cpp') 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 + +#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 + 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 + void printIndentedName(const T& command) { + for (int i = 0; i < fIndent; i++) { + putchar('\t'); + } + puts(NameOf(command)); + } + + template + 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 stream(SkStream::NewFromFile(FLAGS_skps[i])); + if (!stream) { + SkDebugf("Could not read %s.\n", FLAGS_skps[i]); + exit(1); + } + SkAutoTUnref 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 -- cgit v1.2.3