1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrGLSLColorSpaceXformHelper_DEFINED 9 #define GrGLSLColorSpaceXformHelper_DEFINED 10 11 #include "GrColorSpaceXform.h" 12 #include "GrGLSLUniformHandler.h" 13 14 /** 15 * Helper class to assist with using GrColorSpaceXform within an FP. This manages all of the 16 * uniforms needed, and can be passed to shader builder functions to automatically generate the 17 * correct color space transformation code. 18 */ 19 class GrGLSLColorSpaceXformHelper : public SkNoncopyable { 20 public: 21 GrGLSLColorSpaceXformHelper() : fFlags(0) {} 22 23 void emitCode(GrGLSLUniformHandler* uniformHandler, const GrColorSpaceXform* colorSpaceXform, 24 uint32_t visibility = kFragment_GrShaderFlag) { 25 SkASSERT(uniformHandler); 26 if (colorSpaceXform) { 27 fFlags = colorSpaceXform->fFlags; 28 if (this->applyGamutXform()) { 29 fGamutXformVar = uniformHandler->addUniform(visibility, 30 kHalf4x4_GrSLType, 31 "ColorXform"); 32 } 33 if (this->applyTransferFn()) { 34 fTransferFnVar = uniformHandler->addUniformArray(visibility, 35 kHalf_GrSLType, 36 "TransferFn", 37 kNumTransferFnCoeffs); 38 } 39 } 40 } 41 42 void setData(const GrGLSLProgramDataManager& pdman, const GrColorSpaceXform* colorSpaceXform) { 43 if (this->applyGamutXform()) { 44 pdman.setSkMatrix44(fGamutXformVar, colorSpaceXform->gamutXform()); 45 } 46 if (this->applyTransferFn()) { 47 pdman.set1fv(fTransferFnVar, kNumTransferFnCoeffs, colorSpaceXform->transferFnCoeffs()); 48 } 49 } 50 51 bool isValid() const { return (0 != fFlags); } 52 bool applyInverseSRGB() const { 53 return SkToBool(fFlags & GrColorSpaceXform::kApplyInverseSRGB_Flag); 54 } 55 bool applyTransferFn() const { 56 return SkToBool(fFlags & GrColorSpaceXform::kApplyTransferFn_Flag); 57 } 58 bool applyGamutXform() const { 59 return SkToBool(fFlags & GrColorSpaceXform::kApplyGamutXform_Flag); 60 } 61 62 GrGLSLProgramDataManager::UniformHandle gamutXformUniform() const { return fGamutXformVar; } 63 GrGLSLProgramDataManager::UniformHandle transferFnUniform() const { return fTransferFnVar; } 64 65 private: 66 static const int kNumTransferFnCoeffs = 7; 67 68 GrGLSLProgramDataManager::UniformHandle fGamutXformVar; 69 GrGLSLProgramDataManager::UniformHandle fTransferFnVar; 70 uint32_t fFlags; 71 }; 72 73 #endif 74