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