Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af9eb5a0 authored by Ruei-sung Lin's avatar Ruei-sung Lin Committed by Android Git Automerger
Browse files

am c2e393f8: Merge "pseudo random number generator in shader with limited precisions" into jb-dev

* commit 'c2e393f8':
  pseudo random number generator in shader with limited precisions
parents 5a062e61 c2e393f8
Loading
Loading
Loading
Loading
+19 −26
Original line number Diff line number Diff line
@@ -46,8 +46,6 @@ public class BitmapOverlayFilter extends Filter {
    private Program mProgram;
    private Frame mFrame;

    private int mWidth = 0;
    private int mHeight = 0;
    private int mTarget = FrameFormat.TARGET_UNSPECIFIED;

    private final String mOverlayShader =
@@ -113,18 +111,17 @@ public class BitmapOverlayFilter extends Filter {
            initProgram(context, inputFormat.getTarget());
        }

        // Check if the frame size has changed
        if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
            mWidth = inputFormat.getWidth();
            mHeight = inputFormat.getHeight();

            createBitmapFrame(context);
        }

        if (mBitmap != null) {
            Frame frame = createBitmapFrame(context);
            // Process
        Frame[] inputs = {input, mFrame};
            Frame[] inputs = {input, frame};
            mProgram.process(inputs, output);

            frame.release();
        } else {
            output.setDataFromFrame(input);
        }

        // Push output
        pushOutput("image", output);

@@ -132,22 +129,18 @@ public class BitmapOverlayFilter extends Filter {
        output.release();
    }

    private void createBitmapFrame(FilterContext context) {
        if (mBitmap != null) {
    private Frame createBitmapFrame(FilterContext context) {
        FrameFormat format = ImageFormat.create(mBitmap.getWidth(),
                                                mBitmap.getHeight(),
                                                ImageFormat.COLORSPACE_RGBA,
                                                FrameFormat.TARGET_GPU);

            if (mFrame != null) {
                mFrame.release();
            }

            mFrame = context.getFrameManager().newFrame(format);
            mFrame.setBitmap(mBitmap);
        Frame frame = context.getFrameManager().newFrame(format);
        frame.setBitmap(mBitmap);

        mBitmap.recycle();
        mBitmap = null;
        }

        return frame;
    }
}
+15 −11
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.filterfw.core.Program;
import android.filterfw.core.ShaderProgram;
import android.filterfw.format.ImageFormat;

import java.util.Date;
import java.util.Random;

