diff options
Diffstat (limited to 'src/shaders/SkImageShader.cpp')
-rw-r--r-- | src/shaders/SkImageShader.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp index ba6c9fa9fc..f5756fe2fa 100644 --- a/src/shaders/SkImageShader.cpp +++ b/src/shaders/SkImageShader.cpp @@ -253,20 +253,21 @@ SkFlattenable::Register("SkBitmapProcShader", SkBitmapProcShader_CreateProc, kSk SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END -bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dstCS, SkArenaAlloc* alloc, - const SkMatrix& ctm, const SkPaint& paint, - const SkMatrix* localM) const { - auto matrix = SkMatrix::Concat(ctm, this->getLocalMatrix()); - if (localM) { - matrix.preConcat(*localM); +bool SkImageShader::onAppendStages(const StageRec& rec) const { + SkRasterPipeline* p = rec.fPipeline; + SkArenaAlloc* alloc = rec.fAlloc; + + auto matrix = SkMatrix::Concat(rec.fCTM, this->getLocalMatrix()); + if (rec.fLocalM) { + matrix.preConcat(*rec.fLocalM); } if (!matrix.invert(&matrix)) { return false; } - auto quality = paint.getFilterQuality(); + auto quality = rec.fPaint.getFilterQuality(); - SkBitmapProvider provider(fImage.get(), dstCS); + SkBitmapProvider provider(fImage.get(), rec.fDstCS); SkDefaultBitmapController controller; std::unique_ptr<SkBitmapController::State> state { controller.requestBitmap(provider, matrix, quality) @@ -308,7 +309,7 @@ bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dstCS, SkA }; auto misc = alloc->make<MiscCtx>(); misc->state = std::move(state); // Extend lifetime to match the pipeline's. - misc->paint_color = SkColor4f_from_SkColor(paint.getColor(), dstCS); + misc->paint_color = SkColor4f_from_SkColor(rec.fPaint.getColor(), rec.fDstCS); p->append_matrix(alloc, matrix); auto gather = alloc->make<SkJumper_MemoryCtx>(); @@ -343,7 +344,7 @@ bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dstCS, SkA case kRGBA_F16_SkColorType: p->append(SkRasterPipeline::gather_f16, gather); break; default: SkASSERT(false); } - if (dstCS && (!info.colorSpace() || info.gammaCloseToSRGB())) { + if (rec.fDstCS && (!info.colorSpace() || info.gammaCloseToSRGB())) { p->append_from_srgb(info.alphaType()); } }; @@ -409,6 +410,6 @@ bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dstCS, SkA p->append(SkRasterPipeline::clamp_0); p->append(SkRasterPipeline::clamp_a); } - append_gamut_transform(p, alloc, info.colorSpace(), dstCS, kPremul_SkAlphaType); + append_gamut_transform(p, alloc, info.colorSpace(), rec.fDstCS, kPremul_SkAlphaType); return true; } |