/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Test.h" #include "SkCanvas.h" #include "SkPaint.h" #include "SkPicture.h" #include "SkRandom.h" #include "SkStream.h" #ifdef SK_DEBUG // Ensure that deleting SkPicturePlayback does not assert. Asserts only fire in debug mode, so only // run in debug mode. static void test_deleting_empty_playback() { SkPicture picture; // Creates an SkPictureRecord picture.beginRecording(0, 0); // Turns that into an SkPicturePlayback picture.endRecording(); // Deletes the old SkPicturePlayback, and creates a new SkPictureRecord picture.beginRecording(0, 0); } // Ensure that serializing an empty picture does not assert. Likewise only runs in debug mode. static void test_serializing_empty_picture() { SkPicture picture; picture.beginRecording(0, 0); picture.endRecording(); SkDynamicMemoryWStream stream; picture.serialize(&stream); } #endif static void rand_op(SkCanvas* canvas, SkRandom& rand) { SkPaint paint; SkRect rect = SkRect::MakeWH(50, 50); SkScalar unit = rand.nextUScalar1(); if (unit <= 0.3) { // SkDebugf("save\n"); canvas->save(); } else if (unit <= 0.6) { // SkDebugf("restore\n"); canvas->restore(); } else if (unit <= 0.9) { // SkDebugf("clip\n"); canvas->clipRect(rect); } else { // SkDebugf("draw\n"); canvas->drawPaint(paint); } } static void test_peephole(skiatest::Reporter* reporter) { SkRandom rand; for (int j = 0; j < 100; j++) { SkRandom rand2(rand.getSeed()); // remember the seed SkPicture picture; SkCanvas* canvas = picture.beginRecording(100, 100); for (int i = 0; i < 1000; ++i) { rand_op(canvas, rand); } picture.endRecording(); } { SkPicture picture; SkCanvas* canvas = picture.beginRecording(100, 100); SkRect rect = SkRect::MakeWH(50, 50); for (int i = 0; i < 100; ++i) { canvas->save(); } while (canvas->getSaveCount() > 1) { canvas->clipRect(rect); canvas->restore(); } picture.endRecording(); } } static void TestPicture(skiatest::Reporter* reporter) { #ifdef SK_DEBUG test_deleting_empty_playback(); test_serializing_empty_picture(); #endif test_peephole(reporter); } #include "TestClassDef.h" DEFINE_TESTCLASS("Pictures", PictureTestClass, TestPicture)