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#include "include/core/SkPaint.h" 12cb93a386Sopenharmony_ci 13cb93a386Sopenharmony_cinamespace skrive { 14cb93a386Sopenharmony_cinamespace internal { 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_citemplate <typename T> 17cb93a386Sopenharmony_cisize_t parse_node(StreamReader*, T*); 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_citemplate <> 20cb93a386Sopenharmony_cisize_t parse_node<Shape>(StreamReader* sr, Shape* node) { 21cb93a386Sopenharmony_ci const auto parent_id = parse_node<Drawable>(sr, node); 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci node->setTransformAffectsStroke(sr->readBool("transformAffectsStroke")); 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci return parent_id; 26cb93a386Sopenharmony_ci} 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ci} // namespace internal 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_civoid Shape::onRevalidate() { 31cb93a386Sopenharmony_ci this->INHERITED::onRevalidate(); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci fFills.clear(); 34cb93a386Sopenharmony_ci fStrokes.clear(); 35cb93a386Sopenharmony_ci fGeometries.clear(); 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci for (const auto& child : this->children()) { 38cb93a386Sopenharmony_ci if (const Paint* paint = *child) { 39cb93a386Sopenharmony_ci SkASSERT(paint->style() == SkPaint::kFill_Style || 40cb93a386Sopenharmony_ci paint->style() == SkPaint::kStroke_Style); 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci auto& bucket = paint->style() == SkPaint::kFill_Style ? fFills : fStrokes; 43cb93a386Sopenharmony_ci bucket.push_back(paint); 44cb93a386Sopenharmony_ci } else if (const Geometry* geo = *child) { 45cb93a386Sopenharmony_ci fGeometries.push_back(geo); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci SkDebugf("[Shape::onRevalidate] %zu geos %zu fill(s) %zu stroke(s)\n", 50cb93a386Sopenharmony_ci fGeometries.size(), fFills.size(), fStrokes.size()); 51cb93a386Sopenharmony_ci} 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_civoid Shape::onRender(SkCanvas* canvas) const { 54cb93a386Sopenharmony_ci auto draw_paint = [this](SkCanvas* canvas, const Paint* paint) { 55cb93a386Sopenharmony_ci SkPaint p; 56cb93a386Sopenharmony_ci paint->apply(&p); 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci for (const auto& geo : fGeometries) { 59cb93a386Sopenharmony_ci geo->draw(canvas, p, paint->getFillRule()); 60cb93a386Sopenharmony_ci } 61cb93a386Sopenharmony_ci }; 62cb93a386Sopenharmony_ci 63cb93a386Sopenharmony_ci TransformableComponent::ScopedTransformContext stc(this, canvas); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci for (const auto* fill : fFills) { 66cb93a386Sopenharmony_ci draw_paint(canvas, fill); 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci for (const auto* stroke : fStrokes) { 69cb93a386Sopenharmony_ci draw_paint(canvas, stroke); 70cb93a386Sopenharmony_ci } 71cb93a386Sopenharmony_ci} 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci} // namespace skrive 74