[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