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 "experimental/skrive/include/SkRive.h"
9
10#include "experimental/skrive/src/reader/StreamReader.h"
11
12#include <tuple>
13
14namespace skrive {
15namespace internal {
16
17template <typename T>
18size_t parse_node(StreamReader*, T*);
19
20template <>
21size_t parse_node<Node>(StreamReader* sr, Node* node) {
22    const auto parent_id = parse_node<TransformableComponent>(sr, node);
23
24    node->setCollapsedVisibility(sr->readBool("isCollapsed"));
25
26    if (sr->openArray("clips")) {
27        const auto count = sr->readLength8();
28
29        SkDebugf(".. %d clips\n", count);
30
31        for (size_t i = 0; i < count; ++i) {
32            if (sr->openObject("clip")) {
33                /*const auto clip_id   =*/ sr->readUInt16("node");
34                /*const auto intersect =*/ sr->readBool("intersect");
35
36                // TODO: actually use clips
37                sr->closeObject();
38            }
39        }
40
41        sr->closeArray();
42    }
43
44    return parent_id;
45}
46
47}  // namespace internal
48
49void Node::addChild(sk_sp<Component> child) {
50    child->fParent = this;
51    fChildren.push_back(std::move(child));
52    this->invalidate();
53}
54
55void Node::onRevalidate() {
56    SkASSERT(this->hasInval());
57
58    for (const auto& child : fChildren) {
59        if (child) {
60            child->revalidate();
61        }
62    }
63}
64
65void Node::onRender(SkCanvas* canvas) const {
66    SkASSERT(!this->hasInval());
67
68    TransformableComponent::ScopedTransformContext stc(this, canvas);
69
70    // TODO: draw order?
71    for (const auto& child : this->children()) {
72        child->render(canvas);
73    }
74}
75
76
77}  // namespace skrive
78