diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/effects/SkGaussianEdgeShader.cpp | 27 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSLProgramBuilder.cpp | 3 | ||||
-rw-r--r-- | src/ports/SkGlobalInitialization_default.cpp | 3 |
3 files changed, 22 insertions, 11 deletions
diff --git a/src/effects/SkGaussianEdgeShader.cpp b/src/effects/SkGaussianEdgeShader.cpp index d73bfadbd7..01b0606c01 100644 --- a/src/effects/SkGaussianEdgeShader.cpp +++ b/src/effects/SkGaussianEdgeShader.cpp @@ -67,17 +67,25 @@ public: GLSLGaussianEdgeFP() {} void emitCode(EmitArgs& args) override { - GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; - fragBuilder->codeAppendf("vec4 color = %s;", args.fInputColor); - fragBuilder->codeAppend("float radius = color.g*64.0;"); - fragBuilder->codeAppend("float pad = color.b*64.0;"); - - fragBuilder->codeAppendf("float factor = 1.0 - clamp((%s.z - pad)/radius, 0.0, 1.0);", - fragBuilder->distanceVectorName()); - fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;"); - fragBuilder->codeAppendf("%s = factor*vec4(0.0, 0.0, 0.0, color.r);", args.fOutputColor); + if (!args.fGpImplementsDistanceVector) { + fragBuilder->codeAppendf("// GP does not implement fsDistanceVector - " + " returning grey in GLSLGaussianEdgeFP\n"); + fragBuilder->codeAppendf("vec4 color = %s;", args.fInputColor); + fragBuilder->codeAppendf("%s = vec4(0, 0, 0, color.r);", args.fOutputColor); + } else { + fragBuilder->codeAppendf("vec4 color = %s;", args.fInputColor); + fragBuilder->codeAppend("float radius = color.g*64.0;"); + fragBuilder->codeAppend("float pad = color.b*64.0;"); + + fragBuilder->codeAppendf("float factor = 1.0 - clamp((%s.z - pad)/radius," + "0.0, 1.0);", + fragBuilder->distanceVectorName()); + fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;"); + fragBuilder->codeAppendf("%s = factor*vec4(0.0, 0.0, 0.0, color.r);", + args.fOutputColor); + } } static void GenKey(const GrProcessor& proc, const GrGLSLCaps&, @@ -133,7 +141,6 @@ sk_sp<SkFlattenable> SkGaussianEdgeShaderImpl::CreateProc(SkReadBuffer& buf) { } void SkGaussianEdgeShaderImpl::flatten(SkWriteBuffer& buf) const { - this->INHERITED::flatten(buf); } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/glsl/GrGLSLProgramBuilder.cpp b/src/gpu/glsl/GrGLSLProgramBuilder.cpp index a6bff8a85a..3383221ebf 100644 --- a/src/gpu/glsl/GrGLSLProgramBuilder.cpp +++ b/src/gpu/glsl/GrGLSLProgramBuilder.cpp @@ -89,6 +89,9 @@ void GrGLSLProgramBuilder::emitAndInstallPrimProc(const GrPrimitiveProcessor& pr const char* distanceVectorName = nullptr; if (this->fPipeline.usesDistanceVectorField() && proc.implementsDistanceVector()) { + // Each individual user (FP) of the distance vector must be able to handle having this + // variable be undeclared. There is no single default value that will yield a reasonable + // result for all users. distanceVectorName = fFS.distanceVectorName(); fFS.codeAppend( "// Normalized vector to the closest geometric edge (in device space)\n"); fFS.codeAppend( "// Distance to the edge encoded in the z-component\n"); diff --git a/src/ports/SkGlobalInitialization_default.cpp b/src/ports/SkGlobalInitialization_default.cpp index fdafd9609a..1f1973649c 100644 --- a/src/ports/SkGlobalInitialization_default.cpp +++ b/src/ports/SkGlobalInitialization_default.cpp @@ -24,6 +24,7 @@ #include "SkDisplacementMapEffect.h" #include "SkDropShadowImageFilter.h" #include "SkEmbossMaskFilter.h" +#include "SkGaussianEdgeShader.h" #include "SkGradientShader.h" #include "SkImageSource.h" #include "SkLayerDrawLooper.h" @@ -89,7 +90,7 @@ void SkFlattenable::PrivateInitializer::InitEffects() { SkGradientShader::InitializeFlattenables(); SkLightingShader::InitializeFlattenables(); SkNormalSource::InitializeFlattenables(); - + SkGaussianEdgeShader::InitializeFlattenables(); // PathEffect SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkArcToPathEffect) |