[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