aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders/gradients/SkGradientShader.cpp
diff options
context:
space:
mode:
authorGravatar Brian Osman <brianosman@google.com>2017-10-25 12:52:31 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-10-25 18:17:06 +0000
commit5911a7cf214ccd824a8c7830f8e29f218c8fe422 (patch)
treeede6bf3861f421aee91ba2bcce1922f81f3fbb83 /src/shaders/gradients/SkGradientShader.cpp
parentcc58664e4063a44f9cd7921db86133ed84fffe30 (diff)
Remove GrColorSpaceXform from GrGradientEffect
Use a local xform to convert color stops for analytic gradients. For texture-based gradients, wrap the FP with an xform effect. To simplify this code, add a new AdjustFP helper to do the color xform, and also add the MulOutputByInputAlpha stage. Bug: skia: Change-Id: Icde19b5ec1c66aae76f894e9978c90a5f00c852e Reviewed-on: https://skia-review.googlesource.com/62500 Reviewed-by: Florin Malita <fmalita@chromium.org> Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src/shaders/gradients/SkGradientShader.cpp')
-rw-r--r--src/shaders/gradients/SkGradientShader.cpp32
1 files changed, 13 insertions, 19 deletions
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp
index 35e8342f7a..2e784bb987 100644
--- a/src/shaders/gradients/SkGradientShader.cpp
+++ b/src/shaders/gradients/SkGradientShader.cpp
@@ -1147,11 +1147,11 @@ SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
#if SK_SUPPORT_GPU
+#include "GrColorSpaceXform.h"
#include "GrContext.h"
#include "GrShaderCaps.h"
#include "GrTextureStripAtlas.h"
#include "gl/GrGLContext.h"
-#include "glsl/GrGLSLColorSpaceXformHelper.h"
#include "glsl/GrGLSLFragmentShaderBuilder.h"
#include "glsl/GrGLSLProgramDataManager.h"
#include "glsl/GrGLSLUniformHandler.h"
@@ -1254,9 +1254,6 @@ void GrGradientEffect::GLSLProcessor::onSetData(const GrGLSLProgramDataManager&
pdman.set1f(fFSYUni, yCoord);
fCachedYCoord = yCoord;
}
- if (SkToBool(e.fColorSpaceXform)) {
- fColorSpaceHelper.setData(pdman, e.fColorSpaceXform.get());
- }
break;
}
}
@@ -1295,8 +1292,6 @@ uint32_t GrGradientEffect::GLSLProcessor::GenBaseGradientKey(const GrProcessor&
break;
}
- key |= GrColorSpaceXform::XformKey(e.fColorSpaceXform.get()) << kReservedBits;
-
return key;
}
@@ -1409,9 +1404,10 @@ void GrGradientEffect::GLSLProcessor::emitAnalyticalColor(GrGLSLFPFragmentBuilde
if (GrGradientEffect::kAfterInterp_PremulType == ge.getPremulType()) {
fragBuilder->codeAppend("colorTemp.rgb *= colorTemp.a;");
}
- if (ge.fColorSpaceXform) {
- fragBuilder->codeAppend("colorTemp.rgb = clamp(colorTemp.rgb, 0, colorTemp.a);");
- }
+
+ // If the input colors were floats, or there was a color space xform, we may end up out of
+ // range. The simplest solution is to always clamp our (premul) value here.
+ fragBuilder->codeAppend("colorTemp.rgb = clamp(colorTemp.rgb, 0, colorTemp.a);");
fragBuilder->codeAppendf("%s = %s * colorTemp;", outputColor, inputColor);
}
@@ -1430,14 +1426,12 @@ void GrGradientEffect::GLSLProcessor::emitColor(GrGLSLFPFragmentBuilder* fragBui
return;
}
- fColorSpaceHelper.emitCode(uniformHandler, ge.fColorSpaceXform.get());
-
const char* fsyuni = uniformHandler->getUniformCStr(fFSYUni);
fragBuilder->codeAppendf("half2 coord = half2(%s, %s);", gradientTValue, fsyuni);
fragBuilder->codeAppendf("%s = ", outputColor);
fragBuilder->appendTextureLookupAndModulate(inputColor, texSamplers[0], "coord",
- kFloat2_GrSLType, &fColorSpaceHelper);
+ kFloat2_GrSLType);
fragBuilder->codeAppend(";");
}
@@ -1457,7 +1451,6 @@ GrGradientEffect::GrGradientEffect(ClassID classID, const CreateArgs& args, bool
fIsOpaque = shader.isOpaque();
fColorType = this->determineColorType(shader);
- fColorSpaceXform = std::move(args.fColorSpaceXform);
fWrapMode = args.fWrapMode;
if (kTexture_ColorType == fColorType) {
@@ -1471,10 +1464,12 @@ GrGradientEffect::GrGradientEffect(ClassID classID, const CreateArgs& args, bool
}
// Convert input colors to GrColor4f, possibly premul, and apply color space xform
+ auto colorSpaceXform = GrColorSpaceXform::Make(shader.fColorSpace.get(),
+ args.fDstColorSpace);
SkASSERT(shader.fOrigColors && shader.fOrigColors4f);
fColors4f.setCount(shader.fColorCount);
for (int i = 0; i < shader.fColorCount; ++i) {
- if (args.fGammaCorrect) {
+ if (args.fDstColorSpace) {
fColors4f[i] = GrColor4f::FromSkColor4f(shader.fOrigColors4f[i]);
} else {
GrColor grColor = SkColorToUnpremulGrColor(shader.fOrigColors[i]);
@@ -1485,9 +1480,9 @@ GrGradientEffect::GrGradientEffect(ClassID classID, const CreateArgs& args, bool
fColors4f[i] = fColors4f[i].premul();
}
- if (fColorSpaceXform) {
+ if (colorSpaceXform) {
// We defer clamping to after interpolation (see emitAnalyticalColor)
- fColors4f[i] = fColorSpaceXform->unclampedXform(fColors4f[i]);
+ fColors4f[i] = colorSpaceXform->unclampedXform(fColors4f[i]);
}
}
@@ -1512,7 +1507,7 @@ GrGradientEffect::GrGradientEffect(ClassID classID, const CreateArgs& args, bool
case kTexture_ColorType:
SkGradientShaderBase::GradientBitmapType bitmapType =
SkGradientShaderBase::GradientBitmapType::kLegacy;
- if (args.fGammaCorrect) {
+ if (args.fDstColorSpace) {
// Try to use F16 if we can
if (args.fContext->caps()->isConfigTexturable(kRGBA_half_GrPixelConfig)) {
bitmapType = SkGradientShaderBase::GradientBitmapType::kHalfFloat;
@@ -1580,7 +1575,6 @@ GrGradientEffect::GrGradientEffect(ClassID classID, const CreateArgs& args, bool
GrGradientEffect::GrGradientEffect(const GrGradientEffect& that)
: INHERITED(that.classID(), OptFlags(that.fIsOpaque))
, fColors4f(that.fColors4f)
- , fColorSpaceXform(that.fColorSpaceXform)
, fPositions(that.fPositions)
, fWrapMode(that.fWrapMode)
, fCoordTransform(that.fCoordTransform)
@@ -1634,7 +1628,7 @@ bool GrGradientEffect::onIsEqual(const GrFragmentProcessor& processor) const {
}
}
}
- return GrColorSpaceXform::Equals(this->fColorSpaceXform.get(), ge.fColorSpaceXform.get());
+ return true;
}
#if GR_TEST_UTILS