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 "src/core/SkColorSpaceXformSteps.h" 12 #include "src/gpu/GrColorSpaceXform.h" 13 #include "src/gpu/glsl/GrGLSLUniformHandler.h" 14 15 /** 16 * Helper class to assist with using GrColorSpaceXform within an FP. This manages all of the 17 * uniforms needed, and can be passed to shader builder functions to automatically generate the 18 * correct color space transformation code. 19 */ 20 class GrGLSLColorSpaceXformHelper : public SkNoncopyable { 21 public: GrGLSLColorSpaceXformHelper()22 GrGLSLColorSpaceXformHelper() { 23 memset(&fFlags, 0, sizeof(fFlags)); 24 } 25 26 void emitCode(GrGLSLUniformHandler* uniformHandler, const GrColorSpaceXform* colorSpaceXform, 27 uint32_t visibility = kFragment_GrShaderFlag) { 28 SkASSERT(uniformHandler); 29 if (colorSpaceXform) { 30 fFlags = colorSpaceXform->fSteps.flags; 31 if (this->applySrcTF()) { 32 fSrcTFVar = uniformHandler->addUniformArray(visibility, kHalf_GrSLType, 33 "SrcTF", kNumTransferFnCoeffs); 34 } 35 if (this->applyGamutXform()) { 36 fGamutXformVar = uniformHandler->addUniform(visibility, kHalf3x3_GrSLType, 37 "ColorXform"); 38 } 39 if (this->applyDstTF()) { 40 fDstTFVar = uniformHandler->addUniformArray(visibility, kHalf_GrSLType, 41 "DstTF", kNumTransferFnCoeffs); 42 } 43 } 44 } 45 setData(const GrGLSLProgramDataManager & pdman,const GrColorSpaceXform * colorSpaceXform)46 void setData(const GrGLSLProgramDataManager& pdman, const GrColorSpaceXform* colorSpaceXform) { 47 if (this->applySrcTF()) { 48 pdman.set1fv(fSrcTFVar, kNumTransferFnCoeffs, &colorSpaceXform->fSteps.srcTF.g); 49 } 50 if (this->applyGamutXform()) { 51 pdman.setMatrix3f(fGamutXformVar, colorSpaceXform->fSteps.src_to_dst_matrix); 52 } 53 if (this->applyDstTF()) { 54 pdman.set1fv(fDstTFVar, kNumTransferFnCoeffs, &colorSpaceXform->fSteps.dstTFInv.g); 55 } 56 } 57 isNoop()58 bool isNoop() const { return (0 == fFlags.mask()); } 59 applyUnpremul()60 bool applyUnpremul() const { return fFlags.unpremul; } applySrcTF()61 bool applySrcTF() const { return fFlags.linearize; } applyGamutXform()62 bool applyGamutXform() const { return fFlags.gamut_transform; } applyDstTF()63 bool applyDstTF() const { return fFlags.encode; } applyPremul()64 bool applyPremul() const { return fFlags.premul; } 65 srcTFUniform()66 GrGLSLProgramDataManager::UniformHandle srcTFUniform() const { return fSrcTFVar; } gamutXformUniform()67 GrGLSLProgramDataManager::UniformHandle gamutXformUniform() const { return fGamutXformVar; } dstTFUniform()68 GrGLSLProgramDataManager::UniformHandle dstTFUniform() const { return fDstTFVar; } 69 70 private: 71 static const int kNumTransferFnCoeffs = 7; 72 73 GrGLSLProgramDataManager::UniformHandle fSrcTFVar; 74 GrGLSLProgramDataManager::UniformHandle fGamutXformVar; 75 GrGLSLProgramDataManager::UniformHandle fDstTFVar; 76 SkColorSpaceXformSteps::Flags fFlags; 77 }; 78 79 #endif 80