package com.marshalchen.common.uimodule.imageprocessing.filter.colour;
import com.marshalchen.common.uimodule.imageprocessing.filter.BasicFilter;
import android.opengl.GLES20;
/**
* Converts the image to a single-color version, based on the luminance of each pixel
* intensity: The degree to which the specific color replaces the normal image color (0.0 - 1.0)
* color: The color to use as the basis for the effect
* @author Chris Batt
*/
public class MonochromeFilter extends BasicFilter {
private static final String UNIFORM_INTENSITY = "u_Intensity";
private static final String UNIFORM_COLOUR = "u_Colour";
private int intensityHandle;
private int colourHandle;
private float intensity;
private float[] colour;
public MonochromeFilter(float[] colour, float intensity) {
this.intensity = intensity;
this.colour = colour;
}
@Override
protected String getFragmentShader() {
return
"precision mediump float;\n"
+"uniform sampler2D "+UNIFORM_TEXTURE0+";\n"
+"varying vec2 "+VARYING_TEXCOORD+";\n"
+"uniform float "+UNIFORM_INTENSITY+";\n"
+"uniform vec3 "+UNIFORM_COLOUR+";\n"
+"vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n"
+"void main(){\n"
+" vec4 color = texture2D("+UNIFORM_TEXTURE0+","+VARYING_TEXCOORD+");\n"
+" float luminance = dot(color.rgb, luminanceWeighting);\n"
+" vec4 desat = vec4(vec3(luminance), 1.0);\n"
+" vec4 outputColour = vec4(\n"
+" (desat.r < 0.5 ? (2.0 * desat.r * "+UNIFORM_COLOUR+".r) : (1.0 - 2.0 * (1.0 - desat.r) * (1.0 - "+UNIFORM_COLOUR+".r))),\n"
+" (desat.g < 0.5 ? (2.0 * desat.g * "+UNIFORM_COLOUR+".g) : (1.0 - 2.0 * (1.0 - desat.g) * (1.0 - "+UNIFORM_COLOUR+".g))),\n"
+" (desat.b < 0.5 ? (2.0 * desat.b * "+UNIFORM_COLOUR+".b) : (1.0 - 2.0 * (1.0 - desat.b) * (1.0 - "+UNIFORM_COLOUR+".b))),\n"
+" 1.0);\n"
+" gl_FragColor = vec4(mix(color.rgb, outputColour.rgb, "+UNIFORM_INTENSITY+"), color.a);\n"
+"}\n";
}
@Override
protected void initShaderHandles() {
super.initShaderHandles();
intensityHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_INTENSITY);
colourHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_COLOUR);
}
@Override
protected void passShaderValues() {
super.passShaderValues();
GLES20.glUniform1f(intensityHandle, intensity);
GLES20.glUniform3f(colourHandle, colour[0], colour[1], colour[2]);
}
}