1a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov/* 2a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov * Copyright 2014 Google Inc. 3a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov * 4a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov * Use of this source code is governed by a BSD-style license that can be 5a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov * found in the LICENSE file. 6a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov */ 7a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 8a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov#include "SkCanvas.h" 9a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov#include "SkBBoxHierarchy.h" 10a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov#include "SkPaint.h" 11a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov#include "SkPicture.h" 12a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov#include "SkPictureRecorder.h" 13a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 14a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov#include "Test.h" 15a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 16a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovclass PictureBBHTestBase { 17a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovpublic: 18a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov PictureBBHTestBase(int playbackWidth, int playbackHeight, 19a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov int recordWidth, int recordHeight) { 20a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 21a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov fResultBitmap.allocN32Pixels(playbackWidth, playbackHeight); 22a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov fPictureWidth = recordWidth; 23a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov fPictureHeight = recordHeight; 24a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov } 25a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 26a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov virtual ~PictureBBHTestBase() { } 27a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 28a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0; 29a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 30a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov void run(skiatest::Reporter* reporter) { 31a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov // No BBH 32a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov this->run(NULL, reporter); 33a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 34a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov // With an R-Tree 35a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkRTreeFactory RTreeFactory; 36a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov this->run(&RTreeFactory, reporter); 37a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov } 38a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 39a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovprivate: 40a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov void run(SkBBHFactory* factory, skiatest::Reporter* reporter) { 41a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkCanvas playbackCanvas(fResultBitmap); 42a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov playbackCanvas.clear(SK_ColorGREEN); 43a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkPictureRecorder recorder; 447cc1a34fbf5506e3a9e6834f0dcd988aa7c94084mtklein SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth), 457cc1a34fbf5506e3a9e6834f0dcd988aa7c94084mtklein SkIntToScalar(fPictureHeight), 467cc1a34fbf5506e3a9e6834f0dcd988aa7c94084mtklein factory); 47a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov this->doTest(playbackCanvas, *recordCanvas); 48a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 49a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov playbackCanvas.drawPicture(picture); 50a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0)); 51a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov } 52a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 53a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkBitmap fResultBitmap; 54a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov int fPictureWidth, fPictureHeight; 55a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov}; 56a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 57a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov// Test to verify the playback of an empty picture 5849aabde6ef80e39f00a2d00487cf5a881987dd81mtklein// 59a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovclass DrawEmptyPictureBBHTest : public PictureBBHTestBase { 60a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovpublic: 61a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov DrawEmptyPictureBBHTest() 62a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov : PictureBBHTestBase(2, 2, 1, 1) { } 63a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov virtual ~DrawEmptyPictureBBHTest() { } 64a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 6536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void doTest(SkCanvas&, SkCanvas&) override { } 66a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov}; 67a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 68a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov// Test to verify the playback of a picture into a canvas that has 69a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov// an empty clip. 70a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov// 71a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovclass EmptyClipPictureBBHTest : public PictureBBHTestBase { 72a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovpublic: 7349aabde6ef80e39f00a2d00487cf5a881987dd81mtklein EmptyClipPictureBBHTest() 74a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov : PictureBBHTestBase(2, 2, 3, 3) { } 75a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 7636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override { 77a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov // intersect with out of bounds rect -> empty clip. 78a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov playbackCanvas.clipRect(SkRect::MakeXYWH(SkIntToScalar(10), SkIntToScalar(10), 79a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkIntToScalar(1), SkIntToScalar(1)), SkRegion::kIntersect_Op); 80a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkPaint paint; 81a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov recordingCanvas.drawRect(SkRect::MakeXYWH(SkIntToScalar(0), SkIntToScalar(0), 82a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov SkIntToScalar(3), SkIntToScalar(3)), paint); 83a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov } 84a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 85a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov virtual ~EmptyClipPictureBBHTest() { } 86a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov}; 87a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 88a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junovDEF_TEST(PictureBBH, reporter) { 89a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 90a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov DrawEmptyPictureBBHTest emptyPictureTest; 91a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov emptyPictureTest.run(reporter); 92a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov 93a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov EmptyClipPictureBBHTest emptyClipPictureTest; 94a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov emptyClipPictureTest.run(reporter); 95a41d3c33bc4e335dd4702bb9915fdf31d31d6c24junov} 96