test clipRect sorting
This feels pretty awkward, but it's the most straightforward way I see
to do this without Yet Another Canvas Subclass.
Passes at head, fails without
https://skia-review.googlesource.com/c/skia/+/317110.
Change-Id: I67931b5eb8396621aec1858f2d7c4aaadb1b9132
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/317161
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/tests/CanvasTest.cpp b/tests/CanvasTest.cpp
index 5237954..18ee427 100644
--- a/tests/CanvasTest.cpp
+++ b/tests/CanvasTest.cpp
@@ -37,8 +37,10 @@
#include "include/private/SkTemplates.h"
#include "include/utils/SkNWayCanvas.h"
#include "include/utils/SkPaintFilterCanvas.h"
+#include "src/core/SkBigPicture.h"
#include "src/core/SkClipOpPriv.h"
#include "src/core/SkImageFilter_Base.h"
+#include "src/core/SkRecord.h"
#include "src/core/SkSpecialImage.h"
#include "src/utils/SkCanvasStack.h"
#include "tests/Test.h"
@@ -53,6 +55,42 @@
class SkReadBuffer;
+struct ClipRectVisitor {
+ skiatest::Reporter* r;
+
+ template <typename T>
+ SkRect operator()(const T&) {
+ REPORTER_ASSERT(r, false, "unexpected record");
+ return {1,1,0,0};
+ }
+
+ SkRect operator()(const SkRecords::ClipRect& op) {
+ return op.rect;
+ }
+};
+
+DEF_TEST(canvas_unsorted_clip, r) {
+ // Test that sorted and unsorted clip rects are forwarded
+ // to picture subclasses and/or devices sorted.
+ //
+ // We can't just test this with an SkCanvas on stack and
+ // SkCanvas::getLocalClipBounds(), as that only tests the raster device,
+ // which sorts these rects itself.
+ for (SkRect clip : {SkRect{0,0,5,5}, SkRect{5,5,0,0}}) {
+ SkPictureRecorder rec;
+ rec.beginRecording({0,0,10,10})
+ ->clipRect(clip);
+ sk_sp<SkPicture> pic = rec.finishRecordingAsPicture();
+
+ auto bp = (const SkBigPicture*)pic.get();
+ const SkRecord* record = bp->record();
+
+ REPORTER_ASSERT(r, record->count() == 1);
+ REPORTER_ASSERT(r, record->visit(0, ClipRectVisitor{r})
+ .isSorted());
+ }
+}
+
DEF_TEST(canvas_clipbounds, reporter) {
SkCanvas canvas(10, 10);
SkIRect irect, irect2;