diff options
author | junov <junov@chromium.org> | 2014-10-30 11:44:19 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-30 11:44:20 -0700 |
commit | a41d3c33bc4e335dd4702bb9915fdf31d31d6c24 (patch) | |
tree | 6e868fb5bfdeffccd91b26bdc6ee9d8bbca6c8a3 /tests/PictureBBHTest.cpp | |
parent | 225a627ccb15f41efa40750f4244283ef7e8fbf0 (diff) |
Make RTree handle the case where the playback canvas has empty clip bounds
BUG=skia:3074
Review URL: https://codereview.chromium.org/678303004
Diffstat (limited to 'tests/PictureBBHTest.cpp')
-rw-r--r-- | tests/PictureBBHTest.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/PictureBBHTest.cpp b/tests/PictureBBHTest.cpp new file mode 100644 index 0000000000..3ff5625686 --- /dev/null +++ b/tests/PictureBBHTest.cpp @@ -0,0 +1,101 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkCanvas.h" +#include "SkBBoxHierarchy.h" +#include "SkPaint.h" +#include "SkPicture.h" +#include "SkPictureRecorder.h" + +#include "Test.h" + +class PictureBBHTestBase { +public: + PictureBBHTestBase(int playbackWidth, int playbackHeight, + int recordWidth, int recordHeight) { + + fResultBitmap.allocN32Pixels(playbackWidth, playbackHeight); + fPictureWidth = recordWidth; + fPictureHeight = recordHeight; + } + + virtual ~PictureBBHTestBase() { } + + virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0; + + void run(skiatest::Reporter* reporter) { + // No BBH + this->run(NULL, reporter); + + // With a Tile Grid + SkTileGridFactory::TileGridInfo gridInfo; + gridInfo.fMargin.setEmpty(); + gridInfo.fOffset.setZero(); + gridInfo.fTileInterval.set(1, 1); + SkTileGridFactory gridFactory(gridInfo); + this->run(&gridFactory, reporter); + + // With an R-Tree + SkRTreeFactory RTreeFactory; + this->run(&RTreeFactory, reporter); + } + +private: + void run(SkBBHFactory* factory, skiatest::Reporter* reporter) { + SkCanvas playbackCanvas(fResultBitmap); + playbackCanvas.clear(SK_ColorGREEN); + SkPictureRecorder recorder; + SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth), SkIntToScalar(fPictureHeight), factory); + this->doTest(playbackCanvas, *recordCanvas); + SkAutoTUnref<SkPicture> picture(recorder.endRecording()); + playbackCanvas.drawPicture(picture); + REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0)); + } + + SkBitmap fResultBitmap; + int fPictureWidth, fPictureHeight; +}; + +// Test to verify the playback of an empty picture +// +class DrawEmptyPictureBBHTest : public PictureBBHTestBase { +public: + DrawEmptyPictureBBHTest() + : PictureBBHTestBase(2, 2, 1, 1) { } + virtual ~DrawEmptyPictureBBHTest() { } + + virtual void doTest(SkCanvas&, SkCanvas&) SK_OVERRIDE { } +}; + +// Test to verify the playback of a picture into a canvas that has +// an empty clip. +// +class EmptyClipPictureBBHTest : public PictureBBHTestBase { +public: + EmptyClipPictureBBHTest() + : PictureBBHTestBase(2, 2, 3, 3) { } + + virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) SK_OVERRIDE { + // intersect with out of bounds rect -> empty clip. + playbackCanvas.clipRect(SkRect::MakeXYWH(SkIntToScalar(10), SkIntToScalar(10), + SkIntToScalar(1), SkIntToScalar(1)), SkRegion::kIntersect_Op); + SkPaint paint; + recordingCanvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), + SkIntToScalar(3), SkIntToScalar(3)), paint); + } + + virtual ~EmptyClipPictureBBHTest() { } +}; + +DEF_TEST(PictureBBH, reporter) { + + DrawEmptyPictureBBHTest emptyPictureTest; + emptyPictureTest.run(reporter); + + EmptyClipPictureBBHTest emptyClipPictureTest; + emptyClipPictureTest.run(reporter); +} |