GrGLSLColorSpaceXformHelper.h 3.1 KB

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