1 /*
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
8 #include "SkCanvas.h"
9 #include "SkBBoxHierarchy.h"
10 #include "SkPaint.h"
11 #include "SkPicture.h"
12 #include "SkPictureRecorder.h"
13
14 #include "Test.h"
15
16 class PictureBBHTestBase {
17 public:
PictureBBHTestBase(int playbackWidth,int playbackHeight,int recordWidth,int recordHeight)18 PictureBBHTestBase(int playbackWidth, int playbackHeight,
19 int recordWidth, int recordHeight) {
20
21 fResultBitmap.allocN32Pixels(playbackWidth, playbackHeight);
22 fPictureWidth = recordWidth;
23 fPictureHeight = recordHeight;
24 }
25
~PictureBBHTestBase()26 virtual ~PictureBBHTestBase() { }
27
28 virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0;
29
run(skiatest::Reporter * reporter)30 void run(skiatest::Reporter* reporter) {
31 // No BBH
32 this->run(nullptr, reporter);
33
34 // With an R-Tree
35 SkRTreeFactory RTreeFactory;
36 this->run(&RTreeFactory, reporter);
37 }
38
39 private:
run(SkBBHFactory * factory,skiatest::Reporter * reporter)40 void run(SkBBHFactory* factory, skiatest::Reporter* reporter) {
41 SkCanvas playbackCanvas(fResultBitmap);
42 playbackCanvas.clear(SK_ColorGREEN);
43 SkPictureRecorder recorder;
44 SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth),
45 SkIntToScalar(fPictureHeight),
46 factory);
47 this->doTest(playbackCanvas, *recordCanvas);
48 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
49 playbackCanvas.drawPicture(picture);
50 REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0));
51 }
52
53 SkBitmap fResultBitmap;
54 int fPictureWidth, fPictureHeight;
55 };
56
57 // Test to verify the playback of an empty picture
58 //
59 class DrawEmptyPictureBBHTest : public PictureBBHTestBase {
60 public:
DrawEmptyPictureBBHTest()61 DrawEmptyPictureBBHTest()
62 : PictureBBHTestBase(2, 2, 1, 1) {}
~DrawEmptyPictureBBHTest()63 ~DrawEmptyPictureBBHTest() override {}
64
doTest(SkCanvas &,SkCanvas &)65 void doTest(SkCanvas&, SkCanvas&) override {}
66 };
67
68 // Test to verify the playback of a picture into a canvas that has
69 // an empty clip.
70 //
71 class EmptyClipPictureBBHTest : public PictureBBHTestBase {
72 public:
EmptyClipPictureBBHTest()73 EmptyClipPictureBBHTest()
74 : PictureBBHTestBase(2, 2, 3, 3) {}
75
doTest(SkCanvas & playbackCanvas,SkCanvas & recordingCanvas)76 void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override {
77 // intersect with out of bounds rect -> empty clip.
78 playbackCanvas.clipRect(SkRect::MakeXYWH(10, 10, 1, 1));
79 SkPaint paint;
80 recordingCanvas.drawRect(SkRect::MakeWH(3, 3), paint);
81 }
82
~EmptyClipPictureBBHTest()83 ~EmptyClipPictureBBHTest() override {}
84 };
85
DEF_TEST(PictureBBH,reporter)86 DEF_TEST(PictureBBH, reporter) {
87
88 DrawEmptyPictureBBHTest emptyPictureTest;
89 emptyPictureTest.run(reporter);
90
91 EmptyClipPictureBBHTest emptyClipPictureTest;
92 emptyClipPictureTest.run(reporter);
93 }
94