Florin Malita | 4aa4441 | 2017-12-19 12:21:02 -0500 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2017 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 "SkSGGroup.h" |
| 9 | |
| 10 | namespace sksg { |
| 11 | |
| 12 | Group::Group() {} |
| 13 | |
| 14 | Group::~Group() { |
| 15 | for (const auto& child : fChildren) { |
| 16 | child->removeInvalReceiver(this); |
| 17 | } |
| 18 | } |
| 19 | |
| 20 | void Group::addChild(sk_sp<RenderNode> node) { |
| 21 | // should we allow duplicates? |
| 22 | for (const auto& child : fChildren) { |
| 23 | if (child == node) { |
| 24 | return; |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | node->addInvalReceiver(this); |
| 29 | fChildren.push_back(std::move(node)); |
Florin Malita | c75e240 | 2018-01-03 16:17:29 -0500 | [diff] [blame] | 30 | |
Florin Malita | c14f144 | 2018-01-05 11:32:31 -0500 | [diff] [blame^] | 31 | this->invalidate(); |
Florin Malita | 4aa4441 | 2017-12-19 12:21:02 -0500 | [diff] [blame] | 32 | } |
| 33 | |
| 34 | void Group::removeChild(const sk_sp<RenderNode>& node) { |
| 35 | int origCount = fChildren.count(); |
| 36 | for (int i = 0; i < origCount; ++i) { |
| 37 | if (fChildren[i] == node) { |
| 38 | fChildren.removeShuffle(i); |
| 39 | node->removeInvalReceiver(this); |
| 40 | break; |
| 41 | } |
| 42 | } |
| 43 | SkASSERT(fChildren.count() == origCount - 1); |
Florin Malita | c75e240 | 2018-01-03 16:17:29 -0500 | [diff] [blame] | 44 | |
Florin Malita | c14f144 | 2018-01-05 11:32:31 -0500 | [diff] [blame^] | 45 | this->invalidate(); |
Florin Malita | 4aa4441 | 2017-12-19 12:21:02 -0500 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | void Group::onRender(SkCanvas* canvas) const { |
| 49 | for (const auto& child : fChildren) { |
| 50 | child->render(canvas); |
| 51 | } |
| 52 | } |
| 53 | |
Florin Malita | c14f144 | 2018-01-05 11:32:31 -0500 | [diff] [blame^] | 54 | SkRect Group::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) { |
Florin Malita | c75e240 | 2018-01-03 16:17:29 -0500 | [diff] [blame] | 55 | SkASSERT(this->hasInval()); |
| 56 | |
Florin Malita | c14f144 | 2018-01-05 11:32:31 -0500 | [diff] [blame^] | 57 | SkRect bounds = SkRect::MakeEmpty(); |
Florin Malita | c75e240 | 2018-01-03 16:17:29 -0500 | [diff] [blame] | 58 | |
Florin Malita | 4aa4441 | 2017-12-19 12:21:02 -0500 | [diff] [blame] | 59 | for (const auto& child : fChildren) { |
Florin Malita | c14f144 | 2018-01-05 11:32:31 -0500 | [diff] [blame^] | 60 | bounds.join(child->revalidate(ic, ctm)); |
Florin Malita | 4aa4441 | 2017-12-19 12:21:02 -0500 | [diff] [blame] | 61 | } |
Florin Malita | c75e240 | 2018-01-03 16:17:29 -0500 | [diff] [blame] | 62 | |
Florin Malita | c14f144 | 2018-01-05 11:32:31 -0500 | [diff] [blame^] | 63 | return bounds; |
Florin Malita | 4aa4441 | 2017-12-19 12:21:02 -0500 | [diff] [blame] | 64 | } |
| 65 | |
| 66 | } // namespace sksg |