
kernel vec4 ciOutputKernel(sampler image, float inputMatrixEnable, vec3 inputRedMat, vec3 inputGreenMat, vec3 inputBlueMat, float inputGamma, float inputProcEnable, float inputProcLift, float inputProcGain, float inputClipLo, float inputClipHi)
{
	vec4 inPix = sample(image, samplerCoord(image));
	vec3 outPix;

    outPix.r = (inputMatrixEnable>0.0) ? ((inPix.r * inputRedMat.r) + (inPix.g * inputRedMat.g) + (inPix.b * inputRedMat.b)) : inPix.r;
    outPix.g = (inputMatrixEnable>0.0) ? ((inPix.r * inputGreenMat.r) + (inPix.g * inputGreenMat.g) + (inPix.b * inputGreenMat.b)) : inPix.g;
    outPix.b = (inputMatrixEnable>0.0) ? ((inPix.r * inputBlueMat.r) + (inPix.g * inputBlueMat.g) + (inPix.b * inputBlueMat.b)) : inPix.b;

	outPix.rgb = (inputGamma>0.0) ? clamp(outPix.rgb, 0.0, 1.0) : outPix.rgb;
	outPix.r = (inputGamma>0.0) ? pow(outPix.r, inputGamma) : outPix.r;
	outPix.g = (inputGamma>0.0) ? pow(outPix.g, inputGamma) : outPix.g;
	outPix.b = (inputGamma>0.0) ? pow(outPix.b, inputGamma) : outPix.b;

    outPix.rgb = (inputProcEnable<0.0) ? (outPix.rgb + inputProcLift) * inputProcGain : outPix.rgb;
    outPix.rgb = (inputProcEnable>0.0) ? (outPix.rgb * inputProcGain) + inputProcLift : outPix.rgb;
    
	outPix.rgb = clamp(outPix.rgb, inputClipLo, inputClipHi);

	return vec4(outPix.rgb, inPix.a);
}
