Home | History | Annotate | Download | only in tests
      1 /*
      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 
     16 class PictureBBHTestBase {
     17 public:
     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(nullptr, reporter);
     33 
     34         // With an R-Tree
     35         SkRTreeFactory RTreeFactory;
     36         this->run(&RTreeFactory, reporter);
     37     }
     38 
     39 private:
     40     void run(SkBBHFactory* factory, skiatest::Reporter* reporter) {
     41         SkCanvas playbackCanvas(fResultBitmap);
     42         playbackCanvas.clear(SK_ColorGREEN);
     43         SkPictureRecorder recorder;
     44         SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth),
     45                                                          SkIntToScalar(fPictureHeight),
     46                                                          factory);
     47         this->doTest(playbackCanvas, *recordCanvas);
     48         sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
     49         playbackCanvas.drawPicture(picture);
     50         REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0));
     51     }
     52 
     53     SkBitmap fResultBitmap;
     54     int fPictureWidth, fPictureHeight;
     55 };
     56 
     57 // Test to verify the playback of an empty picture
     58 //
     59 class DrawEmptyPictureBBHTest : public PictureBBHTestBase {
     60 public:
     61     DrawEmptyPictureBBHTest()
     62         : PictureBBHTestBase(2, 2, 1, 1) {}
     63     ~DrawEmptyPictureBBHTest() override {}
     64 
     65     void doTest(SkCanvas&, SkCanvas&) override {}
     66 };
     67 
     68 // Test to verify the playback of a picture into a canvas that has
     69 // an empty clip.
     70 //
     71 class EmptyClipPictureBBHTest : public PictureBBHTestBase {
     72 public:
     73     EmptyClipPictureBBHTest()
     74         : PictureBBHTestBase(2, 2, 3, 3) {}
     75 
     76     void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override {
     77         // intersect with out of bounds rect -> empty clip.
     78         playbackCanvas.clipRect(SkRect::MakeXYWH(10, 10, 1, 1));
     79         SkPaint paint;
     80         recordingCanvas.drawRect(SkRect::MakeWH(3, 3), paint);
     81     }
     82 
     83     ~EmptyClipPictureBBHTest() override {}
     84 };
     85 
     86 DEF_TEST(PictureBBH, reporter) {
     87 
     88     DrawEmptyPictureBBHTest emptyPictureTest;
     89     emptyPictureTest.run(reporter);
     90 
     91     EmptyClipPictureBBHTest emptyClipPictureTest;
     92     emptyClipPictureTest.run(reporter);
     93 }
     94