diff options
Diffstat (limited to 'src/gpu/glsl/GrGLSLColorSpaceXformHelper.h')
-rw-r--r-- | src/gpu/glsl/GrGLSLColorSpaceXformHelper.h | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/src/gpu/glsl/GrGLSLColorSpaceXformHelper.h b/src/gpu/glsl/GrGLSLColorSpaceXformHelper.h index f9ac30b6aa..527de91c50 100644 --- a/src/gpu/glsl/GrGLSLColorSpaceXformHelper.h +++ b/src/gpu/glsl/GrGLSLColorSpaceXformHelper.h @@ -18,28 +18,56 @@ */ class GrGLSLColorSpaceXformHelper : public SkNoncopyable { public: - GrGLSLColorSpaceXformHelper() : fValid(false) {} + GrGLSLColorSpaceXformHelper() : fFlags(0) {} void emitCode(GrGLSLUniformHandler* uniformHandler, const GrColorSpaceXform* colorSpaceXform, uint32_t visibility = kFragment_GrShaderFlag) { SkASSERT(uniformHandler); if (colorSpaceXform) { - fGamutXformVar = uniformHandler->addUniform(visibility, kHalf4x4_GrSLType, - "ColorXform"); - fValid = true; + fFlags = colorSpaceXform->fFlags; + if (this->applyGamutXform()) { + fGamutXformVar = uniformHandler->addUniform(visibility, + kHalf4x4_GrSLType, + "ColorXform"); + } + if (this->applyTransferFn()) { + fTransferFnVar = uniformHandler->addUniformArray(visibility, + kHalf_GrSLType, + "TransferFn", + kNumTransferFnCoeffs); + } } } void setData(const GrGLSLProgramDataManager& pdman, const GrColorSpaceXform* colorSpaceXform) { - pdman.setSkMatrix44(fGamutXformVar, colorSpaceXform->srcToDst()); + if (this->applyGamutXform()) { + pdman.setSkMatrix44(fGamutXformVar, colorSpaceXform->gamutXform()); + } + if (this->applyTransferFn()) { + pdman.set1fv(fTransferFnVar, kNumTransferFnCoeffs, colorSpaceXform->transferFnCoeffs()); + } } - bool isValid() const { return fValid; } - GrGLSLProgramDataManager::UniformHandle const gamutXformUniform() { return fGamutXformVar; } + bool isValid() const { return (0 != fFlags); } + bool applyInverseSRGB() const { + return SkToBool(fFlags & GrColorSpaceXform::kApplyInverseSRGB_Flag); + } + bool applyTransferFn() const { + return SkToBool(fFlags & GrColorSpaceXform::kApplyTransferFn_Flag); + } + bool applyGamutXform() const { + return SkToBool(fFlags & GrColorSpaceXform::kApplyGamutXform_Flag); + } + + GrGLSLProgramDataManager::UniformHandle gamutXformUniform() const { return fGamutXformVar; } + GrGLSLProgramDataManager::UniformHandle transferFnUniform() const { return fTransferFnVar; } private: + static const int kNumTransferFnCoeffs = 7; + GrGLSLProgramDataManager::UniformHandle fGamutXformVar; - bool fValid; + GrGLSLProgramDataManager::UniformHandle fTransferFnVar; + uint32_t fFlags; }; #endif |