Home | History | Annotate | Download | only in glsl
      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