package com.marshalchen.common.uimodule.imageprocessing.filter.effect; import com.marshalchen.common.uimodule.imageprocessing.filter.BasicFilter; import android.opengl.GLES20; /** * This converts an image into a black-and-white crosshatch pattern * crossHatchSpacing: The fractional width of the image to use as the spacing for the crosshatch. * lineWidth: A relative width for the crosshatch lines. * @author Chris Batt */ public class CrosshatchFilter extends BasicFilter { protected static final String UNIFORM_CROSS_HATCH_SPACING = "u_CrossHatchSpacing"; protected static final String UNIFORM_LINE_WIDTH = "u_LineWidth"; private int crossHatchSpacingHandle; private int lineWidthHandle; private float crossHatchSpacing; private float lineWidth; public CrosshatchFilter(float crossHatchSpacing, float lineWidth) { this.crossHatchSpacing = crossHatchSpacing; this.lineWidth = lineWidth; } @Override protected String getFragmentShader() { return "precision mediump float;\n" +"uniform sampler2D "+UNIFORM_TEXTURE0+";\n" +"varying vec2 "+VARYING_TEXCOORD+";\n" +"uniform float "+UNIFORM_CROSS_HATCH_SPACING+";\n" +"uniform float "+UNIFORM_LINE_WIDTH+";\n" +"const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);\n" +"void main(){\n" +" highp float luminance = dot(texture2D("+UNIFORM_TEXTURE0+", "+VARYING_TEXCOORD+").rgb, W);\n" +" lowp vec4 colorToDisplay = vec4(1.0, 1.0, 1.0, 1.0);\n" +" if (luminance < 1.00) {\n" +" if (mod("+VARYING_TEXCOORD+".x + "+VARYING_TEXCOORD+".y, "+UNIFORM_CROSS_HATCH_SPACING+") <= "+UNIFORM_LINE_WIDTH+") {\n" +" colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0);\n" +" }\n" +" }\n" +" if (luminance < 0.75) {\n" +" if (mod("+VARYING_TEXCOORD+".x - "+VARYING_TEXCOORD+".y, "+UNIFORM_CROSS_HATCH_SPACING+") <= "+UNIFORM_LINE_WIDTH+") {\n" +" colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0);\n" +" }\n" +" }\n" +" if (luminance < 0.50) {\n" +" if (mod("+VARYING_TEXCOORD+".x + "+VARYING_TEXCOORD+".y - ("+UNIFORM_CROSS_HATCH_SPACING+" / 2.0), "+UNIFORM_CROSS_HATCH_SPACING+") <= "+UNIFORM_LINE_WIDTH+") {\n" +" colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0);\n" +" }\n" +" }\n" +" if (luminance < 0.3) {\n" +" if (mod("+VARYING_TEXCOORD+".x - "+VARYING_TEXCOORD+".y - ("+UNIFORM_CROSS_HATCH_SPACING+" / 2.0), "+UNIFORM_CROSS_HATCH_SPACING+") <= "+UNIFORM_LINE_WIDTH+") {\n" +" colorToDisplay = vec4(0.0, 0.0, 0.0, 1.0);\n" +" }\n" +" }\n" +" gl_FragColor = colorToDisplay;\n" +"}\n"; } @Override protected void initShaderHandles() { super.initShaderHandles(); crossHatchSpacingHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_CROSS_HATCH_SPACING); lineWidthHandle = GLES20.glGetUniformLocation(programHandle, UNIFORM_LINE_WIDTH); } @Override protected void passShaderValues() { super.passShaderValues(); GLES20.glUniform1f(crossHatchSpacingHandle, crossHatchSpacing); GLES20.glUniform1f(lineWidthHandle, lineWidth); } }