package com.marshalchen.common.uimodule.imageprocessing.filter.processing; import com.marshalchen.common.uimodule.imageprocessing.filter.CompositeFilter; import com.marshalchen.common.uimodule.imageprocessing.input.GLTextureOutputRenderer; import android.opengl.GLES20; /** * Applies an unsharp mask * blurSize: A multiplier for the underlying blur size, ranging from 0.0 on up * intensity: The strength of the sharpening, from 0.0 on up * @author Chris Batt */ public class UnsharpMaskFilter extends CompositeFilter { private static final String UNIFORM_INTENSITY = "u_Intensity"; private float intensity; private int intensityHandle; private GaussianBlurFilter blur; public UnsharpMaskFilter(float blurSize, float intensity) { super(2); this.intensity = intensity; blur = new GaussianBlurFilter(blurSize); blur.addTarget(this); registerInitialFilter(blur); registerTerminalFilter(blur); } @Override protected String getFragmentShader() { return "precision mediump float;\n" +"uniform sampler2D "+UNIFORM_TEXTURE0+";\n" +"uniform sampler2D "+UNIFORM_TEXTUREBASE+1+";\n" +"varying vec2 "+VARYING_TEXCOORD+";\n" +"uniform float "+UNIFORM_INTENSITY+";\n" +"void main(){\n" +" vec4 sharpImageColor = texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+");\n" +" vec4 blurredImageColor = texture2D("+UNIFORM_TEXTUREBASE+1+", "+VARYING_TEXCOORD+");\n" +" gl_FragColor = vec4(mix(sharpImageColor.rgb, blurredImageColor.rgb, "+UNIFORM_INTENSITY+"), sharpImageColor.a);\n" +"}\n"; } @Override protected void initShaderHandles() { super.initShaderHandles(); intensityHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_INTENSITY); } @Override public void newTextureReady(int texture, GLTextureOutputRenderer source, boolean newData) { if(filterLocations.size() < 2 || !filterLocations.contains(source)) { clearRegisteredFilterLocations(); registerFilterLocation(source, 0); registerFilterLocation(blur, 1); registerInputOutputFilter(source); } super.newTextureReady(texture, source, newData); } @Override protected void passShaderValues() { super.passShaderValues(); GLES20.glUniform1f(intensityHandle, intensity); } }