| /* | |
| * 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); | |
| } |