package jp.co.cyberagent.android.gpuimage;
import android.opengl.GLES20;
/**
* Created by vashisthg 30/05/14.
*/
public class GPUImageLevelsFilter extends GPUImageFilter{
private static final String LOGTAG = GPUImageLevelsFilter.class.getSimpleName();
public static final String LEVELS_FRAGMET_SHADER =
" varying highp vec2 textureCoordinate;\n" +
" \n" +
" uniform sampler2D inputImageTexture;\n" +
" uniform mediump vec3 levelMinimum;\n" +
" uniform mediump vec3 levelMiddle;\n" +
" uniform mediump vec3 levelMaximum;\n" +
" uniform mediump vec3 minOutput;\n" +
" uniform mediump vec3 maxOutput;\n" +
" \n" +
" void main()\n" +
" {\n" +
" mediump vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" +
" \n" +
" gl_FragColor = vec4( mix(minOutput, maxOutput, pow(min(max(textureColor.rgb -levelMinimum, vec3(0.0)) / (levelMaximum - levelMinimum ), vec3(1.0)), 1.0 /levelMiddle)) , textureColor.a);\n" +
" }\n";
private int mMinLocation;
private float[] mMin;
private int mMidLocation;
private float[] mMid;
private int mMaxLocation;
private float[] mMax;
private int mMinOutputLocation;
private float[] mMinOutput;
private int mMaxOutputLocation;
private float[] mMaxOutput;
public GPUImageLevelsFilter() {
this(new float[] {0.0f,0.0f,0.0f}, new float[] {1.0f, 1.0f, 1.0f }, new float[] {1.0f, 1.0f ,1.0f}, new float[] {0.0f, 0.0f, 0.0f}, new float[] {1.0f,1.0f,1.0f});
}
private GPUImageLevelsFilter(final float[] min, final float[] mid, final float[] max, final float[] minOUt, final float[] maxOut) {
super(NO_FILTER_VERTEX_SHADER, LEVELS_FRAGMET_SHADER);
mMin = min;
mMid = mid;
mMax = max;
mMinOutput = minOUt;
mMaxOutput = maxOut;
setMin(0.0f, 1.0f, 1.0f, 0.0f, 1.0f);
}
@Override
public void onInit() {
super.onInit();
mMinLocation = GLES20.glGetUniformLocation(getProgram(), "levelMinimum");
mMidLocation = GLES20.glGetUniformLocation(getProgram(), "levelMiddle");
mMaxLocation = GLES20.glGetUniformLocation(getProgram(), "levelMaximum");
mMinOutputLocation = GLES20.glGetUniformLocation(getProgram(), "minOutput");
mMaxOutputLocation = GLES20.glGetUniformLocation(getProgram(), "maxOutput");
}
@Override
public void onInitialized() {
super.onInitialized();
updateUniforms();
}
public void updateUniforms () {
setFloatVec3(mMinLocation, mMin);
setFloatVec3(mMidLocation, mMid);
setFloatVec3(mMaxLocation, mMax);
setFloatVec3(mMinOutputLocation, mMinOutput);
setFloatVec3(mMaxOutputLocation, mMaxOutput);
}
public void setMin(float min, float mid , float max ,float minOut , float maxOut) {
setRedMin(min, mid, max, minOut, maxOut);
setGreenMin(min, mid, max, minOut, maxOut);
setBlueMin(min, mid, max, minOut, maxOut);
}
public void setMin(float min, float mid , float max ) {
setMin(min, mid, max, 0.0f, 1.0f);
}
public void setRedMin(float min, float mid , float max ,float minOut , float maxOut) {
mMin[0] = min;
mMid[0] = mid;
mMax[0] = max;
mMinOutput[0] = minOut;
mMaxOutput[0] = maxOut;
updateUniforms();
}
public void setRedMin(float min, float mid , float max ){
setRedMin(min, mid, max, 0, 1);
}
public void setGreenMin(float min, float mid , float max ,float minOut , float maxOut) {
mMin[1] = min;
mMid[1] = mid;
mMax[1] = max;
mMinOutput[1] = minOut;
mMaxOutput[1] = maxOut;
updateUniforms();
}
public void setGreenMin(float min, float mid , float max ){
setGreenMin(min, mid, max, 0, 1);
}
public void setBlueMin(float min, float mid , float max ,float minOut , float maxOut) {
mMin[2] = min;
mMid[2] = mid;
mMax[2] = max;
mMinOutput[2] = minOut;
mMaxOutput[2] = maxOut;
updateUniforms();
}
public void setBlueMin(float min, float mid , float max ){
setBlueMin(min, mid, max, 0, 1);
}
}