/* * Copyright 2019 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkPaint.h" #include "include/core/SkPicture.h" #include "include/core/SkPictureRecorder.h" #include "include/core/SkPixmap.h" #include "include/core/SkRect.h" #include "tests/Test.h" #include "tools/debugger/DebugLayerManager.h" // Adds one full update, one partial update, and requests one image a few frames later. static void test_basic(skiatest::Reporter* reporter) { // prepare supporting objects int layerWidth = 100; int layerHeight = 100; // make a picture that fully updates the layer SkPictureRecorder rec; SkCanvas* canvas = rec.beginRecording(layerWidth, layerHeight); canvas->clear(0x00000000); SkPaint paint; paint.setColor(SK_ColorBLUE); canvas->drawOval(SkRect::MakeLTRB(1,1,99,99), paint); auto picture1 = rec.finishRecordingAsPicture(); SkIRect dirtyRectFull = SkIRect::MakeLTRB(0, 0, layerWidth, layerHeight); // make a second picture that acts as a partial update. SkPictureRecorder rec2; canvas = rec2.beginRecording(layerWidth, layerHeight); paint.setColor(SK_ColorGREEN); canvas->drawOval(SkRect::MakeLTRB(40,40,60,60), paint); auto picture2 = rec2.finishRecordingAsPicture(); SkIRect dirtyRectPartial = SkIRect::MakeLTRB(40,40,60,60); int node = 2; // create and exercise DebugLayerManager DebugLayerManager dlm; dlm.storeSkPicture(node, 0, picture1, dirtyRectFull); dlm.storeSkPicture(node, 10, picture2, dirtyRectPartial); auto frames = dlm.listFramesForNode(node); // Confirm the layer manager stored these at the right places. REPORTER_ASSERT(reporter, frames.size() == 2); REPORTER_ASSERT(reporter, frames[0] == 0); REPORTER_ASSERT(reporter, frames[1] == 10); SkPixmap pixmap; // request an image of the layer between the two updates. for (int i=0; i<10; i++) { auto image = dlm.getLayerAsImage(node, i); REPORTER_ASSERT(reporter, image->width() == layerWidth); REPORTER_ASSERT(reporter, image->height() == layerHeight); // confirm center is blue, proving only first pic was drawn. image->peekPixels(&pixmap); SkColor paintColor = pixmap.getColor(50, 50); REPORTER_ASSERT(reporter, paintColor == SK_ColorBLUE); } // For any images after the second draw, confirm the center is green, but the area just outside // that smaller circle is still blue, proving dlm drew both pictures. for (int i=10; i<12; i++) { auto image = dlm.getLayerAsImage(node, i); REPORTER_ASSERT(reporter, image->width() == layerWidth); REPORTER_ASSERT(reporter, image->height() == layerHeight); image->peekPixels(&pixmap); auto innerColor = pixmap.getColor(50, 50); REPORTER_ASSERT(reporter, innerColor == SK_ColorGREEN); auto outerColor = pixmap.getColor(10, 50); REPORTER_ASSERT(reporter, outerColor == SK_ColorBLUE); } } DEF_TEST(DebugLayerManagerTest, reporter) { test_basic(reporter); }