xref: /aosp_15_r20/external/skia/tests/PictureBBHTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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