package com.marshalchen.common.uimodule.imageprocessing.filter.effect; import com.marshalchen.common.uimodule.imageprocessing.filter.BasicFilter; /** * Simulates the colorspace of a CGA monitor * @author Chris Batt */ public class CGAColourSpaceFilter extends BasicFilter { @Override protected String getFragmentShader() { return "precision mediump float;\n" +"uniform sampler2D "+UNIFORM_TEXTURE0+";\n" +"varying vec2 "+VARYING_TEXCOORD+";\n" +"void main() {\n" +" highp vec2 sampleDivisor = vec2(1.0 / 200.0, 1.0 / 320.0);\n" +" highp vec2 samplePos = "+VARYING_TEXCOORD+" - mod("+VARYING_TEXCOORD+", sampleDivisor);\n" +" highp vec4 color = texture2D("+UNIFORM_TEXTURE0+", samplePos );\n" +" mediump vec4 colorCyan = vec4(85.0 / 255.0, 1.0, 1.0, 1.0);\n" +" mediump vec4 colorMagenta = vec4(1.0, 85.0 / 255.0, 1.0, 1.0);\n" +" mediump vec4 colorWhite = vec4(1.0, 1.0, 1.0, 1.0);\n" +" mediump vec4 colorBlack = vec4(0.0, 0.0, 0.0, 1.0);\n" +" mediump vec4 endColor;\n" +" highp float blackDistance = distance(color, colorBlack);\n" +" highp float whiteDistance = distance(color, colorWhite);\n" +" highp float magentaDistance = distance(color, colorMagenta);\n" +" highp float cyanDistance = distance(color, colorCyan);\n" +" mediump vec4 finalColor;\n" +" highp float colorDistance = min(magentaDistance, cyanDistance);\n" +" colorDistance = min(colorDistance, whiteDistance);\n" +" colorDistance = min(colorDistance, blackDistance); \n" +" if (colorDistance == blackDistance) {\n" +" finalColor = colorBlack;\n" +" } else if (colorDistance == whiteDistance) {\n" +" finalColor = colorWhite;\n" +" } else if (colorDistance == cyanDistance) {\n" +" finalColor = colorCyan;\n" +" } else {\n" +" finalColor = colorMagenta;\n" +" }\n" +" gl_FragColor = finalColor;\n" +"}\n"; } }