Index: src/effects/SkDisplacementMapEffect.cpp |
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp |
index 8d068072a7454dd0f1f914ecdcae587d86b815f7..4f6386d92e94c478bf3bca6938768fd5a46a48a0 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; |
} |