aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/mdbviz/Model.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/mdbviz/Model.cpp')
-rw-r--r--tools/mdbviz/Model.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/tools/mdbviz/Model.cpp b/tools/mdbviz/Model.cpp
new file mode 100644
index 0000000000..a3f8e1ae87
--- /dev/null
+++ b/tools/mdbviz/Model.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <memory>
+
+#include "Model.h"
+
+#include "SkBitmap.h"
+#include "SkCanvas.h"
+#include "SkDebugCanvas.h"
+#include "SkPicture.h"
+#include "SkStream.h"
+
+Model::Model() : fCurOp(0) {
+ SkImageInfo ii = SkImageInfo::MakeN32Premul(1024, 1024);
+ fBM.allocPixels(ii, 0);
+}
+
+Model::~Model() {
+ this->resetOpList();
+}
+
+Model::ErrorCode Model::load(const char* filename) {
+ std::unique_ptr<SkStream> stream = SkStream::MakeFromFile(filename);
+ if (!stream) {
+ return ErrorCode::kCouldntOpenFile;
+ }
+ sk_sp<SkPicture> pic(SkPicture::MakeFromStream(stream.get()));
+ if (!pic) {
+ return ErrorCode::kCouldntDecodeSKP;
+ }
+
+ {
+ std::unique_ptr<SkDebugCanvas> temp(new SkDebugCanvas(
+ SkScalarCeilToInt(pic->cullRect().width()),
+ SkScalarCeilToInt(pic->cullRect().height())));
+
+ temp->setPicture(pic.get());
+ pic->playback(temp.get());
+ temp->setPicture(nullptr);
+ this->resetOpList();
+ temp->detachCommands(&fOps);
+ }
+
+ this->setCurOp(fOps.count()-1);
+
+ return ErrorCode::kOK;
+}
+
+const char* Model::ErrorString(ErrorCode err) {
+ static const char* kStrings[] = {
+ "OK",
+ "Couldn't read file",
+ "Couldn't decode picture"
+ };
+
+ return kStrings[(int)err];
+}
+
+const char* Model::getOpName(int index) {
+ return SkDrawCommand::GetCommandString(fOps[index]->getType());
+}
+
+void Model::setCurOp(int curOp) {
+ SkASSERT(curOp < fOps.count());
+
+ if (curOp == fCurOp) {
+ return; // the render state is already up to date
+ }
+
+ fCurOp = curOp;
+ this->drawTo(fCurOp);
+}
+
+void Model::drawTo(int index) {
+ SkASSERT(index < fOps.count());
+
+ SkCanvas canvas(fBM);
+
+ int saveCount = canvas.save();
+
+ for (int i = 0; i <= index; ++i) {
+ if (fOps[i]->isVisible()) {
+ fOps[i]->execute(&canvas);
+ }
+ }
+
+ canvas.restoreToCount(saveCount);
+}
+
+void Model::resetOpList() {
+ for (int i = 0; i < fOps.count(); ++i) {
+ delete fOps[i];
+ }
+ fCurOp = 0;
+}