diff options
Diffstat (limited to 'src/org/cyanogenmod/wallpapers/photophase/effects/HalftoneEffect.java')
-rw-r--r-- | src/org/cyanogenmod/wallpapers/photophase/effects/HalftoneEffect.java | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/src/org/cyanogenmod/wallpapers/photophase/effects/HalftoneEffect.java b/src/org/cyanogenmod/wallpapers/photophase/effects/HalftoneEffect.java index 3f9c4e7..07da491 100644 --- a/src/org/cyanogenmod/wallpapers/photophase/effects/HalftoneEffect.java +++ b/src/org/cyanogenmod/wallpapers/photophase/effects/HalftoneEffect.java @@ -1,5 +1,4 @@ /* - * Copyright (C) 2008 Max Maischein * Copyright (C) 2013 The CyanogenMod Project * * @@ -16,14 +15,13 @@ * limitations under the License. */ // -// Based in the shaders of Max Maischein of App-VideoMixer: -// http://cpansearch.perl.org/src/CORION/App-VideoMixer-0.02/filters/halftone.glsl +// Based on the shaders of kodemongki: +// http://kodemongki.blogspot.com.es/2011/06/kameraku-custom-shader-effects-example.html // package org.cyanogenmod.wallpapers.photophase.effects; import android.media.effect.EffectContext; -import android.media.effect.EffectFactory; import android.opengl.GLES20; import android.util.Log; @@ -35,8 +33,8 @@ import org.cyanogenmod.wallpapers.photophase.utils.GLESUtil; * <tr><td>Parameter name</td><td>Meaning</td><td>Valid values</td></tr> * <tr> * <td><code>strength</code></td> - * <td>The halftone steps multiplier.</td> - * <td>Positive float (>0). Higher numbers produce smallest points;</td> + * <td>The halftone strength.</td> + * <td>Positive float (>0). Higher numbers produce smallest points.</td> * </tr> * </table> */ @@ -50,26 +48,33 @@ public class HalftoneEffect extends PhotoPhaseEffect { "precision mediump float;\n" + "uniform sampler2D tex_sampler;\n" + "varying vec2 v_texcoord;\n" + - "uniform float steps\n;" + - "float dotsize = 1.0 / steps ;\n" + - "float half_step = dotsize / 2.0;\n" + - "void main() {\n" + - " vec2 center = v_texcoord - vec2(mod(v_texcoord.x, dotsize),mod(v_texcoord.y, dotsize)) + half_step;\n" + - " vec4 pel = texture2D(tex_sampler, center);\n" + - " float size = length(pel);\n" + - " if (distance(v_texcoord,center) <= dotsize*size/4.0) {\n" + - " gl_FragColor = pel;\n" + - " } else {\n" + - " gl_FragColor = vec4(0.0,0.0,0.0,0.0);\n" + - " };\n" + - "}\n"; + "const float step_w = 0.0015625;\n" + + "const float step_h = 0.0027778;\n" + + "uniform float strength;\n" + + "void main(void)\n" + + "{\n" + + " float offx = floor(v_texcoord.s / (strength * step_w));\n" + + " float offy = floor(v_texcoord.t / (strength * step_h));\n" + + " vec3 res = texture2D(tex_sampler, vec2(offx * strength * step_w , offy * strength * step_h)).bgr;\n" + + " vec2 prc = fract(v_texcoord.st / vec2(strength * step_w, strength * step_h));\n" + + " vec2 pw = pow(abs(prc - 0.5), vec2(2.0));\n" + + " float rs = pow(0.45, 2.0);\n" + + " float gr = smoothstep(rs - 0.1, rs + 0.1, pw.x + pw.y);\n" + + " float y = (res.r + res.g + res.b) / 3.0; \n" + + " vec3 ra = res / y;\n" + + " float ls = 0.3;\n" + + " float lb = ceil(y / ls);\n" + + " float lf = ls * lb + 0.3;\n" + + " res = lf * res;\n" + + " gl_FragColor.a = 1.0;\n" + + " gl_FragColor.rgb = mix(res, vec3(0.1, 0.1, 0.1), gr);\n" + + "}"; - private float mStrength = 32.0f; + private float mStrength = 16.0f; private int mStepsHandle; /** - * An abstract constructor of <code>Effect</code> to follow the rules - * defined by {@link EffectFactory}. + * Constructor of <code>HalftoneEffect</code>. * * @param ctx The effect context * @param name The effect name @@ -87,7 +92,7 @@ public class HalftoneEffect extends PhotoPhaseEffect { super.init(vertexShader, fragmentShader); // Parameters - mStepsHandle = GLES20.glGetUniformLocation(mProgram, "steps"); + mStepsHandle = GLES20.glGetUniformLocation(mProgram, "strength"); GLESUtil.glesCheckError("glGetUniformLocation"); } |