aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/mdbviz/Model.cpp
diff options
context:
space:
mode:
authorGravatar Robert Phillips <robertphillips@google.com>2017-09-06 13:07:21 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-09-06 20:46:01 +0000
commitdeaf568e07f0b63c84c5909f14e2b7261b1653ae (patch)
tree6c4e8023f34d2019772c22edff65fe9afb45949b /tools/mdbviz/Model.cpp
parent2880421c724e7b45ed13b784a36aa81a09fe62e5 (diff)
Solidify Model/View split
Change-Id: Iecf034feaa009002b5f09c47052c915d22aec0e4 Reviewed-on: https://skia-review.googlesource.com/43040 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Robert Phillips <robertphillips@google.com>
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;
+}