/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGLSLColorSpaceXformHelper_DEFINED #define GrGLSLColorSpaceXformHelper_DEFINED #include "GrColorSpaceXform.h" #include "GrGLSLUniformHandler.h" /** * Helper class to assist with using GrColorSpaceXform within an FP. This manages all of the * uniforms needed, and can be passed to shader builder functions to automatically generate the * correct color space transformation code. */ class GrGLSLColorSpaceXformHelper : public SkNoncopyable { public: GrGLSLColorSpaceXformHelper() : fFlags(0) {} void emitCode(GrGLSLUniformHandler* uniformHandler, const GrColorSpaceXform* colorSpaceXform, uint32_t visibility = kFragment_GrShaderFlag) { SkASSERT(uniformHandler); if (colorSpaceXform) { 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) { if (this->applyGamutXform()) { pdman.setSkMatrix44(fGamutXformVar, colorSpaceXform->gamutXform()); } if (this->applyTransferFn()) { pdman.set1fv(fTransferFnVar, kNumTransferFnCoeffs, colorSpaceXform->transferFnCoeffs()); } } 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; GrGLSLProgramDataManager::UniformHandle fTransferFnVar; uint32_t fFlags; }; #endif