aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders/gradients
diff options
context:
space:
mode:
Diffstat (limited to 'src/shaders/gradients')
-rw-r--r--src/shaders/gradients/SkGradientShader.cpp6
-rw-r--r--src/shaders/gradients/SkGradientShaderPriv.h5
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);