diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/PictureStateTreeTest.cpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/tests/PictureStateTreeTest.cpp b/tests/PictureStateTreeTest.cpp new file mode 100644 index 0000000000..e6cf55342e --- /dev/null +++ b/tests/PictureStateTreeTest.cpp @@ -0,0 +1,123 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkBBHFactory.h" +#include "SkCanvas.h" +#include "SkPictureRecorder.h" +#include "SkPictureStateTree.h" +#include "Test.h" + +static SkPicture* draw_scene(SkBBHFactory* bbhFactory) { + SkPictureRecorder recorder; + SkCanvas* canvas = recorder.beginRecording(200, 200, bbhFactory, 0); + + SkPaint p1, p2; + p1.setStyle(SkPaint::kFill_Style); + p1.setARGB(0x80, 0, 0xff, 0); + p2.setStyle(SkPaint::kFill_Style); + p2.setARGB(0x80, 0xff, 0, 0); + + canvas->drawColor(SK_ColorWHITE); + + // This is intended to exercise some tricky SkPictureStateTree code paths when + // played back with various clips: + // + // * cleanup/rewind when the last draw is not at the root of the state tree. + // * state nodes with both kSave_Flag & kSaveLayer_Flag set. + // * state tree transitions which implicitly reset the matrix via. restore(). + + canvas->save(); + canvas->translate(10, 10); + + canvas->drawRect(SkRect::MakeWH(100, 50), p1); + canvas->drawRect(SkRect::MakeWH(50, 100), p2); + + SkRect layerBounds = SkRect::MakeXYWH(0, 0, 90, 90); + canvas->saveLayer(&layerBounds, NULL); + canvas->save(); + canvas->clipRect(layerBounds); + + canvas->save(); + canvas->clipRect(SkRect::MakeWH(25, 25)); + canvas->rotate(90); + canvas->drawRect(SkRect::MakeWH(100, 50), p1); + canvas->restore(); + + canvas->save(); + canvas->clipRect(SkRect::MakeWH(25, 25)); + canvas->save(); + canvas->rotate(90); + canvas->drawRect(SkRect::MakeWH(50, 100), p2); + canvas->restore(); + canvas->drawRect(SkRect::MakeWH(100, 50), p1); + canvas->restore(); + canvas->drawRect(SkRect::MakeXYWH(99, 99, 1, 1), p1); + canvas->restore(); + canvas->restore(); + + canvas->restore(); + + return recorder.endRecording(); +} + +static void check_bms(skiatest::Reporter* reporter, const SkBitmap& bm1, const SkBitmap& bm2) { + SkASSERT(bm1.getSize() == bm2.getSize()); + REPORTER_ASSERT(reporter, 0 == memcmp(bm1.getAddr(0, 0), bm2.getAddr(0, 0), bm1.getSize())); +} + +static void test_reference_picture(skiatest::Reporter* reporter) { + SkRTreeFactory bbhFactory; + + SkAutoTUnref<SkPicture> bbhPicture(draw_scene(&bbhFactory)); + SkAutoTUnref<SkPicture> referencePicture(draw_scene(NULL)); + + SkBitmap referenceBitmap; + referenceBitmap.allocN32Pixels(100, 100); + SkCanvas referenceCanvas(referenceBitmap); + + SkBitmap bbhBitmap; + bbhBitmap.allocN32Pixels(100, 100); + SkCanvas bbhCanvas(bbhBitmap); + + referenceCanvas.drawColor(SK_ColorTRANSPARENT); + referenceCanvas.drawPicture(*referencePicture.get()); + bbhCanvas.drawColor(SK_ColorTRANSPARENT); + bbhCanvas.drawPicture(*bbhPicture.get()); + REPORTER_ASSERT(reporter, + referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); + REPORTER_ASSERT(reporter, + referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix()); + check_bms(reporter, referenceBitmap, bbhBitmap); + + referenceCanvas.drawColor(SK_ColorTRANSPARENT); + referenceCanvas.clipRect(SkRect::MakeWH(50, 50)); + referenceCanvas.drawPicture(*referencePicture.get()); + bbhCanvas.drawColor(SK_ColorTRANSPARENT); + bbhCanvas.clipRect(SkRect::MakeWH(50, 50)); + bbhCanvas.drawPicture(*bbhPicture.get()); + REPORTER_ASSERT(reporter, + referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); + REPORTER_ASSERT(reporter, + referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix()); + check_bms(reporter, referenceBitmap, bbhBitmap); + + referenceCanvas.drawColor(SK_ColorTRANSPARENT); + referenceCanvas.clipRect(SkRect::MakeWH(10, 10)); + referenceCanvas.drawPicture(*referencePicture.get()); + bbhCanvas.drawColor(SK_ColorTRANSPARENT); + bbhCanvas.clipRect(SkRect::MakeWH(10, 10)); + bbhCanvas.drawPicture(*bbhPicture.get()); + REPORTER_ASSERT(reporter, + referenceCanvas.getSaveCount() == bbhCanvas.getSaveCount()); + REPORTER_ASSERT(reporter, + referenceCanvas.getTotalMatrix() == bbhCanvas.getTotalMatrix()); + check_bms(reporter, referenceBitmap, bbhBitmap); +} + +DEF_TEST(PictureStateTree, reporter) { + test_reference_picture(reporter); +} |