PictureBBHTest.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. #include "include/core/SkBitmap.h"
  8. #include "include/core/SkCanvas.h"
  9. #include "include/core/SkPaint.h"
  10. #include "include/core/SkPicture.h"
  11. #include "include/core/SkPictureRecorder.h"
  12. #include "src/core/SkBBoxHierarchy.h"
  13. #include "src/core/SkRectPriv.h"
  14. #include "tests/Test.h"
  15. class PictureBBHTestBase {
  16. public:
  17. PictureBBHTestBase(int playbackWidth, int playbackHeight,
  18. int recordWidth, int recordHeight) {
  19. fResultBitmap.allocN32Pixels(playbackWidth, playbackHeight);
  20. fPictureWidth = recordWidth;
  21. fPictureHeight = recordHeight;
  22. }
  23. virtual ~PictureBBHTestBase() { }
  24. virtual void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) = 0;
  25. void run(skiatest::Reporter* reporter) {
  26. // No BBH
  27. this->run(nullptr, reporter);
  28. // With an R-Tree
  29. SkRTreeFactory RTreeFactory;
  30. this->run(&RTreeFactory, reporter);
  31. }
  32. private:
  33. void run(SkBBHFactory* factory, skiatest::Reporter* reporter) {
  34. SkCanvas playbackCanvas(fResultBitmap);
  35. playbackCanvas.clear(SK_ColorGREEN);
  36. SkPictureRecorder recorder;
  37. SkCanvas* recordCanvas = recorder.beginRecording(SkIntToScalar(fPictureWidth),
  38. SkIntToScalar(fPictureHeight),
  39. factory);
  40. this->doTest(playbackCanvas, *recordCanvas);
  41. sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
  42. playbackCanvas.drawPicture(picture);
  43. REPORTER_ASSERT(reporter, SK_ColorGREEN == fResultBitmap.getColor(0, 0));
  44. }
  45. SkBitmap fResultBitmap;
  46. int fPictureWidth, fPictureHeight;
  47. };
  48. // Test to verify the playback of an empty picture
  49. //
  50. class DrawEmptyPictureBBHTest : public PictureBBHTestBase {
  51. public:
  52. DrawEmptyPictureBBHTest()
  53. : PictureBBHTestBase(2, 2, 1, 1) {}
  54. ~DrawEmptyPictureBBHTest() override {}
  55. void doTest(SkCanvas&, SkCanvas&) override {}
  56. };
  57. // Test to verify the playback of a picture into a canvas that has
  58. // an empty clip.
  59. //
  60. class EmptyClipPictureBBHTest : public PictureBBHTestBase {
  61. public:
  62. EmptyClipPictureBBHTest()
  63. : PictureBBHTestBase(2, 2, 3, 3) {}
  64. void doTest(SkCanvas& playbackCanvas, SkCanvas& recordingCanvas) override {
  65. // intersect with out of bounds rect -> empty clip.
  66. playbackCanvas.clipRect(SkRect::MakeXYWH(10, 10, 1, 1));
  67. SkPaint paint;
  68. recordingCanvas.drawRect(SkRect::MakeWH(3, 3), paint);
  69. }
  70. ~EmptyClipPictureBBHTest() override {}
  71. };
  72. DEF_TEST(PictureBBH, reporter) {
  73. DrawEmptyPictureBBHTest emptyPictureTest;
  74. emptyPictureTest.run(reporter);
  75. EmptyClipPictureBBHTest emptyClipPictureTest;
  76. emptyClipPictureTest.run(reporter);
  77. }
  78. DEF_TEST(PictureNegativeSpace, r) {
  79. SkRTreeFactory factory;
  80. SkPictureRecorder recorder;
  81. SkRect cull = {-200,-200,+200,+200};
  82. {
  83. auto canvas = recorder.beginRecording(cull, &factory);
  84. canvas->save();
  85. canvas->clipRect(cull);
  86. canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
  87. canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
  88. canvas->restore();
  89. auto pic = recorder.finishRecordingAsPicture();
  90. REPORTER_ASSERT(r, pic->approximateOpCount() == 5);
  91. REPORTER_ASSERT(r, pic->cullRect() == (SkRect{-20,-20,-10,-10}));
  92. }
  93. {
  94. auto canvas = recorder.beginRecording(cull, &factory);
  95. canvas->clipRect(cull);
  96. canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
  97. canvas->drawRect({-20,-20,-10,-10}, SkPaint{});
  98. auto pic = recorder.finishRecordingAsPicture();
  99. REPORTER_ASSERT(r, pic->approximateOpCount() == 3);
  100. REPORTER_ASSERT(r, pic->cullRect() == (SkRect{-20,-20,-10,-10}));
  101. }
  102. }