diff options
author | Robert Phillips <robertphillips@google.com> | 2017-09-06 13:07:21 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-09-06 20:46:01 +0000 |
commit | deaf568e07f0b63c84c5909f14e2b7261b1653ae (patch) | |
tree | 6c4e8023f34d2019772c22edff65fe9afb45949b /tools/mdbviz/Model.cpp | |
parent | 2880421c724e7b45ed13b784a36aa81a09fe62e5 (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.cpp | 100 |
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; +} |