Guard GrRadialGradientLayout::TestCreate against Empty shaders
With certain degenerate params (decal mode and a very small radius), we
could produce an SkShader that's an instance of SkEmptyShader, which
then failed to create an FP.
Bug: skia:8660 skia:8860 skia:8982
Change-Id: I47142572cd0c75d15c6ee1e66e3140786431371f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/208221
Reviewed-by: Herb Derby <herb@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/gradients/GrRadialGradientLayout.fp b/src/gpu/gradients/GrRadialGradientLayout.fp
index fd47295..a50e658 100644
--- a/src/gpu/gradients/GrRadialGradientLayout.fp
+++ b/src/gpu/gradients/GrRadialGradientLayout.fp
@@ -49,22 +49,22 @@
@test(d) {
SkScalar scale = GrGradientShader::RandomParams::kGradientScale;
- sk_sp<SkShader> shader;
+ std::unique_ptr<GrFragmentProcessor> fp;
+ GrTest::TestAsFPArgs asFPArgs(d);
do {
GrGradientShader::RandomParams params(d->fRandom);
SkPoint center = {d->fRandom->nextRangeScalar(0.0f, scale),
d->fRandom->nextRangeScalar(0.0f, scale)};
SkScalar radius = d->fRandom->nextRangeScalar(0.0f, scale);
- shader = params.fUseColors4f
+ sk_sp<SkShader> shader = params.fUseColors4f
? SkGradientShader::MakeRadial(center, radius, params.fColors4f,
params.fColorSpace, params.fStops,
params.fColorCount, params.fTileMode)
: SkGradientShader::MakeRadial(center, radius, params.fColors,
params.fStops, params.fColorCount,
params.fTileMode);
- } while (!shader);
- GrTest::TestAsFPArgs asFPArgs(d);
- std::unique_ptr<GrFragmentProcessor> fp = as_SB(shader)->asFragmentProcessor(asFPArgs.args());
- GrAlwaysAssert(fp);
+ // Degenerate params can create an Empty (non-null) shader, where fp will be nullptr
+ fp = shader ? as_SB(shader)->asFragmentProcessor(asFPArgs.args()) : nullptr;
+ } while (!fp);
return fp;
}
diff --git a/src/gpu/gradients/generated/GrRadialGradientLayout.cpp b/src/gpu/gradients/generated/GrRadialGradientLayout.cpp
index 4643c9b..af578d1 100644
--- a/src/gpu/gradients/generated/GrRadialGradientLayout.cpp
+++ b/src/gpu/gradients/generated/GrRadialGradientLayout.cpp
@@ -57,23 +57,24 @@
#if GR_TEST_UTILS
std::unique_ptr<GrFragmentProcessor> GrRadialGradientLayout::TestCreate(GrProcessorTestData* d) {
SkScalar scale = GrGradientShader::RandomParams::kGradientScale;
- sk_sp<SkShader> shader;
+ std::unique_ptr<GrFragmentProcessor> fp;
+ GrTest::TestAsFPArgs asFPArgs(d);
do {
GrGradientShader::RandomParams params(d->fRandom);
SkPoint center = {d->fRandom->nextRangeScalar(0.0f, scale),
d->fRandom->nextRangeScalar(0.0f, scale)};
SkScalar radius = d->fRandom->nextRangeScalar(0.0f, scale);
- shader = params.fUseColors4f
- ? SkGradientShader::MakeRadial(center, radius, params.fColors4f,
- params.fColorSpace, params.fStops,
- params.fColorCount, params.fTileMode)
- : SkGradientShader::MakeRadial(center, radius, params.fColors,
- params.fStops, params.fColorCount,
- params.fTileMode);
- } while (!shader);
- GrTest::TestAsFPArgs asFPArgs(d);
- std::unique_ptr<GrFragmentProcessor> fp = as_SB(shader)->asFragmentProcessor(asFPArgs.args());
- GrAlwaysAssert(fp);
+ sk_sp<SkShader> shader =
+ params.fUseColors4f
+ ? SkGradientShader::MakeRadial(center, radius, params.fColors4f,
+ params.fColorSpace, params.fStops,
+ params.fColorCount, params.fTileMode)
+ : SkGradientShader::MakeRadial(center, radius, params.fColors,
+ params.fStops, params.fColorCount,
+ params.fTileMode);
+ // Degenerate params can create an Empty (non-null) shader, where fp will be nullptr
+ fp = shader ? as_SB(shader)->asFragmentProcessor(asFPArgs.args()) : nullptr;
+ } while (!fp);
return fp;
}
#endif