public class BlackWhiteFilter extends Filter {
@@ -42,24 +43,30 @@ public class BlackWhiteFilter extends Filter {
    private int mTileSize = 640;

    private Program mProgram;
    private Random mRandom;

    private int mWidth = 0;
    private int mHeight = 0;
    private int mTarget = FrameFormat.TARGET_UNSPECIFIED;

    private final String mBlackWhiteShader =
            "precision mediump float;\n" +
            "uniform sampler2D tex_sampler_0;\n" +
            "uniform vec2 seed;\n" +
            "uniform float black;\n" +
            "uniform float scale;\n" +
            "uniform float stepsize;\n" +
            "varying vec2 v_texcoord;\n" +
            "float rand(vec2 loc) {\n" +
            "  return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\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" +
            "}\n" +
            "void main() {\n" +
            "  vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
            "  float dither = rand(v_texcoord);\n" +
            "  float dither = rand(v_texcoord + seed);\n" +
            "  vec3 xform = clamp((color.rgb - black) * scale, 0.0, 1.0);\n" +
            "  vec3 temp = clamp((color.rgb + stepsize - black) * scale, 0.0, 1.0);\n" +
            "  vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
@@ -68,6 +75,7 @@ public class BlackWhiteFilter extends Filter {

    public BlackWhiteFilter(String name) {
        super(name);
        mRandom = new Random(new Date().getTime());
    }

    @Override
@@ -100,10 +108,12 @@ public class BlackWhiteFilter extends Filter {
    private void updateParameters() {
        float scale = (mBlack != mWhite) ? 1.0f / (mWhite - mBlack) : 2000f;
        float stepsize = 1.0f / 255.0f;

        mProgram.setHostValue("black", mBlack);
        mProgram.setHostValue("scale", scale);
        mProgram.setHostValue("stepsize", stepsize);

        float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
        mProgram.setHostValue("seed", seed);
    }

    @Override
@@ -124,12 +134,6 @@ public class BlackWhiteFilter extends Filter {
            initProgram(context, inputFormat.getTarget());
        }

        // Check if the frame size has changed
        if (inputFormat.getWidth() != mWidth || inputFormat.getHeight() != mHeight) {
            mWidth = inputFormat.getWidth();
            mHeight = inputFormat.getHeight();
        }

        // Create output frame
        Frame output = context.getFrameManager().newFrame(inputFormat);

+16 −3
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.filterfw.core.Program;
import android.filterfw.core.ShaderProgram;
import android.filterfw.format.ImageFormat;

import java.util.Date;
import java.util.Random;

public class DocumentaryFilter extends Filter {
@@ -36,6 +37,7 @@ public class DocumentaryFilter extends Filter {
    private int mTileSize = 640;

    private Program mProgram;
    private Random mRandom;

    private int mWidth = 0;
    private int mHeight = 0;
@@ -44,17 +46,24 @@ public class DocumentaryFilter extends Filter {
    private final String mDocumentaryShader =
            "precision mediump float;\n" +
            "uniform sampler2D tex_sampler_0;\n" +
            "uniform vec2 seed;\n" +
            "uniform float stepsize;\n" +
            "uniform float inv_max_dist;\n" +
            "uniform vec2 center;\n" +
            "varying vec2 v_texcoord;\n" +
            "float rand(vec2 loc) {\n" +
            "  return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\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" +
            "}\n" +
            "void main() {\n" +
            // black white
            "  vec4 color = texture2D(tex_sampler_0, v_texcoord);\n" +
            "  float dither = rand(v_texcoord);\n" +
            "  float dither = rand(v_texcoord + seed);\n" +
            "  vec3 xform = clamp(2.0 * color.rgb, 0.0, 1.0);\n" +
            "  vec3 temp = clamp(2.0 * (color.rgb + stepsize), 0.0, 1.0);\n" +
            "  vec3 new_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
@@ -69,6 +78,8 @@ public class DocumentaryFilter extends Filter {

    public DocumentaryFilter(String name) {
        super(name);
        Date date = new Date();
        mRandom = new Random(new Date().getTime());
    }

    @Override
@@ -138,7 +149,9 @@ public class DocumentaryFilter extends Filter {
            mProgram.setHostValue("center", center);
            mProgram.setHostValue("inv_max_dist", 1.0f / max_dist);
            mProgram.setHostValue("stepsize", 1.0f / 255.0f);

            float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
            mProgram.setHostValue("seed", seed);
        }
    }

}
+10 −2
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.filterfw.format.ImageFormat;
import android.filterfw.geometry.Quad;
import android.filterfw.geometry.Point;

import java.util.Date;
import java.util.Random;

public class GrainFilter extends Filter {
@@ -49,14 +50,20 @@ public class GrainFilter extends Filter {
    private int mHeight = 0;
    private int mTarget = FrameFormat.TARGET_UNSPECIFIED;

    private Random mRandom = new Random();
    private Random mRandom;

    private final String mNoiseShader =
            "precision mediump float;\n" +
            "uniform vec2 seed;\n" +
            "varying vec2 v_texcoord;\n" +
            "float rand(vec2 loc) {\n" +
            "  return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\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" +
            "}\n" +
            "void main() {\n" +
            "  gl_FragColor = vec4(rand(v_texcoord + seed), 0.0, 0.0, 1.0);\n" +
@@ -86,6 +93,7 @@ public class GrainFilter extends Filter {

    public GrainFilter(String name) {
        super(name);
        mRandom = new Random(new Date().getTime());
    }

    @Override
+17 −2
Original line number Diff line number Diff line
@@ -28,12 +28,16 @@ import android.filterfw.core.Program;
import android.filterfw.core.ShaderProgram;
import android.filterfw.format.ImageFormat;

import java.util.Date;
import java.util.Random;

public class LomoishFilter extends Filter {

    @GenerateFieldPort(name = "tile_size", hasDefault = true)
    private int mTileSize = 640;

    private Program mProgram;
    private Random mRandom;

    private int mWidth = 0;
    private int mHeight = 0;
@@ -42,6 +46,7 @@ public class LomoishFilter extends Filter {
    private final String mLomoishShader =
            "precision mediump float;\n" +
            "uniform sampler2D tex_sampler_0;\n" +
            "uniform vec2 seed;\n" +
            "uniform float stepsizeX;\n" +
            "uniform float stepsizeY;\n" +
            "uniform float stepsize;\n" +
@@ -49,7 +54,13 @@ public class LomoishFilter extends Filter {
            "uniform float inv_max_dist;\n" +
            "varying vec2 v_texcoord;\n" +
            "float rand(vec2 loc) {\n" +
            "  return fract(sin(dot(loc, vec2(12.9898, 78.233))) * 43758.5453);\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" +
            "}\n" +
            "void main() {\n" +
            // sharpen
@@ -96,7 +107,7 @@ public class LomoishFilter extends Filter {
            "  }\n" +
            "  c_color.b = s_color.b * 0.5 + 0.25;\n" +
            // blackwhite
            "  float dither = rand(v_texcoord);\n" +
            "  float dither = rand(v_texcoord + seed);\n" +
            "  vec3 xform = clamp((c_color.rgb - 0.15) * 1.53846, 0.0, 1.0);\n" +
            "  vec3 temp = clamp((color.rgb + stepsize - 0.15) * 1.53846, 0.0, 1.0);\n" +
            "  vec3 bw_color = clamp(xform + (temp - xform) * (dither - 0.5), 0.0, 1.0);\n" +
@@ -108,6 +119,7 @@ public class LomoishFilter extends Filter {

    public LomoishFilter(String name) {
        super(name);
        mRandom = new Random(new Date().getTime());
    }

    @Override
@@ -149,6 +161,9 @@ public class LomoishFilter extends Filter {
            mProgram.setHostValue("stepsize", 1.0f / 255.0f);
            mProgram.setHostValue("stepsizeX", 1.0f / mWidth);
            mProgram.setHostValue("stepsizeY", 1.0f / mHeight);

            float seed[] = { mRandom.nextFloat(), mRandom.nextFloat() };
            mProgram.setHostValue("seed", seed);
        }
    }

Loading