summaryrefslogtreecommitdiffstats
path: root/media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java
diff options
context:
space:
mode:
Diffstat (limited to 'media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java')
-rw-r--r--media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java26
1 files changed, 19 insertions, 7 deletions
diff --git a/media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java b/media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java
index dd7f5e0..20b02d2 100644
--- a/media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java
+++ b/media/mca/filterpacks/java/android/filterpacks/imageproc/BlackWhiteFilter.java
@@ -56,13 +56,25 @@ public class BlackWhiteFilter extends Filter {
"uniform float stepsize;\n" +
"varying vec2 v_texcoord;\n" +
"float rand(vec2 loc) {\n" +
- " const float divide = 0.00048828125;\n" +
- " const float factor = 2048.0;\n" +
- " float value = sin(dot(loc, vec2(12.9898, 78.233)));\n" +
- " float residual = mod(dot(mod(loc, divide), vec2(0.9898, 0.233)), divide);\n" +
- " float part2 = mod(value, divide);\n" +
- " float part1 = value - part2;\n" +
- " return fract(0.5453 * part1 + factor * (part2 + residual));\n" +
+ // Compute sin(theta), theta = 12.9898 x + 78.233y
+ // because floating point has limited range, make theta = theta1 + theta2
+ // where theta1 = 12x + 78y and theta2 = 0.9898x + 0.233y)
+ // Note that theta1 and theta2 cover diffent range of theta.
+ " float theta1 = dot(loc, vec2(0.9898, 0.233));\n" +
+ " float theta2 = dot(loc, vec2(12.0, 78.0));\n" +
+ // Use the property sin(theta) = cos(theta1)*sin(theta2)+sin(theta1)*cos(theta2)
+ // this approach also increases the precisions of sin(theta)
+ " float value = cos(theta1) * sin(theta2) + sin(theta1) * cos(theta2);\n" +
+ // fract(43758.5453 * x) = fract(43758 * x + 0.5453 * x)
+ // keep value of part1 in range: (2^-14 to 2^14). Since 43758 = 117 * 374
+ // fract(43758 * sin(theta)) = mod(221 * mod(198*sin(theta), 1.0), 1.0)
+ // also to keep as much decimal digits, use the property
+ // mod(mod(198*sin(theta)) = mod(mod(197*sin(theta) + sin(theta))
+ " float temp = mod(197.0 * value, 1.0) + value;\n" +
+ " float part1 = mod(220.0 * temp, 1.0) + temp;\n" +
+ " float part2 = value * 0.5453;\n" +
+ " float part3 = cos(theta1 + theta2) * 0.43758;\n" +
+ " return fract(part1 + part2 + part3);\n" +
"}\n" +
"void main() {\n" +
" vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +