aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/SkShader.cpp38
1 files changed, 19 insertions, 19 deletions
diff --git a/src/core/SkShader.cpp b/src/core/SkShader.cpp
index 1c22dd975c..5f62947008 100644
--- a/src/core/SkShader.cpp
+++ b/src/core/SkShader.cpp
@@ -264,7 +264,7 @@ bool SkShader::appendStages(SkRasterPipeline* pipeline,
}
bool SkShader::onAppendStages(SkRasterPipeline* p,
- SkColorSpace* cs,
+ SkColorSpace* dstCS,
SkArenaAlloc* alloc,
const SkMatrix& ctm,
const SkPaint& paint,
@@ -276,25 +276,25 @@ bool SkShader::onAppendStages(SkRasterPipeline* p,
opaquePaint.writable()->setAlpha(SK_AlphaOPAQUE);
}
- ContextRec rec(*opaquePaint, ctm, localM, ContextRec::kPM4f_DstType, cs);
- if (Context* ctx = this->makeContext(rec, alloc)) {
- struct CallbackCtx : SkJumper_CallbackCtx {
- Context* ctx;
- };
-
- auto cb = alloc->make<CallbackCtx>();
- cb->ctx = ctx;
- cb->fn = [](SkJumper_CallbackCtx* self, int active_pixels) {
- auto c = (CallbackCtx*)self;
- int x = (int)c->rgba[0],
- y = (int)c->rgba[1];
- c->ctx->shadeSpan4f(x,y, (SkPM4f*)c->rgba, active_pixels);
- };
+ ContextRec rec(*opaquePaint, ctm, localM, ContextRec::kPM4f_DstType, dstCS);
+
+ struct CallbackCtx : SkJumper_CallbackCtx {
+ sk_sp<SkShader> shader;
+ Context* ctx;
+ };
+ auto cb = alloc->make<CallbackCtx>();
+ cb->shader = dstCS ? SkColorSpaceXformer::Make(sk_ref_sp(dstCS))->apply(this)
+ : sk_ref_sp(const_cast<SkShader*>(this));
+ cb->ctx = cb->shader->makeContext(rec, alloc);
+ cb->fn = [](SkJumper_CallbackCtx* self, int active_pixels) {
+ auto c = (CallbackCtx*)self;
+ int x = (int)c->rgba[0],
+ y = (int)c->rgba[1];
+ c->ctx->shadeSpan4f(x,y, (SkPM4f*)c->rgba, active_pixels);
+ };
+
+ if (cb->ctx) {
p->append(SkRasterPipeline::callback, cb);
-
- // Legacy shaders aren't aware of color spaces. We can pretty
- // safely assume they're in sRGB gamut.
- append_gamut_transform(p, alloc, SkColorSpace::MakeSRGB().get(), cs);
return true;
}
return false;