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