1/*
2* Copyright 2020 Google Inc.
3*
4* Use of this source code is governed by a BSD-style license that can be
5* found in the LICENSE file.
6*/
7
8#include "src/core/SkMarkerStack.h"
9
10void SkMarkerStack::setMarker(uint32_t id, const SkM44& mx, void* boundary) {
11 // We compute and cache the inverse here. Most clients are only interested in that, and we'll
12 // be fetching matrices from this far more often than we insert them.
13 SkM44 inv;
14 SkAssertResult(mx.invert(&inv));
15
16 // Look if we've already seen id in this save-frame.
17 // If so, replace, else append
18 for (auto it = fStack.rbegin(); it != fStack.rend(); ++it) {
19 if (it->fBoundary != boundary) { // we've gone past the save-frame
20 break; // fall out so we append
21 }
22 if (it->fID == id) { // in current frame, so replace
23 it->fMatrix = mx;
24 it->fMatrixInverse = inv;
25 return;
26 }
27 }
28 // if we get here, we should append a new marker
29 fStack.push_back({boundary, mx, inv, id});
30}
31
32bool SkMarkerStack::findMarker(uint32_t id, SkM44* mx) const {
33 // search from top to bottom, so we find the most recent id
34 for (auto it = fStack.rbegin(); it != fStack.rend(); ++it) {
35 if (it->fID == id) {
36 if (mx) {
37 *mx = it->fMatrix;
38 }
39 return true;
40 }
41 }
42 return false;
43}
44
45bool SkMarkerStack::findMarkerInverse(uint32_t id, SkM44* mx) const {
46 // search from top to bottom, so we find the most recent id
47 for (auto it = fStack.rbegin(); it != fStack.rend(); ++it) {
48 if (it->fID == id) {
49 if (mx) {
50 *mx = it->fMatrixInverse;
51 }
52 return true;
53 }
54 }
55 return false;
56}
57
58void SkMarkerStack::restore(void* boundary) {
59 while (!fStack.empty() && fStack.back().fBoundary == boundary) {
60 fStack.pop_back();
61 }
62}
63