154f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman/* 254f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman * Copyright 2016 Google Inc. 354f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman * 454f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman * Use of this source code is governed by a BSD-style license that can be 554f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman * found in the LICENSE file. 654f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman */ 754f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman 854f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman#ifndef GrGLSLColorSpaceXformHelper_DEFINED 954f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman#define GrGLSLColorSpaceXformHelper_DEFINED 1054f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman 1177320dbabcddf05c0a1489eaf1f496729dc8de0ebrianosman#include "GrColorSpaceXform.h" 1254f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman#include "GrGLSLUniformHandler.h" 1354f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman 1454f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman/** 15c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman * Helper class to assist with using GrColorSpaceXform within an FP. This manages all of the 16c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman * uniforms needed, and can be passed to shader builder functions to automatically generate the 17c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman * correct color space transformation code. 1854f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman */ 1954f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosmanclass GrGLSLColorSpaceXformHelper : public SkNoncopyable { 2054f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosmanpublic: 21c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman GrGLSLColorSpaceXformHelper() : fValid(false) {} 22c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman 23c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman void emitCode(GrGLSLUniformHandler* uniformHandler, GrColorSpaceXform* colorSpaceXform) { 24c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman SkASSERT(uniformHandler); 2554f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman if (colorSpaceXform) { 26c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman fGamutXformVar = uniformHandler->addUniform(kFragment_GrShaderFlag, kMat44f_GrSLType, 27c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman kDefault_GrSLPrecision, "ColorXform"); 28c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman fValid = true; 2954f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman } 3054f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman } 3154f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman 32c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman void setData(const GrGLSLProgramDataManager& pdman, GrColorSpaceXform* colorSpaceXform) { 33c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman pdman.setSkMatrix44(fGamutXformVar, colorSpaceXform->srcToDst()); 34c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman } 35c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman 36c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman bool isValid() const { return fValid; } 37c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman GrGLSLProgramDataManager::UniformHandle const gamutXformUniform() { return fGamutXformVar; } 3854f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman 3954f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosmanprivate: 40c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman GrGLSLProgramDataManager::UniformHandle fGamutXformVar; 41c624d9d212c4168fc6c202a8535ddff8a3bfb16aBrian Osman bool fValid; 4254f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman}; 4354f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman 4454f30c13fc0a5d89797fc9be5f0fb1050d96b6f4brianosman#endif 45