1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2014 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 10cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPicture.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPictureRecorder.h" 13cb93a386Sopenharmony_ci#include "src/core/SkRectPriv.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_ci#include "tests/Test.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciclass PictureBBHTestBase { 18cb93a386Sopenharmony_cipublic: 19cb93a386Sopenharmony_ci PictureBBHTestBase(int playbackWidth, int playbackHeight, 20cb93a386Sopenharmony_ci int recordWidth, int recordHeight) { 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci fResultBitmap.allocN32Pixels(playbackWidth, playbackHeight); 23cb93a386Sopenharmony_ci fPictureWidth = recordWidth; 24cb93a386Sopenharmony_ci fPictureHeight = recordHeight; 25cb93a386Sopenharmony_ci } 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci virtual ~PictureBBHTestBase() { } 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0; 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_ci void run(skiatest::Reporter* reporter) { 32cb93a386Sopenharmony_ci // No BBH 33cb93a386Sopenharmony_ci this->run(nullptr, reporter); 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci // With an R-Tree 36cb93a386Sopenharmony_ci SkRTreeFactory RTreeFactory; 37cb93a386Sopenharmony_ci this->run(&RTreeFactory, reporter); 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ciprivate: 41cb93a386Sopenharmony_ci void run(SkBBHFactory* factory, skiatest::Reporter* reporter) { 42cb93a386Sopenharmony_ci SkCanvas playbackCanvas(fResultBitmap); 43cb93a386Sopenharmony_ci playbackCanvas.clear(SK_ColorGREEN); 44cb93a386Sopenharmony_ci SkPictureRecorder recorder; 45cb93a386Sopenharmony_ci SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth), 46cb93a386Sopenharmony_ci SkIntToScalar(fPictureHeight), 47cb93a386Sopenharmony_ci factory); 48cb93a386Sopenharmony_ci this->doTest(playbackCanvas, *recordCanvas); 49cb93a386Sopenharmony_ci sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); 50cb93a386Sopenharmony_ci playbackCanvas.drawPicture(picture); 51cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0)); 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci SkBitmap fResultBitmap; 55cb93a386Sopenharmony_ci int fPictureWidth, fPictureHeight; 56cb93a386Sopenharmony_ci}; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci// Test to verify the playback of an empty picture 59cb93a386Sopenharmony_ci// 60cb93a386Sopenharmony_ciclass DrawEmptyPictureBBHTest : public PictureBBHTestBase { 61cb93a386Sopenharmony_cipublic: 62cb93a386Sopenharmony_ci DrawEmptyPictureBBHTest() 63cb93a386Sopenharmony_ci : PictureBBHTestBase(2, 2, 1, 1) {} 64cb93a386Sopenharmony_ci ~DrawEmptyPictureBBHTest() override {} 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci void doTest(SkCanvas&, SkCanvas&) override {} 67cb93a386Sopenharmony_ci}; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci// Test to verify the playback of a picture into a canvas that has 70cb93a386Sopenharmony_ci// an empty clip. 71cb93a386Sopenharmony_ci// 72cb93a386Sopenharmony_ciclass EmptyClipPictureBBHTest : public PictureBBHTestBase { 73cb93a386Sopenharmony_cipublic: 74cb93a386Sopenharmony_ci EmptyClipPictureBBHTest() 75cb93a386Sopenharmony_ci : PictureBBHTestBase(2, 2, 3, 3) {} 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override { 78cb93a386Sopenharmony_ci // intersect with out of bounds rect -> empty clip. 79cb93a386Sopenharmony_ci playbackCanvas.clipRect(SkRect::MakeXYWH(10, 10, 1, 1)); 80cb93a386Sopenharmony_ci SkPaint paint; 81cb93a386Sopenharmony_ci recordingCanvas.drawRect(SkRect::MakeWH(3, 3), paint); 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci ~EmptyClipPictureBBHTest() override {} 85cb93a386Sopenharmony_ci}; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ciDEF_TEST(PictureBBH, reporter) { 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci DrawEmptyPictureBBHTest emptyPictureTest; 90cb93a386Sopenharmony_ci emptyPictureTest.run(reporter); 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci EmptyClipPictureBBHTest emptyClipPictureTest; 93cb93a386Sopenharmony_ci emptyClipPictureTest.run(reporter); 94cb93a386Sopenharmony_ci} 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ciDEF_TEST(PictureNegativeSpace, r) { 97cb93a386Sopenharmony_ci SkRTreeFactory factory; 98cb93a386Sopenharmony_ci SkPictureRecorder recorder; 99cb93a386Sopenharmony_ci 100cb93a386Sopenharmony_ci SkRect cull = {-200,-200,+200,+200}; 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci { 103cb93a386Sopenharmony_ci sk_sp<SkBBoxHierarchy> bbh = factory(); 104cb93a386Sopenharmony_ci auto canvas = recorder.beginRecording(cull, bbh); 105cb93a386Sopenharmony_ci canvas->save(); 106cb93a386Sopenharmony_ci canvas->clipRect(cull); 107cb93a386Sopenharmony_ci canvas->drawRect({-20,-20,-10,-10}, SkPaint{}); 108cb93a386Sopenharmony_ci canvas->drawRect({-20,-20,-10,-10}, SkPaint{}); 109cb93a386Sopenharmony_ci canvas->restore(); 110cb93a386Sopenharmony_ci auto pic = recorder.finishRecordingAsPicture(); 111cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pic->approximateOpCount() == 5); 112cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pic->cullRect() == (SkRect{-20,-20,-10,-10})); 113cb93a386Sopenharmony_ci } 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_ci { 116cb93a386Sopenharmony_ci auto canvas = recorder.beginRecording(cull, &factory); 117cb93a386Sopenharmony_ci canvas->clipRect(cull); 118cb93a386Sopenharmony_ci canvas->drawRect({-20,-20,-10,-10}, SkPaint{}); 119cb93a386Sopenharmony_ci canvas->drawRect({-20,-20,-10,-10}, SkPaint{}); 120cb93a386Sopenharmony_ci auto pic = recorder.finishRecordingAsPicture(); 121cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pic->approximateOpCount() == 3); 122cb93a386Sopenharmony_ci REPORTER_ASSERT(r, pic->cullRect() == (SkRect{-20,-20,-10,-10})); 123cb93a386Sopenharmony_ci } 124cb93a386Sopenharmony_ci} 125