| Index: tools/DumpRecord.cpp
|
| diff --git a/tools/DumpRecord.cpp b/tools/DumpRecord.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2376fb9cf08b5d6edb1663d9b7e2456d8b89c752
|
| --- /dev/null
|
| +++ b/tools/DumpRecord.cpp
|
| @@ -0,0 +1,113 @@
|
| +/*
|
| + * 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 "SkRecord.h"
|
| +#include "SkRecordDraw.h"
|
| +
|
| +#include "BenchTimer.h"
|
| +#include "DumpRecord.h"
|
| +
|
| +namespace {
|
| +
|
| +class Dumper {
|
| +public:
|
| + explicit Dumper(SkCanvas* canvas, int count, bool timeWithCommand)
|
| + : fDigits(0)
|
| + , fIndent(0)
|
| + , fDraw(canvas)
|
| + , fTimeWithCommand(timeWithCommand) {
|
| + while (count > 0) {
|
| + count /= 10;
|
| + fDigits++;
|
| + }
|
| + }
|
| +
|
| + unsigned index() const { return fDraw.index(); }
|
| + void next() { fDraw.next(); }
|
| +
|
| + template <typename T>
|
| + void operator()(const T& command) {
|
| + BenchTimer timer;
|
| + timer.start();
|
| + fDraw(command);
|
| + timer.end();
|
| +
|
| + this->print(command, timer.fCpu);
|
| + }
|
| +
|
| + void operator()(const SkRecords::NoOp&) {
|
| + // Move on without printing anything.
|
| + }
|
| +
|
| + template <typename T>
|
| + void print(const T& command, double time) {
|
| + this->printNameAndTime(command, time);
|
| + }
|
| +
|
| + void print(const SkRecords::Restore& command, double time) {
|
| + --fIndent;
|
| + this->printNameAndTime(command, time);
|
| + }
|
| +
|
| + void print(const SkRecords::Save& command, double time) {
|
| + this->printNameAndTime(command, time);
|
| + ++fIndent;
|
| + }
|
| +
|
| + void print(const SkRecords::SaveLayer& command, double time) {
|
| + this->printNameAndTime(command, time);
|
| + ++fIndent;
|
| + }
|
| +
|
| +private:
|
| + template <typename T>
|
| + void printNameAndTime(const T& command, double time) {
|
| + if (!fTimeWithCommand) {
|
| + printf("%6.1f ", time * 1000);
|
| + }
|
| + printf("%*d ", fDigits, fDraw.index());
|
| + for (int i = 0; i < fIndent; i++) {
|
| + putchar('\t');
|
| + }
|
| + if (fTimeWithCommand) {
|
| + printf("%6.1f ", time * 1000);
|
| + }
|
| + 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
|
| + SkDEBUGFAIL("Unknown T");
|
| + return "Unknown T";
|
| + }
|
| +
|
| + static const char* NameOf(const SkRecords::SaveLayer&) {
|
| + return "\x1b[31;1mSaveLayer\x1b[0m"; // Bold red.
|
| + }
|
| +
|
| + int fDigits;
|
| + int fIndent;
|
| + SkRecords::Draw fDraw;
|
| + const bool fTimeWithCommand;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +void DumpRecord(const SkRecord& record,
|
| + SkCanvas* canvas,
|
| + bool timeWithCommand) {
|
| + for (Dumper dumper(canvas, record.count(), timeWithCommand);
|
| + dumper.index() < record.count();
|
| + dumper.next()) {
|
| + record.visit<void>(dumper.index(), dumper);
|
| + }
|
| +}
|
|
|