Make gradient effect creation fail if texture LUT creation fails
Bug: skia:6198
Change-Id: Ib8fb273564ca54ee9e6e045ac67e191af705a37a
Reviewed-on: https://skia-review.googlesource.com/19260
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp
index 2d21785..07860e4 100644
--- a/src/shaders/gradients/SkGradientShader.cpp
+++ b/src/shaders/gradients/SkGradientShader.cpp
@@ -1862,6 +1862,7 @@
args.fContext->resourceProvider(),
bitmap);
if (!proxy) {
+ SkDebugf("Gradient won't draw. Could not create texture.");
return;
}
// This is 2/2 places where auto-normalization is disabled
diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h
index c7c7761..5e55316 100644
--- a/src/shaders/gradients/SkGradientShaderPriv.h
+++ b/src/shaders/gradients/SkGradientShaderPriv.h
@@ -441,6 +441,9 @@
const GrCoordTransform& getCoordTransform() const { return fCoordTransform; }
+ /** Checks whether the constructor failed to fully initialize the processor. */
+ bool isValid() const { return fColorType != kTexture_ColorType || fTextureSampler.proxy(); }
+
private:
static OptimizationFlags OptFlags(bool isOpaque);
diff --git a/src/shaders/gradients/SkLinearGradient.cpp b/src/shaders/gradients/SkLinearGradient.cpp
index f803d5e..02969bd 100644
--- a/src/shaders/gradients/SkLinearGradient.cpp
+++ b/src/shaders/gradients/SkLinearGradient.cpp
@@ -376,7 +376,8 @@
class GLSLLinearProcessor;
static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
- return sk_sp<GrFragmentProcessor>(new GrLinearGradient(args));
+ auto processor = sk_sp<GrLinearGradient>(new GrLinearGradient(args));
+ return processor->isValid() ? std::move(processor) : nullptr;
}
~GrLinearGradient() override {}
@@ -489,6 +490,9 @@
sk_sp<GrFragmentProcessor> inner(GrLinearGradient::Make(
GrGradientEffect::CreateArgs(args.fContext, this, &matrix, fTileMode,
std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+ if (!inner) {
+ return nullptr;
+ }
return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
}
diff --git a/src/shaders/gradients/SkRadialGradient.cpp b/src/shaders/gradients/SkRadialGradient.cpp
index d49b3dd..8e12c88 100644
--- a/src/shaders/gradients/SkRadialGradient.cpp
+++ b/src/shaders/gradients/SkRadialGradient.cpp
@@ -247,7 +247,8 @@
class GLSLRadialProcessor;
static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
- return sk_sp<GrFragmentProcessor>(new GrRadialGradient(args));
+ auto processor = sk_sp<GrRadialGradient>(new GrRadialGradient(args));
+ return processor->isValid() ? std::move(processor) : nullptr;
}
~GrRadialGradient() override {}
@@ -363,6 +364,9 @@
sk_sp<GrFragmentProcessor> inner(GrRadialGradient::Make(
GrGradientEffect::CreateArgs(args.fContext, this, &matrix, fTileMode,
std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+ if (!inner) {
+ return nullptr;
+ }
return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
}
diff --git a/src/shaders/gradients/SkSweepGradient.cpp b/src/shaders/gradients/SkSweepGradient.cpp
index 1e583c2..58e34fd 100644
--- a/src/shaders/gradients/SkSweepGradient.cpp
+++ b/src/shaders/gradients/SkSweepGradient.cpp
@@ -144,8 +144,10 @@
class GLSLSweepProcessor;
static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
- return sk_sp<GrFragmentProcessor>(new GrSweepGradient(args));
+ auto processor = sk_sp<GrSweepGradient>(new GrSweepGradient(args));
+ return processor->isValid() ? std::move(processor) : nullptr;
}
+
~GrSweepGradient() override {}
const char* name() const override { return "Sweep Gradient"; }
@@ -267,6 +269,9 @@
sk_sp<GrFragmentProcessor> inner(GrSweepGradient::Make(
GrGradientEffect::CreateArgs(args.fContext, this, &matrix, SkShader::kClamp_TileMode,
std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+ if (!inner) {
+ return nullptr;
+ }
return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
}
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient.cpp b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
index 4549527..399bce6 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient.cpp
+++ b/src/shaders/gradients/SkTwoPointConicalGradient.cpp
@@ -362,6 +362,9 @@
sk_sp<GrFragmentProcessor> inner(Gr2PtConicalGradientEffect::Make(
GrGradientEffect::CreateArgs(args.fContext, this, args.fLocalMatrix, fTileMode,
std::move(colorSpaceXform), SkToBool(args.fDstColorSpace))));
+ if (!inner) {
+ return nullptr;
+ }
return GrFragmentProcessor::MulOutputByInputAlpha(std::move(inner));
}
diff --git a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
index 8402199..1e3404c 100644
--- a/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
+++ b/src/shaders/gradients/SkTwoPointConicalGradient_gpu.cpp
@@ -62,7 +62,8 @@
class GLSLEdge2PtConicalProcessor;
static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args) {
- return sk_sp<GrFragmentProcessor>(new Edge2PtConicalEffect(args));
+ auto processor = sk_sp<Edge2PtConicalEffect>(new Edge2PtConicalEffect(args));
+ return processor->isValid() ? std::move(processor) : nullptr;
}
~Edge2PtConicalEffect() override {}
@@ -370,8 +371,9 @@
class GLSLFocalOutside2PtConicalProcessor;
static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args, SkScalar focalX) {
- return sk_sp<GrFragmentProcessor>(
- new FocalOutside2PtConicalEffect(args, focalX));
+ auto processor =
+ sk_sp<FocalOutside2PtConicalEffect>(new FocalOutside2PtConicalEffect(args, focalX));
+ return processor->isValid() ? std::move(processor) : nullptr;
}
~FocalOutside2PtConicalEffect() override {}
@@ -583,8 +585,9 @@
class GLSLFocalInside2PtConicalProcessor;
static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args, SkScalar focalX) {
- return sk_sp<GrFragmentProcessor>(
- new FocalInside2PtConicalEffect(args, focalX));
+ auto processor =
+ sk_sp<FocalInside2PtConicalEffect>(new FocalInside2PtConicalEffect(args, focalX));
+ return processor->isValid() ? std::move(processor) : nullptr;
}
~FocalInside2PtConicalEffect() override {}
@@ -821,8 +824,9 @@
class GLSLCircleInside2PtConicalProcessor;
static sk_sp<GrFragmentProcessor> Make(const CreateArgs& args, const CircleConicalInfo& info) {
- return sk_sp<GrFragmentProcessor>(
- new CircleInside2PtConicalEffect(args, info));
+ auto processor =
+ sk_sp<CircleInside2PtConicalEffect>(new CircleInside2PtConicalEffect(args, info));
+ return processor->isValid() ? std::move(processor) : nullptr;
}
~CircleInside2PtConicalEffect() override {}