blob: 562d9b59913026fc66e41c0e92b63b862085819b [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
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
16class PictureBBHTestBase {
17public:
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
26 virtual ~PictureBBHTestBase() { }
27
28 virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0;
29
30 void run(skiatest::Reporter* reporter) {
31 // No BBH
32 this->run(NULL, reporter);
33
34 // With a Tile Grid
35 SkTileGridFactory::TileGridInfo gridInfo;
36 gridInfo.fMargin.setEmpty();
37 gridInfo.fOffset.setZero();
38 gridInfo.fTileInterval.set(1, 1);
39 SkTileGridFactory gridFactory(gridInfo);
40 this->run(&gridFactory, reporter);
41
42 // With an R-Tree
43 SkRTreeFactory RTreeFactory;
44 this->run(&RTreeFactory, reporter);
45 }
46
47private:
48 void run(SkBBHFactory* factory, skiatest::Reporter* reporter) {
49 SkCanvas playbackCanvas(fResultBitmap);
50 playbackCanvas.clear(SK_ColorGREEN);
51 SkPictureRecorder recorder;
mtklein7cc1a342014-11-20 08:01:09 -080052 SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth),
53 SkIntToScalar(fPictureHeight),
54 factory);
junova41d3c32014-10-30 11:44:19 -070055 this->doTest(playbackCanvas, *recordCanvas);
56 SkAutoTUnref<SkPicture> picture(recorder.endRecording());
57 playbackCanvas.drawPicture(picture);
58 REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0));
59 }
60
61 SkBitmap fResultBitmap;
62 int fPictureWidth, fPictureHeight;
63};
64
65// Test to verify the playback of an empty picture
66//
67class DrawEmptyPictureBBHTest : public PictureBBHTestBase {
68public:
69 DrawEmptyPictureBBHTest()
70 : PictureBBHTestBase(2, 2, 1, 1) { }
71 virtual ~DrawEmptyPictureBBHTest() { }
72
73 virtual void doTest(SkCanvas&, SkCanvas&) SK_OVERRIDE { }
74};
75
76// Test to verify the playback of a picture into a canvas that has
77// an empty clip.
78//
79class EmptyClipPictureBBHTest : public PictureBBHTestBase {
80public:
81 EmptyClipPictureBBHTest()
82 : PictureBBHTestBase(2, 2, 3, 3) { }
83
84 virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) SK_OVERRIDE {
85 // intersect with out of bounds rect -> empty clip.
86 playbackCanvas.clipRect(SkRect::MakeXYWH(SkIntToScalar(10), SkIntToScalar(10),
87 SkIntToScalar(1), SkIntToScalar(1)), SkRegion::kIntersect_Op);
88 SkPaint paint;
89 recordingCanvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0),
90 SkIntToScalar(3), SkIntToScalar(3)), paint);
91 }
92
93 virtual ~EmptyClipPictureBBHTest() { }
94};
95
96DEF_TEST(PictureBBH, reporter) {
97
98 DrawEmptyPictureBBHTest emptyPictureTest;
99 emptyPictureTest.run(reporter);
100
101 EmptyClipPictureBBHTest emptyClipPictureTest;
102 emptyClipPictureTest.run(reporter);
103}
mtklein7cc1a342014-11-20 08:01:09 -0800104
105static void test_clear(skiatest::Reporter* r, SkBBHFactory* factory) {
106 // SkPicture should always call clear()s on the target canvas, even if its clip is empty.
107 SkPictureRecorder src, dst;
108
109 // A picture that's just clear().
110 src.beginRecording(1,1, factory)
111 ->clear(SK_ColorGREEN);
reed90d0ff02014-11-24 12:02:31 -0800112 SkAutoTUnref<SkPicture> srcPic(src.endRecording());
mtklein7cc1a342014-11-20 08:01:09 -0800113
114 // A target canvas with an empty clip.
115 SkCanvas* c = dst.beginRecording(1,1, NULL);
116 c->clipRect(SkRect::MakeEmpty());
117 srcPic->playback(c);
reed90d0ff02014-11-24 12:02:31 -0800118 SkAutoTUnref<SkPicture> dstPic(dst.endRecording());
mtklein7cc1a342014-11-20 08:01:09 -0800119
120 // Should be Clip - Save - Clear - Restore.
121 // Buggy implementations might return 1 (just Clip) or 3 (Clip - Save - Restore).
reed2ff1fce2014-12-11 07:07:37 -0800122 // TODO: can we just search that it contains "clear"? <reed>
123 REPORTER_ASSERT(r, dstPic->approximateOpCount() == 4 || dstPic->approximateOpCount() == 2);
mtklein7cc1a342014-11-20 08:01:09 -0800124}
125
126DEF_TEST(PictureBBH_Clear, r) {
127 test_clear(r, NULL);
128
129 SkTileGridFactory::TileGridInfo grid = { {1,1}, {0,0}, {0,0} };
130 SkTileGridFactory tilegrid(grid);
131 test_clear(r, &tilegrid);
132
133 SkRTreeFactory rtree;
134 test_clear(r, &rtree);
135}