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