package com.marshalchen.common.uimodule.imageprocessing.filter.effect;
import com.marshalchen.common.uimodule.imageprocessing.filter.BasicFilter;
/**
* A "faster" version of {@link com.marshalchen.common.uimodule.imageprocessing.filter.effect.KuwaharaFilter} that has a fixed radius of 3.
* @author Chris Batt
*/
public class KuwaharaRadius3Filter extends BasicFilter {
@Override
protected String getFragmentShader() {
return
"precision highp float;\n"
+"uniform sampler2D "+UNIFORM_TEXTURE0+";\n"
+"varying vec2 "+VARYING_TEXCOORD+";\n"
+"const vec2 src_size = vec2 (1.0 / 768.0, 1.0 / 1024.0);\n"
+"void main(){\n"
+" vec2 uv = "+VARYING_TEXCOORD+";\n"
+" float n = float(16);\n" // radius is assumed to be 3
+" vec3 m0 = vec3(0.0); vec3 m1 = vec3(0.0); vec3 m2 = vec3(0.0); vec3 m3 = vec3(0.0);\n"
+" vec3 s0 = vec3(0.0); vec3 s1 = vec3(0.0); vec3 s2 = vec3(0.0); vec3 s3 = vec3(0.0);\n"
+" vec3 c;\n"
+" vec3 cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-3,-3) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-3,-2) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-3,-1) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-3,0) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m0 += c;\n"
+" s0 += cSq;\n"
+" m1 += c;\n"
+" s1 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-2,-3) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-2,-2) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-2,-1) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-2,0) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m0 += c;\n"
+" s0 += cSq;\n"
+" m1 += c;\n"
+" s1 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-1,-3) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-1,-2) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-1,-1) * src_size).rgb;\n"
+" m0 += c;\n"
+" s0 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-1,0) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m0 += c;\n"
+" s0 += cSq;\n"
+" m1 += c;\n"
+" s1 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(0,-3) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m0 += c;\n"
+" s0 += cSq;\n"
+" m3 += c;\n"
+" s3 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(0,-2) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m0 += c;\n"
+" s0 += cSq;\n"
+" m3 += c;\n"
+" s3 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(0,-1) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m0 += c;\n"
+" s0 += cSq;\n"
+" m3 += c;\n"
+" s3 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(0,0) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m0 += c;\n"
+" s0 += cSq;\n"
+" m1 += c;\n"
+" s1 += cSq;\n"
+" m2 += c;\n"
+" s2 += cSq;\n"
+" m3 += c;\n"
+" s3 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-3,3) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-3,2) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-3,1) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-2,3) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-2,2) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-2,1) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-1,3) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-1,2) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(-1,1) * src_size).rgb;\n"
+" m1 += c;\n"
+" s1 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(0,3) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m1 += c;\n"
+" s1 += cSq;\n"
+" m2 += c;\n"
+" s2 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(0,2) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m1 += c;\n"
+" s1 += cSq;\n"
+" m2 += c;\n"
+" s2 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(0,1) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m1 += c;\n"
+" s1 += cSq;\n"
+" m2 += c;\n"
+" s2 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(3,3) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(3,2) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(3,1) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(3,0) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m2 += c;\n"
+" s2 += cSq;\n"
+" m3 += c;\n"
+" s3 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(2,3) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(2,2) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(2,1) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(2,0) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m2 += c;\n"
+" s2 += cSq;\n"
+" m3 += c;\n"
+" s3 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(1,3) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(1,2) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(1,1) * src_size).rgb;\n"
+" m2 += c;\n"
+" s2 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(1,0) * src_size).rgb;\n"
+" cSq = c * c;\n"
+" m2 += c;\n"
+" s2 += cSq;\n"
+" m3 += c;\n"
+" s3 += cSq;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(3,-3) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(3,-2) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(3,-1) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(2,-3) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(2,-2) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(2,-1) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(1,-3) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(1,-2) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" c = texture2D("+UNIFORM_TEXTURE0+", uv + vec2(1,-1) * src_size).rgb;\n"
+" m3 += c;\n"
+" s3 += c * c;\n"
+" float min_sigma2 = 1e+2;\n"
+" m0 /= n;\n"
+" s0 = abs(s0 / n - m0 * m0);\n"
+" float sigma2 = s0.r + s0.g + s0.b;\n"
+" if (sigma2 < min_sigma2) {\n"
+" min_sigma2 = sigma2;\n"
+" gl_FragColor = vec4(m0, 1.0);\n"
+" }\n"
+" m1 /= n;\n"
+" s1 = abs(s1 / n - m1 * m1);\n"
+" sigma2 = s1.r + s1.g + s1.b;\n"
+" if (sigma2 < min_sigma2) {\n"
+" min_sigma2 = sigma2;\n"
+" gl_FragColor = vec4(m1, 1.0);\n"
+" }\n"
+" m2 /= n;\n"
+" s2 = abs(s2 / n - m2 * m2);\n"
+" sigma2 = s2.r + s2.g + s2.b;\n"
+" if (sigma2 < min_sigma2) {\n"
+" min_sigma2 = sigma2;\n"
+" gl_FragColor = vec4(m2, 1.0);\n"
+" }\n"
+" m3 /= n;\n"
+" s3 = abs(s3 / n - m3 * m3);\n"
+" sigma2 = s3.r + s3.g + s3.b;\n"
+" if (sigma2 < min_sigma2) {\n"
+" min_sigma2 = sigma2;\n"
+" gl_FragColor = vec4(m3, 1.0);\n"
+" }\n"
+"}\n";
}
}