PictureBBHTest.cpp revision ab244f045a0740fa6106ed21a4e5824cd09f84f3
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 "SkBitmap.h"
9#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
33        this->run(nullptr, reporter);
34
35        // 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;
45        SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth),
46                                                         SkIntToScalar(fPictureHeight),
47                                                         factory);
48        this->doTest(playbackCanvas, *recordCanvas);
49        sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
50        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
59//
60class DrawEmptyPictureBBHTest : public PictureBBHTestBase {
61public:
62    DrawEmptyPictureBBHTest()
63        : PictureBBHTestBase(2, 2, 1, 1) {}
64    ~DrawEmptyPictureBBHTest() override {}
65
66    void doTest(SkCanvas&, SkCanvas&) override {}
67};
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:
74    EmptyClipPictureBBHTest()
75        : PictureBBHTestBase(2, 2, 3, 3) {}
76
77    void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override {
78        // intersect with out of bounds rect -> empty clip.
79        playbackCanvas.clipRect(SkRect::MakeXYWH(10, 10, 1, 1));
80        SkPaint paint;
81        recordingCanvas.drawRect(SkRect::MakeWH(3, 3), paint);
82    }
83
84    ~EmptyClipPictureBBHTest() override {}
85};
86
87DEF_TEST(PictureBBH, reporter) {
88
89    DrawEmptyPictureBBHTest emptyPictureTest;
90    emptyPictureTest.run(reporter);
91
92    EmptyClipPictureBBHTest emptyClipPictureTest;
93    emptyClipPictureTest.run(reporter);
94}
95
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}
107