[ngatoy] Strictly differentiate between painter's order and the sort/draw Zs

Bug: skia:11837
Change-Id: I038aee81e41201668f891df9d589459553b757b2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/417259
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/experimental/ngatoy/Cmds.cpp b/experimental/ngatoy/Cmds.cpp
index 34eabad..63588e2 100644
--- a/experimental/ngatoy/Cmds.cpp
+++ b/experimental/ngatoy/Cmds.cpp
@@ -13,7 +13,7 @@
 
 //------------------------------------------------------------------------------------------------
 RectCmd::RectCmd(ID id,
-                 uint32_t paintersOrder,
+                 PaintersOrder paintersOrder,
                  SkIRect r,
                  const FakePaint& p,
                  sk_sp<FakeMCBlob> state)
@@ -24,8 +24,16 @@
     , fMCState(std::move(state)) {
 }
 
+uint32_t RectCmd::getSortZ() const {
+    return fPaintersOrder.toUInt();
+}
+
+uint32_t RectCmd::getDrawZ() const {
+    return fPaintersOrder.toUInt();
+}
+
 SortKey RectCmd::getKey() {
-    return SortKey(fPaint.isTransparent(), fMCState->id(), fPaintersOrder, fPaint.toID());
+    return SortKey(fPaint.isTransparent(), fMCState->id(), this->getSortZ(), fPaint.toID());
 }
 
 static void apply_diff(FakeCanvas* c, const FakeMCBlob& desired, const FakeMCBlob* prior) {
@@ -99,7 +107,7 @@
 
 void RectCmd::rasterize(uint32_t zBuffer[256][256], SkBitmap* dstBM) const {
 
-    unsigned int z = fPaintersOrder;
+    uint32_t z = this->getDrawZ();
 
     for (int y = fRect.fTop; y < fRect.fBottom; ++y) {
         for (int x = fRect.fLeft; x < fRect.fRight; ++x) {
diff --git a/experimental/ngatoy/Cmds.h b/experimental/ngatoy/Cmds.h
index d14f15a..da5374b 100644
--- a/experimental/ngatoy/Cmds.h
+++ b/experimental/ngatoy/Cmds.h
@@ -44,7 +44,10 @@
 
 class RectCmd : public Cmd {
 public:
-    RectCmd(ID id, uint32_t paintersOrder, SkIRect, const FakePaint&, sk_sp<FakeMCBlob> state);
+    RectCmd(ID, PaintersOrder, SkIRect, const FakePaint&, sk_sp<FakeMCBlob> state);
+
+    uint32_t getSortZ() const;
+    uint32_t getDrawZ() const;
 
     SortKey getKey() override;
     const FakeMCBlob* state() const override { return fMCState.get(); }
@@ -57,13 +60,13 @@
         SkDebugf("%d: drawRect %d %d %d %d -- %d",
                  fID.toInt(),
                  fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom,
-                 fPaintersOrder);
+                 fPaintersOrder.toUInt());
     }
 
 protected:
 
 private:
-    uint32_t          fPaintersOrder;
+    PaintersOrder     fPaintersOrder;
     SkIRect           fRect;
     FakePaint         fPaint;
     sk_sp<FakeMCBlob> fMCState;
diff --git a/experimental/ngatoy/Fake.cpp b/experimental/ngatoy/Fake.cpp
index cc597e7..f3a8622 100644
--- a/experimental/ngatoy/Fake.cpp
+++ b/experimental/ngatoy/Fake.cpp
@@ -75,7 +75,7 @@
     fTracker.push();
 }
 
-void FakeDevice::drawRect(ID id, uint32_t paintersOrder, SkIRect r, FakePaint p) {
+void FakeDevice::drawRect(ID id, PaintersOrder paintersOrder, SkIRect r, FakePaint p) {
 
     sk_sp<FakeMCBlob> state = fTracker.snapState();
 
@@ -129,7 +129,7 @@
 void FakeCanvas::drawRect(ID id, SkIRect r, FakePaint p) {
     SkASSERT(!fFinalized);
 
-    fDeviceStack.back()->drawRect(id, this->nextZ(), r, p);
+    fDeviceStack.back()->drawRect(id, this->nextPaintersOrder(), r, p);
 }
 
 void FakeCanvas::clipRect(SkIRect r) {
diff --git a/experimental/ngatoy/Fake.h b/experimental/ngatoy/Fake.h
index 296e10a..98d66cf 100644
--- a/experimental/ngatoy/Fake.h
+++ b/experimental/ngatoy/Fake.h
@@ -255,7 +255,7 @@
     ~FakeDevice() {}
 
     void save();
-    void drawRect(ID id, uint32_t z, SkIRect, FakePaint);
+    void drawRect(ID, PaintersOrder, SkIRect, FakePaint);
     void clipRect(SkIRect r);
     void translate(SkIPoint trans) {
         fTracker.translate(trans);
@@ -298,7 +298,7 @@
         fDeviceStack.back()->save();
     }
 
-    void drawRect(ID id, SkIRect, FakePaint);
+    void drawRect(ID, SkIRect, FakePaint);
 
     void clipRect(SkIRect);
 
@@ -323,11 +323,14 @@
 protected:
 
 private:
-    uint32_t nextZ() {
-        return fNextZ++;
+    PaintersOrder nextPaintersOrder() {
+        return PaintersOrder(fNextPaintersOrder++);
+    }
+    PaintersOrder peekPaintersOrder() const {
+        return PaintersOrder(fNextPaintersOrder);
     }
 
-    int                                      fNextZ = 1;
+    uint32_t                                 fNextPaintersOrder = 1;
     bool                                     fFinalized = false;
     std::vector<std::unique_ptr<FakeDevice>> fDeviceStack;
 };
diff --git a/experimental/ngatoy/ngatoy.cpp b/experimental/ngatoy/ngatoy.cpp
index 3a8e6cb..08af545 100644
--- a/experimental/ngatoy/ngatoy.cpp
+++ b/experimental/ngatoy/ngatoy.cpp
@@ -17,8 +17,6 @@
 
 #include <algorithm>
 
-constexpr int kInvalidZ = 0;
-
 /*
  * Questions this is trying to answer:
  *   How to handle saveLayers (in w/ everything or separate)
@@ -283,8 +281,8 @@
     sk_sp<FakeMCBlob> state = s.snapState();
 
     SkIRect r{0, 0, 100, 100};
-    test->push_back(new RectCmd(ID(0), kInvalidZ, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),   state));
-    test->push_back(new RectCmd(ID(1), kInvalidZ, r.makeOffset(48, 48), FakePaint(SK_ColorGREEN), state));
+    test->push_back(new RectCmd(ID(0), {}, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),   state));
+    test->push_back(new RectCmd(ID(1), {}, r.makeOffset(48, 48), FakePaint(SK_ColorGREEN), state));
 
     return 1;
 }
@@ -301,9 +299,9 @@
     sk_sp<FakeMCBlob> state = s.snapState();
 
     SkIRect r{0, 0, 100, 100};
-    test->push_back(new RectCmd(ID(0), kInvalidZ, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),   state));
-    test->push_back(new RectCmd(ID(1), kInvalidZ, r.makeOffset(48, 48), FakePaint(SK_ColorGREEN), state));
-    test->push_back(new RectCmd(ID(2), kInvalidZ, r.makeOffset(98, 98), FakePaint(SK_ColorBLUE),  state));
+    test->push_back(new RectCmd(ID(0), {}, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),   state));
+    test->push_back(new RectCmd(ID(1), {}, r.makeOffset(48, 48), FakePaint(SK_ColorGREEN), state));
+    test->push_back(new RectCmd(ID(2), {}, r.makeOffset(98, 98), FakePaint(SK_ColorBLUE),  state));
     return 2;
 }
 
@@ -319,9 +317,9 @@
     sk_sp<FakeMCBlob> state = s.snapState();
 
     SkIRect r{0, 0, 100, 100};
-    test->push_back(new RectCmd(ID(0), kInvalidZ, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),  state));
-    test->push_back(new RectCmd(ID(1), kInvalidZ, r.makeOffset(48, 48), FakePaint(0x8000FF00),   state));
-    test->push_back(new RectCmd(ID(2), kInvalidZ, r.makeOffset(98, 98), FakePaint(SK_ColorBLUE), state));
+    test->push_back(new RectCmd(ID(0), {}, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),  state));
+    test->push_back(new RectCmd(ID(1), {}, r.makeOffset(48, 48), FakePaint(0x8000FF00),   state));
+    test->push_back(new RectCmd(ID(2), {}, r.makeOffset(98, 98), FakePaint(SK_ColorBLUE), state));
     return 3;
 }
 
@@ -338,9 +336,9 @@
     sk_sp<FakeMCBlob> state = s.snapState();
 
     SkIRect r{0, 0, 100, 100};
-    test->push_back(new RectCmd(ID(0), kInvalidZ, r.makeOffset(8, 8),   FakePaint(0x80FF0000), state));
-    test->push_back(new RectCmd(ID(1), kInvalidZ, r.makeOffset(48, 48), FakePaint(0x8000FF00), state));
-    test->push_back(new RectCmd(ID(2), kInvalidZ, r.makeOffset(98, 98), FakePaint(0x800000FF), state));
+    test->push_back(new RectCmd(ID(0), {}, r.makeOffset(8, 8),   FakePaint(0x80FF0000), state));
+    test->push_back(new RectCmd(ID(1), {}, r.makeOffset(48, 48), FakePaint(0x8000FF00), state));
+    test->push_back(new RectCmd(ID(2), {}, r.makeOffset(98, 98), FakePaint(0x800000FF), state));
     return 4;
 }
 
@@ -367,16 +365,16 @@
     FakePaint p;
 
     SkIRect r{0, 0, 100, 100};
-    test->push_back(new RectCmd(ID(0), kInvalidZ, r.makeOffset(8, 8),     FakePaint(SK_ColorRED),  state));
+    test->push_back(new RectCmd(ID(0), {}, r.makeOffset(8, 8),     FakePaint(SK_ColorRED),  state));
     p.setLinear(SK_ColorGREEN,   SK_ColorWHITE);
-    test->push_back(new RectCmd(ID(1), kInvalidZ, r.makeOffset(48, 48),   p,                       state));
+    test->push_back(new RectCmd(ID(1), {}, r.makeOffset(48, 48),   p,                       state));
     p.setRadial(SK_ColorBLUE,    SK_ColorBLACK);
-    test->push_back(new RectCmd(ID(2), kInvalidZ, r.makeOffset(98, 98),   p,                       state));
-    test->push_back(new RectCmd(ID(3), kInvalidZ, r.makeOffset(148, 148), FakePaint(SK_ColorCYAN), state));
+    test->push_back(new RectCmd(ID(2), {}, r.makeOffset(98, 98),   p,                       state));
+    test->push_back(new RectCmd(ID(3), {}, r.makeOffset(148, 148), FakePaint(SK_ColorCYAN), state));
     p.setLinear(SK_ColorMAGENTA, SK_ColorWHITE);
-    test->push_back(new RectCmd(ID(4), kInvalidZ, r.makeOffset(148, 8),   p,                       state));
+    test->push_back(new RectCmd(ID(4), {}, r.makeOffset(148, 8),   p,                       state));
     p.setRadial(SK_ColorYELLOW,  SK_ColorBLACK);
-    test->push_back(new RectCmd(ID(5), kInvalidZ, r.makeOffset(8, 148),   p,                       state));
+    test->push_back(new RectCmd(ID(5), {}, r.makeOffset(8, 148),   p,                       state));
     return 5;
 }
 
@@ -393,8 +391,8 @@
     sk_sp<FakeMCBlob> state = s.snapState();
 
     SkIRect r{0, 0, 100, 100};
-    test->push_back(new RectCmd(ID(0), kInvalidZ, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),   state));
-    test->push_back(new RectCmd(ID(1), kInvalidZ, r.makeOffset(48, 48), FakePaint(SK_ColorGREEN), state));
+    test->push_back(new RectCmd(ID(0), {}, r.makeOffset(8, 8),   FakePaint(SK_ColorRED),   state));
+    test->push_back(new RectCmd(ID(1), {}, r.makeOffset(48, 48), FakePaint(SK_ColorGREEN), state));
 
     return 6;
 }
@@ -417,21 +415,21 @@
     sk_sp<FakeMCBlob> state = s.snapState();
 
     SkIRect r{0, 0, 100, 100};
-    test->push_back(new RectCmd(ID(0), kInvalidZ, r.makeOffset(8, 8),     FakePaint(SK_ColorRED),     state));
-    test->push_back(new RectCmd(ID(1), kInvalidZ, r.makeOffset(48, 48),   FakePaint(SK_ColorGREEN),   state));
+    test->push_back(new RectCmd(ID(0), {}, r.makeOffset(8, 8),     FakePaint(SK_ColorRED),     state));
+    test->push_back(new RectCmd(ID(1), {}, r.makeOffset(48, 48),   FakePaint(SK_ColorGREEN),   state));
 
     s.push();
     s.clipRect(SkIRect::MakeXYWH(0, 85, 256, 86));  // intersect w/ the middle third in y
     state = s.snapState();
 
-    test->push_back(new RectCmd(ID(2), kInvalidZ, r.makeOffset(98, 98),   FakePaint(SK_ColorBLUE),    state));
-    test->push_back(new RectCmd(ID(3), kInvalidZ, r.makeOffset(148, 148), FakePaint(SK_ColorCYAN),    state));
+    test->push_back(new RectCmd(ID(2), {}, r.makeOffset(98, 98),   FakePaint(SK_ColorBLUE),    state));
+    test->push_back(new RectCmd(ID(3), {}, r.makeOffset(148, 148), FakePaint(SK_ColorCYAN),    state));
 
     s.pop();
     state = s.snapState();
 
-    test->push_back(new RectCmd(ID(4), kInvalidZ, r.makeOffset(148, 8),   FakePaint(SK_ColorMAGENTA), state));
-    test->push_back(new RectCmd(ID(5), kInvalidZ, r.makeOffset(8, 148),   FakePaint(SK_ColorYELLOW),  state));
+    test->push_back(new RectCmd(ID(4), {}, r.makeOffset(148, 8),   FakePaint(SK_ColorMAGENTA), state));
+    test->push_back(new RectCmd(ID(5), {}, r.makeOffset(8, 148),   FakePaint(SK_ColorYELLOW),  state));
 
     return 7;
 }
diff --git a/experimental/ngatoy/ngatypes.h b/experimental/ngatoy/ngatypes.h
index bc1c22c..0011c0c 100644
--- a/experimental/ngatoy/ngatypes.h
+++ b/experimental/ngatoy/ngatypes.h
@@ -30,6 +30,27 @@
     int fID;
 };
 
+// This class just serves to strictly differentiate between painter's order and the sort/draw Zs
+class PaintersOrder {
+public:
+    PaintersOrder() : fPaintersOrder(0) {}
+
+    explicit PaintersOrder(uint32_t paintersOrder) : fPaintersOrder(paintersOrder) {
+        SkASSERT(paintersOrder != 0);
+    }
+
+    static PaintersOrder Invalid() {
+        return PaintersOrder();
+    }
+
+    bool isValid() const { return fPaintersOrder != 0; }
+
+    uint32_t toUInt() const { return fPaintersOrder; }
+
+private:
+    uint32_t fPaintersOrder = 0;
+};
+
 #endif