blob: 0bc81c29348e4203ffcf2b7bd7022f4cf5c0fe7c [file] [log] [blame]
junova41d3c32014-10-30 11:44:19 -07001/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Florin Malitaab244f02017-05-03 19:16:58 +00008#include "SkBitmap.h"
junova41d3c32014-10-30 11:44:19 -07009#include "SkCanvas.h"
10#include "SkBBoxHierarchy.h"
11#include "SkPaint.h"
12#include "SkPicture.h"
13#include "SkPictureRecorder.h"
14
15#include "Test.h"
16
17class PictureBBHTestBase {
18public:
19 PictureBBHTestBase(int playbackWidth, int playbackHeight,
20 int recordWidth, int recordHeight) {
21
22 fResultBitmap.allocN32Pixels(playbackWidth, playbackHeight);
23 fPictureWidth = recordWidth;
24 fPictureHeight = recordHeight;
25 }
26
27 virtual ~PictureBBHTestBase() { }
28
29 virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0;
30
31 void run(skiatest::Reporter* reporter) {
32 // No BBH
halcanary96fcdcc2015-08-27 07:41:13 -070033 this->run(nullptr, reporter);
junova41d3c32014-10-30 11:44:19 -070034
junova41d3c32014-10-30 11:44:19 -070035 // With an R-Tree
36 SkRTreeFactory RTreeFactory;
37 this->run(&RTreeFactory, reporter);
38 }
39
40private:
41 void run(SkBBHFactory* factory, skiatest::Reporter* reporter) {
42 SkCanvas playbackCanvas(fResultBitmap);
43 playbackCanvas.clear(SK_ColorGREEN);
44 SkPictureRecorder recorder;
mtklein7cc1a342014-11-20 08:01:09 -080045 SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth),
46 SkIntToScalar(fPictureHeight),
47 factory);
junova41d3c32014-10-30 11:44:19 -070048 this->doTest(playbackCanvas, *recordCanvas);
reedca2622b2016-03-18 07:25:55 -070049 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
junova41d3c32014-10-30 11:44:19 -070050 playbackCanvas.drawPicture(picture);
51 REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0));
52 }
53
54 SkBitmap fResultBitmap;
55 int fPictureWidth, fPictureHeight;
56};
57
58// Test to verify the playback of an empty picture
mtklein49aabde2015-01-05 07:02:45 -080059//
junova41d3c32014-10-30 11:44:19 -070060class DrawEmptyPictureBBHTest : public PictureBBHTestBase {
61public:
62 DrawEmptyPictureBBHTest()
Brian Salomond3b65972017-03-22 12:05:03 -040063 : PictureBBHTestBase(2, 2, 1, 1) {}
64 ~DrawEmptyPictureBBHTest() override {}
junova41d3c32014-10-30 11:44:19 -070065
Brian Salomond3b65972017-03-22 12:05:03 -040066 void doTest(SkCanvas&, SkCanvas&) override {}
junova41d3c32014-10-30 11:44:19 -070067};
68
69// Test to verify the playback of a picture into a canvas that has
70// an empty clip.
71//
72class EmptyClipPictureBBHTest : public PictureBBHTestBase {
73public:
mtklein49aabde2015-01-05 07:02:45 -080074 EmptyClipPictureBBHTest()
Brian Salomond3b65972017-03-22 12:05:03 -040075 : PictureBBHTestBase(2, 2, 3, 3) {}
junova41d3c32014-10-30 11:44:19 -070076
mtklein36352bf2015-03-25 18:17:31 -070077 void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override {
junova41d3c32014-10-30 11:44:19 -070078 // intersect with out of bounds rect -> empty clip.
reed73603f32016-09-20 08:42:38 -070079 playbackCanvas.clipRect(SkRect::MakeXYWH(10, 10, 1, 1));
junova41d3c32014-10-30 11:44:19 -070080 SkPaint paint;
reed73603f32016-09-20 08:42:38 -070081 recordingCanvas.drawRect(SkRect::MakeWH(3, 3), paint);
junova41d3c32014-10-30 11:44:19 -070082 }
83
Brian Salomond3b65972017-03-22 12:05:03 -040084 ~EmptyClipPictureBBHTest() override {}
junova41d3c32014-10-30 11:44:19 -070085};
86
87DEF_TEST(PictureBBH, reporter) {
88
89 DrawEmptyPictureBBHTest emptyPictureTest;
90 emptyPictureTest.run(reporter);
91
92 EmptyClipPictureBBHTest emptyClipPictureTest;
93 emptyClipPictureTest.run(reporter);
94}
Mike Klein1dd161c2017-04-07 10:46:39 -040095
96DEF_TEST(RTreeMakeLargest, r) {
97 // A call to insert() with 2 or more rects and a bounds of SkRect::MakeLargest()
98 // used to fall into an infinite loop.
99
100 SkRTreeFactory factory;
101 std::unique_ptr<SkBBoxHierarchy> bbh{ factory(SkRect::MakeLargest()) };
102
103 SkRect rects[] = { {0,0, 10,10}, {5,5,15,15} };
104 bbh->insert(rects, SK_ARRAY_COUNT(rects));
105 REPORTER_ASSERT(r, bbh->getRootBound() == SkRect::MakeWH(15,15));
106}