• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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