[sksg] More inval fixes
Backpedal on node/reval-time-determined damage: nodes cannot control
the invalidation order, and shared descendants may be revalidated before
a particular ancestor gets to query their state - thus making any
decisions based on that invalid.
Instead, apply damage suppression at invalidation time, based on node
type/traits. Node types which don't generate direct damage are marked
as such, and the invalidation logic bubbles damage past them, until it
finds a valid damage receiver.
Nodes which currently suppress damage:
- PaintNode (and subclasses)
- GeometryNode (and subclasses)
- Matrix
TBR=
Change-Id: I843e683e64cb6253d8c26d8397c44d02a7d6026f
Reviewed-on: https://skia-review.googlesource.com/91421
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/experimental/sksg/SkSGPaintNode.cpp b/experimental/sksg/SkSGPaintNode.cpp
index be8edac..146d248 100644
--- a/experimental/sksg/SkSGPaintNode.cpp
+++ b/experimental/sksg/SkSGPaintNode.cpp
@@ -9,7 +9,8 @@
namespace sksg {
-PaintNode::PaintNode() {}
+// Paint nodes don't generate damage on their own, but via their aggregation ancestor Draw nodes.
+PaintNode::PaintNode() : INHERITED(kBubbleDamage_Trait) {}
const SkPaint& PaintNode::makePaint() {
SkASSERT(!this->hasInval());
@@ -17,23 +18,20 @@
return fPaint;
}
-Node::RevalidationResult PaintNode::onRevalidate(InvalidationController*, const SkMatrix&) {
+SkRect PaintNode::onRevalidate(InvalidationController*, const SkMatrix&) {
SkASSERT(this->hasInval());
- if (this->hasSelfInval()) {
- fPaint.reset();
- fPaint.setAntiAlias(fAntiAlias);
- fPaint.setStyle(fStyle);
- fPaint.setStrokeWidth(fStrokeWidth);
- fPaint.setStrokeMiter(fStrokeMiter);
- fPaint.setStrokeJoin(fStrokeJoin);
- fPaint.setStrokeCap(fStrokeCap);
+ fPaint.reset();
+ fPaint.setAntiAlias(fAntiAlias);
+ fPaint.setStyle(fStyle);
+ fPaint.setStrokeWidth(fStrokeWidth);
+ fPaint.setStrokeMiter(fStrokeMiter);
+ fPaint.setStrokeJoin(fStrokeJoin);
+ fPaint.setStrokeCap(fStrokeCap);
- this->onApplyToPaint(&fPaint);
- }
+ this->onApplyToPaint(&fPaint);
- // Paints have no bounds and don't contribute to damage.
- return { SkRect::MakeEmpty(), Damage::kBlockSelf };
+ return SkRect::MakeEmpty();
}
} // namespace sksg