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