8dad1ffd81
We can skip effect layers when none of the child nodes overlap (treat as atomic draws, with effects applied on their paint). The initial heuristic was simply checking for more than one child. This version relaxes the heuristic to check each child bounds against the union of preceding siblings. Change-Id: I2dc6d30d945697f410100db0c46a8a8377d5b569 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/269482 Commit-Queue: Florin Malita <fmalita@chromium.org> Reviewed-by: Mike Klein <mtklein@google.com>
56 lines
1.3 KiB
C++
56 lines
1.3 KiB
C++
/*
|
|
* Copyright 2017 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkSGGroup_DEFINED
|
|
#define SkSGGroup_DEFINED
|
|
|
|
#include "modules/sksg/include/SkSGRenderNode.h"
|
|
|
|
#include <vector>
|
|
|
|
namespace sksg {
|
|
|
|
/**
|
|
* Concrete node, grouping together multiple descendants.
|
|
*/
|
|
class Group : public RenderNode {
|
|
public:
|
|
static sk_sp<Group> Make() {
|
|
return sk_sp<Group>(new Group(std::vector<sk_sp<RenderNode>>()));
|
|
}
|
|
|
|
static sk_sp<Group> Make(std::vector<sk_sp<RenderNode>> children) {
|
|
return sk_sp<Group>(new Group(std::move(children)));
|
|
}
|
|
|
|
void addChild(sk_sp<RenderNode>);
|
|
void removeChild(const sk_sp<RenderNode>&);
|
|
|
|
size_t size() const { return fChildren.size(); }
|
|
bool empty() const { return fChildren.empty(); }
|
|
void clear();
|
|
|
|
protected:
|
|
explicit Group(std::vector<sk_sp<RenderNode>>);
|
|
~Group() override;
|
|
|
|
void onRender(SkCanvas*, const RenderContext*) const override;
|
|
const RenderNode* onNodeAt(const SkPoint&) const override;
|
|
|
|
SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
|
|
|
|
private:
|
|
std::vector<sk_sp<RenderNode>> fChildren;
|
|
bool fRequiresIsolation = true;
|
|
|
|
typedef RenderNode INHERITED;
|
|
};
|
|
|
|
} // namespace sksg
|
|
|
|
#endif // SkSGGroup_DEFINED
|