diff options
Diffstat (limited to 'src/effects/SkDisplacementMapEffect.cpp')
-rw-r--r-- | src/effects/SkDisplacementMapEffect.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 8d068072a7..4f6386d92e 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -279,7 +279,18 @@ sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* sou } SkIPoint displOffset = SkIPoint::Make(0, 0); - sk_sp<SkSpecialImage> displ(this->filterInput(0, source, ctx, &displOffset)); + // Creation of the displacement map should happen in a non-colorspace aware context. This + // texture is a purely mathematical construct, so we want to just operate on the stored + // values. Consider: + // User supplies an sRGB displacement map. If we're rendering to a wider gamut, then we could + // end up filtering the displacement map into that gamut, which has the effect of reducing + // the amount of displacement that it represents (as encoded values move away from the + // primaries). + // With a more complex DAG attached to this input, it's not clear that working in ANY specific + // color space makes sense, so we ignore color spaces (and gamma) entirely. This may not be + // ideal, but it's at least consistent and predictable. + Context displContext(ctx.ctm(), ctx.clipBounds(), ctx.cache(), OutputProperties(nullptr)); + sk_sp<SkSpecialImage> displ(this->filterInput(0, source, displContext, &displOffset)); if (!displ) { return nullptr; } |