diff options
Diffstat (limited to 'src/shaders/gradients')
-rw-r--r-- | src/shaders/gradients/SkGradientShader.cpp | 6 | ||||
-rw-r--r-- | src/shaders/gradients/SkGradientShaderPriv.h | 5 |
2 files changed, 10 insertions, 1 deletions
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp index 7d31e50f84..279491b177 100644 --- a/src/shaders/gradients/SkGradientShader.cpp +++ b/src/shaders/gradients/SkGradientShader.cpp @@ -184,6 +184,7 @@ SkGradientShaderBase::SkGradientShaderBase(const Descriptor& desc, const SkMatri fColorSpace = SkColorSpace::MakeSRGBLinear(); } else { // The color space refers to the float colors, so it must be linear gamma + // TODO: GPU code no longer requires this (see GrGradientEffect). Remove this restriction? SkASSERT(desc.fColorSpace->gammaIsLinear()); fColorSpace = desc.fColorSpace; } @@ -1260,8 +1261,11 @@ GrGradientEffect::GrGradientEffect(ClassID classID, const CreateArgs& args, bool fPremulType = kAfterInterp_PremulType; } - // Convert input colors to GrColor4f, possibly premul, and apply color space xform + // Convert input colors to GrColor4f, possibly premul, and apply color space xform. + // The xform is constructed assuming floats as input, but the color space can have a + // transfer function on it, which will be applied below. auto colorSpaceXform = GrColorSpaceXform::Make(shader.fColorSpace.get(), + kRGBA_float_GrPixelConfig, args.fDstColorSpace); SkASSERT(shader.fOrigColors && shader.fOrigColors4f); fColors4f.setCount(shader.fColorCount); diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h index 8fabc5c4fd..0d8e7bef9a 100644 --- a/src/shaders/gradients/SkGradientShaderPriv.h +++ b/src/shaders/gradients/SkGradientShaderPriv.h @@ -277,8 +277,13 @@ protected: // xform is needed. With texture-based gradients, we leave the data in the source color // space (to avoid clamping if we can't use F16)... Add an extra FP to do the xform. if (kTexture_ColorType == gradientFP->getColorType()) { + // Our texture is always either F16 or sRGB, so the data is "linear" in the shader. + // Create our xform assuming float inputs, which will suppress any extra sRGB work. + // We do support having a transfer function on the color space of the stops, so + // this FP may include that transformation. fp = GrColorSpaceXformEffect::Make(std::move(gradientFP), args.fShader->fColorSpace.get(), + kRGBA_float_GrPixelConfig, args.fDstColorSpace); } else { fp = std::move(gradientFP); |