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>
This commit is contained in:
Mike Klein 2020-09-15 13:10:52 -05:00 committed by Skia Commit-Bot
parent 50dd7e15af
commit 3c685bf89f

View File

@ -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;