| /* |
| * 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 "SkCanvas.h" |
| #include "SkPicture.h" |
| #include "SkPictureRecorder.h" |
| #include "SkPictureShader.h" |
| #include "SkShader.h" |
| #include "SkSurface.h" |
| #include "Test.h" |
| |
| // Test that attempting to create a picture shader with a nullptr picture or |
| // empty picture returns a shader that draws nothing. |
| DEF_TEST(PictureShader_empty, reporter) { |
| SkPaint paint; |
| |
| SkBitmap bitmap; |
| bitmap.allocN32Pixels(1,1); |
| |
| SkCanvas canvas(bitmap); |
| canvas.clear(SK_ColorGREEN); |
| |
| paint.setShader(SkShader::MakePictureShader( |
| nullptr, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, nullptr, nullptr)); |
| |
| canvas.drawRect(SkRect::MakeWH(1,1), paint); |
| REPORTER_ASSERT(reporter, *bitmap.getAddr32(0,0) == SK_ColorGREEN); |
| |
| |
| SkPictureRecorder factory; |
| factory.beginRecording(0, 0, nullptr, 0); |
| paint.setShader(SkShader::MakePictureShader(factory.finishRecordingAsPicture(), |
| SkShader::kClamp_TileMode, |
| SkShader::kClamp_TileMode, nullptr, nullptr)); |
| |
| canvas.drawRect(SkRect::MakeWH(1,1), paint); |
| REPORTER_ASSERT(reporter, *bitmap.getAddr32(0,0) == SK_ColorGREEN); |
| } |
| |
| // Test that the SkPictureShader cache is purged on shader deletion. |
| DEF_TEST(PictureShader_caching, reporter) { |
| auto makePicture = [] () { |
| SkPictureRecorder recorder; |
| recorder.beginRecording(100, 100)->drawColor(SK_ColorGREEN); |
| return recorder.finishRecordingAsPicture(); |
| }; |
| |
| sk_sp<SkPicture> picture = makePicture(); |
| REPORTER_ASSERT(reporter, picture->unique()); |
| |
| sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(100, 100); |
| |
| { |
| SkPaint paint; |
| paint.setShader(SkPictureShader::Make(picture, |
| SkShader::kRepeat_TileMode, |
| SkShader::kRepeat_TileMode, nullptr, nullptr)); |
| surface->getCanvas()->drawPaint(paint); |
| |
| // We should have about 3 refs by now: local + shader + shader cache. |
| REPORTER_ASSERT(reporter, !picture->unique()); |
| } |
| |
| // Draw another picture shader to have a chance to purge. |
| { |
| SkPaint paint; |
| paint.setShader(SkPictureShader::Make(makePicture(), |
| SkShader::kRepeat_TileMode, |
| SkShader::kRepeat_TileMode, nullptr, nullptr)); |
| surface->getCanvas()->drawPaint(paint); |
| |
| } |
| |
| // All but the local ref should be gone now. |
| REPORTER_ASSERT(reporter, picture->unique()); |
| } |