diff options
author | Brian Osman <brianosman@google.com> | 2017-10-30 13:47:41 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-10-31 14:55:14 +0000 |
commit | f06ead925c631c42fae734de1e7c72237a2e91f4 (patch) | |
tree | d2ae0175607b41087df6bcc55d6fe4342eecc739 /src/effects | |
parent | 761f44853fcead7e7a105e1870cb970646814058 (diff) |
Add support for transfer functions to GrColorSpaceXform
With this change, untagged sources (eg N32) are treated as
sRGB data, which causes a huge number of GMs to render more
correctly in GPU sRGB/F16/etc... configs. Also, because the
sources are treated as having a color space, we actually do
gamut conversion for wide or narrow gamut outputs.
This change also applies the transfer function math to
individual colors in the case of gradient stops and color
shaders. (The CPU backend doesn't do this yet, but I think
we've decided there's no reason not to support it).
Bug: skia:
Change-Id: If76e9e4a268f9f74110ff4bbe4fe189ba5d19d9f
Reviewed-on: https://skia-review.googlesource.com/64100
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkAlphaThresholdFilter.cpp | 3 | ||||
-rw-r--r-- | src/effects/SkArithmeticImageFilter.cpp | 6 | ||||
-rw-r--r-- | src/effects/SkDisplacementMapEffect.cpp | 4 | ||||
-rw-r--r-- | src/effects/SkMagnifierImageFilter.cpp | 3 | ||||
-rw-r--r-- | src/effects/SkXfermodeImageFilter.cpp | 6 |
5 files changed, 15 insertions, 7 deletions
diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp index fa77c85bf9..e7dfa5f252 100644 --- a/src/effects/SkAlphaThresholdFilter.cpp +++ b/src/effects/SkAlphaThresholdFilter.cpp @@ -172,9 +172,10 @@ sk_sp<SkSpecialImage> SkAlphaThresholdFilterImpl::onFilterImage(SkSpecialImage* } const OutputProperties& outProps = ctx.outputProperties(); + GrPixelConfig inputConfig = inputProxy->config(); auto textureFP = GrSimpleTextureEffect::Make(std::move(inputProxy), SkMatrix::I()); textureFP = GrColorSpaceXformEffect::Make(std::move(textureFP), input->getColorSpace(), - outProps.colorSpace()); + inputConfig, outProps.colorSpace()); if (!textureFP) { return nullptr; } diff --git a/src/effects/SkArithmeticImageFilter.cpp b/src/effects/SkArithmeticImageFilter.cpp index 0ef40a23d9..a4d6ffe7dd 100644 --- a/src/effects/SkArithmeticImageFilter.cpp +++ b/src/effects/SkArithmeticImageFilter.cpp @@ -306,12 +306,13 @@ sk_sp<SkSpecialImage> ArithmeticImageFilterImpl::filterImageGPU( if (backgroundProxy) { SkMatrix backgroundMatrix = SkMatrix::MakeTrans(-SkIntToScalar(backgroundOffset.fX), -SkIntToScalar(backgroundOffset.fY)); + GrPixelConfig bgConfig = backgroundProxy->config(); bgFP = GrTextureDomainEffect::Make( std::move(backgroundProxy), backgroundMatrix, GrTextureDomain::MakeTexelDomain(background->subset()), GrTextureDomain::kDecal_Mode, GrSamplerState::Filter::kNearest); bgFP = GrColorSpaceXformEffect::Make(std::move(bgFP), background->getColorSpace(), - outputProperties.colorSpace()); + bgConfig, outputProperties.colorSpace()); } else { bgFP = GrConstColorProcessor::Make(GrColor4f::TransparentBlack(), GrConstColorProcessor::kIgnore_InputMode); @@ -320,12 +321,13 @@ sk_sp<SkSpecialImage> ArithmeticImageFilterImpl::filterImageGPU( if (foregroundProxy) { SkMatrix foregroundMatrix = SkMatrix::MakeTrans(-SkIntToScalar(foregroundOffset.fX), -SkIntToScalar(foregroundOffset.fY)); + GrPixelConfig fgConfig = foregroundProxy->config(); auto foregroundFP = GrTextureDomainEffect::Make( std::move(foregroundProxy), foregroundMatrix, GrTextureDomain::MakeTexelDomain(foreground->subset()), GrTextureDomain::kDecal_Mode, GrSamplerState::Filter::kNearest); foregroundFP = GrColorSpaceXformEffect::Make(std::move(foregroundFP), - foreground->getColorSpace(), + foreground->getColorSpace(), fgConfig, outputProperties.colorSpace()); paint.addColorFragmentProcessor(std::move(foregroundFP)); diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index 1cdd0ce231..09aaf7cc4b 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -286,6 +286,7 @@ sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* sou SkIntToScalar(colorOffset.fY - displOffset.fY)); SkColorSpace* colorSpace = ctx.outputProperties().colorSpace(); + GrPixelConfig colorConfig = colorProxy->config(); std::unique_ptr<GrFragmentProcessor> fp = GrDisplacementMapEffect::Make(fXChannelSelector, fYChannelSelector, @@ -294,7 +295,8 @@ sk_sp<SkSpecialImage> SkDisplacementMapEffect::onFilterImage(SkSpecialImage* sou offsetMatrix, std::move(colorProxy), SkISize::Make(color->width(), color->height())); - fp = GrColorSpaceXformEffect::Make(std::move(fp), color->getColorSpace(), colorSpace); + fp = GrColorSpaceXformEffect::Make(std::move(fp), color->getColorSpace(), colorConfig, + colorSpace); GrPaint paint; paint.addColorFragmentProcessor(std::move(fp)); diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp index bb0e7ed4fb..dd5714ba75 100644 --- a/src/effects/SkMagnifierImageFilter.cpp +++ b/src/effects/SkMagnifierImageFilter.cpp @@ -355,6 +355,7 @@ sk_sp<SkSpecialImage> SkMagnifierImageFilter::onFilterImage(SkSpecialImage* sour offset->fY = bounds.top(); bounds.offset(-inputOffset); + GrPixelConfig inputConfig = inputProxy->config(); auto fp = GrMagnifierEffect::Make(std::move(inputProxy), bounds, fSrcRect, @@ -363,7 +364,7 @@ sk_sp<SkSpecialImage> SkMagnifierImageFilter::onFilterImage(SkSpecialImage* sour bounds.width() * invInset, bounds.height() * invInset); fp = GrColorSpaceXformEffect::Make(std::move(fp), input->getColorSpace(), - ctx.outputProperties().colorSpace()); + inputConfig, ctx.outputProperties().colorSpace()); if (!fp) { return nullptr; } diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index 1fb4cdef7b..111dc61a56 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -295,12 +295,13 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter_Base::filterImageGPU( if (backgroundProxy) { SkMatrix bgMatrix = SkMatrix::MakeTrans(-SkIntToScalar(backgroundOffset.fX), -SkIntToScalar(backgroundOffset.fY)); + GrPixelConfig bgConfig = backgroundProxy->config(); bgFP = GrTextureDomainEffect::Make(std::move(backgroundProxy), bgMatrix, GrTextureDomain::MakeTexelDomain(background->subset()), GrTextureDomain::kDecal_Mode, GrSamplerState::Filter::kNearest); bgFP = GrColorSpaceXformEffect::Make(std::move(bgFP), background->getColorSpace(), - outputProperties.colorSpace()); + bgConfig, outputProperties.colorSpace()); } else { bgFP = GrConstColorProcessor::Make(GrColor4f::TransparentBlack(), GrConstColorProcessor::kIgnore_InputMode); @@ -309,12 +310,13 @@ sk_sp<SkSpecialImage> SkXfermodeImageFilter_Base::filterImageGPU( if (foregroundProxy) { SkMatrix fgMatrix = SkMatrix::MakeTrans(-SkIntToScalar(foregroundOffset.fX), -SkIntToScalar(foregroundOffset.fY)); + GrPixelConfig fgConfig = foregroundProxy->config(); auto foregroundFP = GrTextureDomainEffect::Make( std::move(foregroundProxy), fgMatrix, GrTextureDomain::MakeTexelDomain(foreground->subset()), GrTextureDomain::kDecal_Mode, GrSamplerState::Filter::kNearest); foregroundFP = GrColorSpaceXformEffect::Make(std::move(foregroundFP), - foreground->getColorSpace(), + foreground->getColorSpace(), fgConfig, outputProperties.colorSpace()); paint.addColorFragmentProcessor(std::move(foregroundFP)); |