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