15TEST(
RTree, searchNonOverlappingDrawnRectsNoIntersection) {
17 auto recorder = std::make_unique<SkPictureRecorder>();
18 auto recording_canvas =
19 recorder->beginRecording(SkRect::MakeIWH(1000, 1000), &rtree_factory);
21 auto rect_paint = SkPaint();
22 rect_paint.setColor(SkColors::kCyan);
23 rect_paint.setStyle(SkPaint::Style::kFill_Style);
27 recording_canvas->drawRect(SkRect::MakeLTRB(20, 20, 40, 40), rect_paint);
28 recorder->finishRecordingAsPicture();
30 auto hits = rtree_factory.getInstance()->searchNonOverlappingDrawnRects(
31 SkRect::MakeLTRB(40, 40, 80, 80));
32 ASSERT_TRUE(hits.empty());
35TEST(
RTree, searchNonOverlappingDrawnRectsSingleRectIntersection) {
37 auto recorder = std::make_unique<SkPictureRecorder>();
38 auto recording_canvas =
39 recorder->beginRecording(SkRect::MakeIWH(1000, 1000), &rtree_factory);
41 auto rect_paint = SkPaint();
42 rect_paint.setColor(SkColors::kCyan);
43 rect_paint.setStyle(SkPaint::Style::kFill_Style);
47 recording_canvas->drawRect(SkRect::MakeLTRB(120, 120, 160, 160), rect_paint);
49 recorder->finishRecordingAsPicture();
51 auto hits = rtree_factory.getInstance()->searchNonOverlappingDrawnRects(
52 SkRect::MakeLTRB(140, 140, 150, 150));
53 ASSERT_EQ(1UL, hits.size());
54 ASSERT_EQ(*hits.begin(), SkRect::MakeLTRB(120, 120, 160, 160));
57TEST(
RTree, searchNonOverlappingDrawnRectsIgnoresNonDrawingRecords) {
59 auto recorder = std::make_unique<SkPictureRecorder>();
60 auto recording_canvas =
61 recorder->beginRecording(SkRect::MakeIWH(1000, 1000), &rtree_factory);
63 auto rect_paint = SkPaint();
64 rect_paint.setColor(SkColors::kCyan);
65 rect_paint.setStyle(SkPaint::Style::kFill_Style);
68 recording_canvas->translate(100, 100);
70 recording_canvas->clipRect(SkRect::MakeLTRB(40, 40, 50, 50),
71 SkClipOp::kIntersect);
72 recording_canvas->drawRect(SkRect::MakeLTRB(20, 20, 80, 80), rect_paint);
74 recorder->finishRecordingAsPicture();
77 ASSERT_EQ(3, rtree_factory.getInstance()->getCount());
79 auto hits = rtree_factory.getInstance()->searchNonOverlappingDrawnRects(
80 SkRect::MakeLTRB(0, 0, 1000, 1000));
81 ASSERT_EQ(1UL, hits.size());
82 ASSERT_EQ(*hits.begin(), SkRect::MakeLTRB(120, 120, 180, 180));
85TEST(
RTree, searchNonOverlappingDrawnRectsMultipleRectIntersection) {
87 auto recorder = std::make_unique<SkPictureRecorder>();
88 auto recording_canvas =
89 recorder->beginRecording(SkRect::MakeIWH(1000, 1000), &rtree_factory);
91 auto rect_paint = SkPaint();
92 rect_paint.setColor(SkColors::kCyan);
93 rect_paint.setStyle(SkPaint::Style::kFill_Style);
103 recording_canvas->drawRect(SkRect::MakeLTRB(100, 100, 200, 200), rect_paint);
105 recording_canvas->drawRect(SkRect::MakeLTRB(300, 100, 400, 200), rect_paint);
107 recorder->finishRecordingAsPicture();
109 auto hits = rtree_factory.getInstance()->searchNonOverlappingDrawnRects(
110 SkRect::MakeLTRB(0, 0, 1000, 1050));
111 ASSERT_EQ(2UL, hits.size());
112 ASSERT_EQ(*hits.begin(), SkRect::MakeLTRB(100, 100, 200, 200));
113 ASSERT_EQ(*std::next(hits.begin(), 1), SkRect::MakeLTRB(300, 100, 400, 200));
116TEST(
RTree, searchNonOverlappingDrawnRectsJoinRectsWhenIntersectedCase1) {
118 auto recorder = std::make_unique<SkPictureRecorder>();
119 auto recording_canvas =
120 recorder->beginRecording(SkRect::MakeIWH(1000, 1000), &rtree_factory);
122 auto rect_paint = SkPaint();
123 rect_paint.setColor(SkColors::kCyan);
124 rect_paint.setStyle(SkPaint::Style::kFill_Style);
138 recording_canvas->drawRect(SkRect::MakeLTRB(100, 100, 150, 150), rect_paint);
140 recording_canvas->drawRect(SkRect::MakeLTRB(125, 125, 175, 175), rect_paint);
142 recorder->finishRecordingAsPicture();
144 auto hits = rtree_factory.getInstance()->searchNonOverlappingDrawnRects(
145 SkRect::MakeXYWH(120, 120, 126, 126));
146 ASSERT_EQ(3UL, hits.size());
147 ASSERT_EQ(*hits.begin(), SkRect::MakeLTRB(100, 100, 150, 125));
148 ASSERT_EQ(*std::next(hits.begin(), 1), SkRect::MakeLTRB(100, 125, 175, 150));
149 ASSERT_EQ(*std::next(hits.begin(), 2), SkRect::MakeLTRB(125, 150, 175, 175));
152TEST(
RTree, searchNonOverlappingDrawnRectsJoinRectsWhenIntersectedCase2) {
154 auto recorder = std::make_unique<SkPictureRecorder>();
155 auto recording_canvas =
156 recorder->beginRecording(SkRect::MakeIWH(1000, 1000), &rtree_factory);
158 auto rect_paint = SkPaint();
159 rect_paint.setColor(SkColors::kCyan);
160 rect_paint.setStyle(SkPaint::Style::kFill_Style);
177 recording_canvas->drawRect(SkRect::MakeLTRB(100, 100, 200, 200), rect_paint);
179 recording_canvas->drawRect(SkRect::MakeLTRB(300, 100, 400, 200), rect_paint);
181 recording_canvas->drawRect(SkRect::MakeLTRB(50, 50, 500, 250), rect_paint);
183 recording_canvas->drawRect(SkRect::MakeLTRB(280, 100, 280, 320), rect_paint);
185 recorder->finishRecordingAsPicture();
187 auto hits = rtree_factory.getInstance()->searchNonOverlappingDrawnRects(
188 SkRect::MakeLTRB(30, 30, 550, 270));
189 ASSERT_EQ(1UL, hits.size());
190 ASSERT_EQ(*hits.begin(), SkRect::MakeLTRB(50, 50, 500, 250));
193TEST(
RTree, searchNonOverlappingDrawnRectsJoinRectsWhenIntersectedCase3) {
195 auto recorder = std::make_unique<SkPictureRecorder>();
196 auto recording_canvas =
197 recorder->beginRecording(SkRect::MakeIWH(1000, 1000), &rtree_factory);
199 auto rect_paint = SkPaint();
200 rect_paint.setColor(SkColors::kCyan);
201 rect_paint.setStyle(SkPaint::Style::kFill_Style);
219 recording_canvas->drawRect(SkRect::MakeLTRB(100, 100, 200, 200), rect_paint);
221 recording_canvas->drawRect(SkRect::MakeLTRB(300, 100, 400, 200), rect_paint);
223 recording_canvas->drawRect(SkRect::MakeLTRB(500, 100, 600, 300), rect_paint);
225 recording_canvas->drawRect(SkRect::MakeLTRB(50, 50, 620, 250), rect_paint);
227 recording_canvas->drawRect(SkRect::MakeLTRB(280, 100, 280, 320), rect_paint);
229 recorder->finishRecordingAsPicture();
231 auto hits = rtree_factory.getInstance()->searchNonOverlappingDrawnRects(
232 SkRect::MakeLTRB(30, 30, 550, 270));
233 ASSERT_EQ(2UL, hits.size());
234 ASSERT_EQ(*hits.begin(), SkRect::MakeLTRB(50, 50, 620, 250));
235 ASSERT_EQ(*std::next(hits.begin(), 1), SkRect::MakeLTRB(500, 250, 600, 300));