sk_sp<GrFragmentProcessor> SkComposeShader::asFragmentProcessor(const AsFPArgs& args) const { switch (fMode) { case SkBlendMode::kClear: return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(), GrConstColorProcessor::kIgnore_InputMode); break; case SkBlendMode::kSrc: return fShaderB->asFragmentProcessor(args); break; case SkBlendMode::kDst: return fShaderA->asFragmentProcessor(args); break; default: sk_sp<GrFragmentProcessor> fpA(fShaderA->asFragmentProcessor(args)); if (!fpA) { return nullptr; } sk_sp<GrFragmentProcessor> fpB(fShaderB->asFragmentProcessor(args)); if (!fpB) { return nullptr; } return GrXfermodeFragmentProcessor::MakeFromTwoProcessors(std::move(fpB), std::move(fpA), fMode); } }
const GrFragmentProcessor* SkComposeShader::asFragmentProcessor(GrContext* context, const SkMatrix& viewM, const SkMatrix* localMatrix, SkFilterQuality fq) const { // Fragment processor will only support SkXfermode::Mode modes currently. SkXfermode::Mode mode; if (!(SkXfermode::AsMode(fMode, &mode))) { return nullptr; } switch (mode) { case SkXfermode::kClear_Mode: return GrConstColorProcessor::Create(GrColor_TRANSPARENT_BLACK, GrConstColorProcessor::kIgnore_InputMode); break; case SkXfermode::kSrc_Mode: return fShaderB->asFragmentProcessor(context, viewM, localMatrix, fq); break; case SkXfermode::kDst_Mode: return fShaderA->asFragmentProcessor(context, viewM, localMatrix, fq); break; default: SkAutoTUnref<const GrFragmentProcessor> fpA(fShaderA->asFragmentProcessor(context, viewM, localMatrix, fq)); if (!fpA.get()) { return nullptr; } SkAutoTUnref<const GrFragmentProcessor> fpB(fShaderB->asFragmentProcessor(context, viewM, localMatrix, fq)); if (!fpB.get()) { return nullptr; } return GrXfermodeFragmentProcessor::CreateFromTwoProcessors(fpB, fpA, mode); } }
std::unique_ptr<GrFragmentProcessor> SkComposeShader::asFragmentProcessor( const GrFPArgs& args) const { if (this->isJustMode()) { SkASSERT(fMode != SkBlendMode::kSrc && fMode != SkBlendMode::kDst); // caught in factory if (fMode == SkBlendMode::kClear) { return GrConstColorProcessor::Make(GrColor4f::TransparentBlack(), GrConstColorProcessor::InputMode::kIgnore); } } std::unique_ptr<GrFragmentProcessor> fpA(as_SB(fDst)->asFragmentProcessor(args)); if (!fpA) { return nullptr; } std::unique_ptr<GrFragmentProcessor> fpB(as_SB(fSrc)->asFragmentProcessor(args)); if (!fpB) { return nullptr; } // TODO: account for fLerpT when it is < 1 return GrXfermodeFragmentProcessor::MakeFromTwoProcessors(std::move(fpB), std::move(fpA), fMode); }