bool SkPaintToGrPaintWithTexture(GrContext* context, const SkPaint& paint, const SkMatrix& viewM, const GrFragmentProcessor* fp, bool textureIsAlphaOnly, GrPaint* grPaint) { SkAutoTUnref<const GrFragmentProcessor> shaderFP; if (textureIsAlphaOnly) { if (const SkShader* shader = paint.getShader()) { shaderFP.reset(shader->asFragmentProcessor(context, viewM, nullptr, paint.getFilterQuality())); if (!shaderFP) { return false; } const GrFragmentProcessor* fpSeries[] = { shaderFP.get(), fp }; shaderFP.reset(GrFragmentProcessor::RunInSeries(fpSeries, 2)); } else { shaderFP.reset(GrFragmentProcessor::MulOutputByInputUnpremulColor(fp)); } } else { shaderFP.reset(GrFragmentProcessor::MulOutputByInputAlpha(fp)); } return SkPaintToGrPaintReplaceShader(context, paint, shaderFP.get(), grPaint); }
bool SkPaintToGrPaintWithTexture(GrContext* context, const GrColorSpaceInfo& colorSpaceInfo, const SkPaint& paint, const SkMatrix& viewM, std::unique_ptr<GrFragmentProcessor> fp, bool textureIsAlphaOnly, GrPaint* grPaint) { std::unique_ptr<GrFragmentProcessor> shaderFP; if (textureIsAlphaOnly) { if (const auto* shader = as_SB(paint.getShader())) { shaderFP = shader->asFragmentProcessor(GrFPArgs( context, &viewM, nullptr, paint.getFilterQuality(), &colorSpaceInfo)); if (!shaderFP) { return false; } std::unique_ptr<GrFragmentProcessor> fpSeries[] = { std::move(shaderFP), std::move(fp) }; shaderFP = GrFragmentProcessor::RunInSeries(fpSeries, 2); } else { shaderFP = GrFragmentProcessor::MakeInputPremulAndMulByOutput(std::move(fp)); } } else { shaderFP = GrFragmentProcessor::MulChildByInputAlpha(std::move(fp)); } return SkPaintToGrPaintReplaceShader(context, colorSpaceInfo, paint, std::move(shaderFP), grPaint); }