From a31eacb22e12a4223740e53ff5a11bd08340106e Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Mon, 28 Apr 2014 20:17:48 +0000 Subject: Refactor SkPictureStateTree::Iterator to avoid use of kClip_SaveFlag. The current implementation relies on soon-to-be-deprecated kClip_SaveFlag behavior. Updated to use default save flags (kMatrixClip_SaveFlag) and stop assuming that the matrix survives restore() calls. R=junov@chromium.org, reed@google.com, robertphillips@chromium.org, robertphillips@google.com Committed: http://code.google.com/p/skia/source/detail?r=14319 Author: fmalita@chromium.org Review URL: https://codereview.chromium.org/246893005 git-svn-id: http://skia.googlecode.com/svn/trunk@14421 2bbb7eff-a529-9590-31e7-b0007b416f81 --- tests/PictureStateTreeTest.cpp | 123 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 tests/PictureStateTreeTest.cpp (limited to 'tests') 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 bbhPicture(draw_scene(&bbhFactory)); + SkAutoTUnref 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); +} -- cgit v1.2.3