1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBBHFactory.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPicture.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPictureRecorder.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker class PictureBBHTestBase {
21*c8dee2aaSAndroid Build Coastguard Worker public:
PictureBBHTestBase(int playbackWidth,int playbackHeight,int recordWidth,int recordHeight)22*c8dee2aaSAndroid Build Coastguard Worker PictureBBHTestBase(int playbackWidth, int playbackHeight,
23*c8dee2aaSAndroid Build Coastguard Worker int recordWidth, int recordHeight) {
24*c8dee2aaSAndroid Build Coastguard Worker
25*c8dee2aaSAndroid Build Coastguard Worker fResultBitmap.allocN32Pixels(playbackWidth, playbackHeight);
26*c8dee2aaSAndroid Build Coastguard Worker fPictureWidth = recordWidth;
27*c8dee2aaSAndroid Build Coastguard Worker fPictureHeight = recordHeight;
28*c8dee2aaSAndroid Build Coastguard Worker }
29*c8dee2aaSAndroid Build Coastguard Worker
~PictureBBHTestBase()30*c8dee2aaSAndroid Build Coastguard Worker virtual ~PictureBBHTestBase() { }
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0;
33*c8dee2aaSAndroid Build Coastguard Worker
run(skiatest::Reporter * reporter)34*c8dee2aaSAndroid Build Coastguard Worker void run(skiatest::Reporter* reporter) {
35*c8dee2aaSAndroid Build Coastguard Worker // No BBH
36*c8dee2aaSAndroid Build Coastguard Worker this->run(nullptr, reporter);
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker // With an R-Tree
39*c8dee2aaSAndroid Build Coastguard Worker SkRTreeFactory RTreeFactory;
40*c8dee2aaSAndroid Build Coastguard Worker this->run(&RTreeFactory, reporter);
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker private:
run(SkBBHFactory * factory,skiatest::Reporter * reporter)44*c8dee2aaSAndroid Build Coastguard Worker void run(SkBBHFactory* factory, skiatest::Reporter* reporter) {
45*c8dee2aaSAndroid Build Coastguard Worker SkCanvas playbackCanvas(fResultBitmap);
46*c8dee2aaSAndroid Build Coastguard Worker playbackCanvas.clear(SK_ColorGREEN);
47*c8dee2aaSAndroid Build Coastguard Worker SkPictureRecorder recorder;
48*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth),
49*c8dee2aaSAndroid Build Coastguard Worker SkIntToScalar(fPictureHeight),
50*c8dee2aaSAndroid Build Coastguard Worker factory);
51*c8dee2aaSAndroid Build Coastguard Worker this->doTest(playbackCanvas, *recordCanvas);
52*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
53*c8dee2aaSAndroid Build Coastguard Worker playbackCanvas.drawPicture(picture);
54*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0));
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker
57*c8dee2aaSAndroid Build Coastguard Worker SkBitmap fResultBitmap;
58*c8dee2aaSAndroid Build Coastguard Worker int fPictureWidth, fPictureHeight;
59*c8dee2aaSAndroid Build Coastguard Worker };
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker // Test to verify the playback of an empty picture
62*c8dee2aaSAndroid Build Coastguard Worker //
63*c8dee2aaSAndroid Build Coastguard Worker class DrawEmptyPictureBBHTest : public PictureBBHTestBase {
64*c8dee2aaSAndroid Build Coastguard Worker public:
DrawEmptyPictureBBHTest()65*c8dee2aaSAndroid Build Coastguard Worker DrawEmptyPictureBBHTest()
66*c8dee2aaSAndroid Build Coastguard Worker : PictureBBHTestBase(2, 2, 1, 1) {}
~DrawEmptyPictureBBHTest()67*c8dee2aaSAndroid Build Coastguard Worker ~DrawEmptyPictureBBHTest() override {}
68*c8dee2aaSAndroid Build Coastguard Worker
doTest(SkCanvas &,SkCanvas &)69*c8dee2aaSAndroid Build Coastguard Worker void doTest(SkCanvas&, SkCanvas&) override {}
70*c8dee2aaSAndroid Build Coastguard Worker };
71*c8dee2aaSAndroid Build Coastguard Worker
72*c8dee2aaSAndroid Build Coastguard Worker // Test to verify the playback of a picture into a canvas that has
73*c8dee2aaSAndroid Build Coastguard Worker // an empty clip.
74*c8dee2aaSAndroid Build Coastguard Worker //
75*c8dee2aaSAndroid Build Coastguard Worker class EmptyClipPictureBBHTest : public PictureBBHTestBase {
76*c8dee2aaSAndroid Build Coastguard Worker public:
EmptyClipPictureBBHTest()77*c8dee2aaSAndroid Build Coastguard Worker EmptyClipPictureBBHTest()
78*c8dee2aaSAndroid Build Coastguard Worker : PictureBBHTestBase(2, 2, 3, 3) {}
79*c8dee2aaSAndroid Build Coastguard Worker
doTest(SkCanvas & playbackCanvas,SkCanvas & recordingCanvas)80*c8dee2aaSAndroid Build Coastguard Worker void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override {
81*c8dee2aaSAndroid Build Coastguard Worker // intersect with out of bounds rect -> empty clip.
82*c8dee2aaSAndroid Build Coastguard Worker playbackCanvas.clipRect(SkRect::MakeXYWH(10, 10, 1, 1));
83*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint;
84*c8dee2aaSAndroid Build Coastguard Worker recordingCanvas.drawRect(SkRect::MakeWH(3, 3), paint);
85*c8dee2aaSAndroid Build Coastguard Worker }
86*c8dee2aaSAndroid Build Coastguard Worker
~EmptyClipPictureBBHTest()87*c8dee2aaSAndroid Build Coastguard Worker ~EmptyClipPictureBBHTest() override {}
88*c8dee2aaSAndroid Build Coastguard Worker };
89*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(PictureBBH,reporter)90*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(PictureBBH, reporter) {
91*c8dee2aaSAndroid Build Coastguard Worker
92*c8dee2aaSAndroid Build Coastguard Worker DrawEmptyPictureBBHTest emptyPictureTest;
93*c8dee2aaSAndroid Build Coastguard Worker emptyPictureTest.run(reporter);
94*c8dee2aaSAndroid Build Coastguard Worker
95*c8dee2aaSAndroid Build Coastguard Worker EmptyClipPictureBBHTest emptyClipPictureTest;
96*c8dee2aaSAndroid Build Coastguard Worker emptyClipPictureTest.run(reporter);
97*c8dee2aaSAndroid Build Coastguard Worker }
98*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(PictureNegativeSpace,r)99*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(PictureNegativeSpace, r) {
100*c8dee2aaSAndroid Build Coastguard Worker SkRTreeFactory factory;
101*c8dee2aaSAndroid Build Coastguard Worker SkPictureRecorder recorder;
102*c8dee2aaSAndroid Build Coastguard Worker
103*c8dee2aaSAndroid Build Coastguard Worker SkRect cull = {-200,-200,+200,+200};
104*c8dee2aaSAndroid Build Coastguard Worker
105*c8dee2aaSAndroid Build Coastguard Worker {
106*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkBBoxHierarchy> bbh = factory();
107*c8dee2aaSAndroid Build Coastguard Worker auto canvas = recorder.beginRecording(cull, bbh);
108*c8dee2aaSAndroid Build Coastguard Worker canvas->save();
109*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(cull);
110*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
111*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
112*c8dee2aaSAndroid Build Coastguard Worker canvas->restore();
113*c8dee2aaSAndroid Build Coastguard Worker auto pic = recorder.finishRecordingAsPicture();
114*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, pic->approximateOpCount() == 5);
115*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, pic->cullRect() == (SkRect{-20,-20,-10,-10}));
116*c8dee2aaSAndroid Build Coastguard Worker }
117*c8dee2aaSAndroid Build Coastguard Worker
118*c8dee2aaSAndroid Build Coastguard Worker {
119*c8dee2aaSAndroid Build Coastguard Worker auto canvas = recorder.beginRecording(cull, &factory);
120*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(cull);
121*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
122*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
123*c8dee2aaSAndroid Build Coastguard Worker auto pic = recorder.finishRecordingAsPicture();
124*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, pic->approximateOpCount() == 3);
125*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, pic->cullRect() == (SkRect{-20,-20,-10,-10}));
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker }
128