blob: e08fef3c5632ddee26e2eeb3a274eb9881a049dc [file] [log] [blame]
/*
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/core/SkMarkerStack.h"
void SkMarkerStack::setMarker(uint32_t id, const SkM44& mx, void* boundary) {
// We compute and cache the inverse here. Most clients are only interested in that, and we'll
// be fetching matrices from this far more often than we insert them.
SkM44 inv;
SkAssertResult(mx.invert(&inv));
// Look if we've already seen id in this save-frame.
// If so, replace, else append
for (auto it = fStack.rbegin(); it != fStack.rend(); ++it) {
if (it->fBoundary != boundary) { // we've gone past the save-frame
break; // fall out so we append
}
if (it->fID == id) { // in current frame, so replace
it->fMatrix = mx;
it->fMatrixInverse = inv;
return;
}
}
// if we get here, we should append a new marker
fStack.push_back({boundary, mx, inv, id});
}
bool SkMarkerStack::findMarker(uint32_t id, SkM44* mx) const {
// search from top to bottom, so we find the most recent id
for (auto it = fStack.rbegin(); it != fStack.rend(); ++it) {
if (it->fID == id) {
if (mx) {
*mx = it->fMatrix;
}
return true;
}
}
return false;
}
bool SkMarkerStack::findMarkerInverse(uint32_t id, SkM44* mx) const {
// search from top to bottom, so we find the most recent id
for (auto it = fStack.rbegin(); it != fStack.rend(); ++it) {
if (it->fID == id) {
if (mx) {
*mx = it->fMatrixInverse;
}
return true;
}
}
return false;
}
void SkMarkerStack::restore(void* boundary) {
while (!fStack.empty() && fStack.back().fBoundary == boundary) {
fStack.pop_back();
}
}