virtual void emitCode(EmitArgs& args) override { SkXfermode::Mode mode = args.fFp.cast<ModeColorFilterEffect>().mode(); SkASSERT(SkXfermode::kDst_Mode != mode); const char* colorFilterColorUniName = nullptr; if (args.fFp.cast<ModeColorFilterEffect>().willUseFilterColor()) { fFilterColorUni = args.fBuilder->addUniform( GrGLProgramBuilder::kFragment_Visibility, kVec4f_GrSLType, kDefault_GrSLPrecision, "FilterColor", &colorFilterColorUniName); } GrGLSLExpr4 filter = color_filter_expression(mode, GrGLSLExpr4(colorFilterColorUniName), GrGLSLExpr4(args.fInputColor)); args.fBuilder->getFragmentShaderBuilder()-> codeAppendf("\t%s = %s;\n", args.fOutputColor, filter.c_str()); }
void ModeColorFilterEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const { float inputColor[4]; GrColorToRGBAFloat(inout->color(), inputColor); float filterColor[4]; GrColorToRGBAFloat(fColor, filterColor); MaskedColorExpr result = color_filter_expression(fMode, MaskedColorExpr(filterColor, kRGBA_GrColorComponentFlags), MaskedColorExpr(inputColor, inout->validFlags())); // Check if we will use the input color SkXfermode::Coeff dstCoeff; SkXfermode::Coeff srcCoeff; SkAssertResult(SkXfermode::ModeAsCoeff(fMode, &srcCoeff, &dstCoeff)); GrInvariantOutput::ReadInput readInput = GrInvariantOutput::kWill_ReadInput; // These could be calculated from the blend equation with template trickery.. if (SkXfermode::kZero_Coeff == dstCoeff && !GrBlendCoeffRefsDst(sk_blend_to_grblend(srcCoeff))) { readInput = GrInvariantOutput::kWillNot_ReadInput; } inout->setToOther(result.getValidComponents(), result.getColor(), readInput); }
virtual void emitCode(GrGLFPBuilder* builder, const GrFragmentProcessor& fp, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) override { SkXfermode::Mode mode = fp.cast<ModeColorFilterEffect>().mode(); SkASSERT(SkXfermode::kDst_Mode != mode); const char* colorFilterColorUniName = NULL; if (fp.cast<ModeColorFilterEffect>().willUseFilterColor()) { fFilterColorUni = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, kVec4f_GrSLType, kDefault_GrSLPrecision, "FilterColor", &colorFilterColorUniName); } GrGLSLExpr4 filter = color_filter_expression(mode, GrGLSLExpr4(colorFilterColorUniName), GrGLSLExpr4(inputColor)); builder->getFragmentShaderBuilder()-> codeAppendf("\t%s = %s;\n", outputColor, filter.c_str()); }