Index: src/gpu/effects/GrConvexPolyEffect.cpp |
diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp |
index cf874cfa52604e1666ddecad3fec720d1063279a..7b78305bb1e014d8a8d5ca2597ff00c942ac884a 100644 |
--- a/src/gpu/effects/GrConvexPolyEffect.cpp |
+++ b/src/gpu/effects/GrConvexPolyEffect.cpp |
@@ -8,6 +8,7 @@ |
#include "GrConvexPolyEffect.h" |
#include "GrInvariantOutput.h" |
#include "SkPathPriv.h" |
+#include "effects/GrConstColorProcessor.h" |
#include "glsl/GrGLSLFragmentProcessor.h" |
#include "glsl/GrGLSLFragmentShaderBuilder.h" |
#include "glsl/GrGLSLProgramDataManager.h" |
@@ -254,7 +255,16 @@ GrFragmentProcessor* GrConvexPolyEffect::Create(GrPrimitiveEdgeType type, const |
SkScalar edges[3 * kMaxEdges]; |
SkPathPriv::FirstDirection dir; |
- SkAssertResult(SkPathPriv::CheapComputeFirstDirection(path, &dir)); |
+ // The only way this should fail is if the clip is effectively a infinitely thin line. In that |
+ // case nothing is inside the clip. It'd be nice to detect this at a higher level and either |
+ // skip the draw or omit the clip element. |
+ if (!SkPathPriv::CheapComputeFirstDirection(path, &dir)) { |
+ if (GrProcessorEdgeTypeIsInverseFill(type)) { |
+ return GrConstColorProcessor::Create(0xFFFFFFFF, |
+ GrConstColorProcessor::kModulateRGBA_InputMode); |
+ } |
+ return GrConstColorProcessor::Create(0, GrConstColorProcessor::kIgnore_InputMode); |
+ } |
SkVector t; |
if (nullptr == offset) { |