From 3f7dfc3d9b982c8316f770802b204862054023fa Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Wed, 24 Jul 2019 16:13:16 +0530 Subject: [PATCH 01/12] added shader effects --- .../cameraview/internal/egl/EglViewport.java | 9 +- .../shadereffects/ShaderInterface.java | 20 +++ .../shadereffects/effects/AutoFixEffect.java | 88 ++++++++++ .../effects/BlackAndWhiteEffect.java | 34 ++++ .../effects/BrightnessEffect.java | 43 +++++ .../shadereffects/effects/ContrastEffect.java | 41 +++++ .../effects/CrossProcessEffect.java | 45 +++++ .../effects/DocumentaryEffect.java | 114 +++++++++++++ .../shadereffects/effects/DuotoneEffect.java | 71 ++++++++ .../effects/FillLightEffect.java | 64 +++++++ .../shadereffects/effects/GammaEffect.java | 46 +++++ .../shadereffects/effects/GrainEffect.java | 103 ++++++++++++ .../effects/GreyScaleEffect.java | 32 ++++ .../shadereffects/effects/HueEffect.java | 70 ++++++++ .../effects/InvertColorsEffect.java | 34 ++++ .../shadereffects/effects/LamoishEffect.java | 158 ++++++++++++++++++ .../shadereffects/effects/NoEffect.java | 31 ++++ .../effects/PosterizeEffect.java | 33 ++++ .../effects/SaturationEffect.java | 86 ++++++++++ .../shadereffects/effects/SepiaEffect.java | 49 ++++++ .../effects/SharpnessEffect.java | 80 +++++++++ .../effects/TemperatureEffect.java | 55 ++++++ .../shadereffects/effects/TintEffect.java | 63 +++++++ .../shadereffects/effects/VignetteEffect.java | 95 +++++++++++ 24 files changed, 1463 insertions(+), 1 deletion(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 54114c9d..e015cb7b 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -5,6 +5,8 @@ import android.opengl.GLES11Ext; import android.opengl.GLES20; import com.otaliastudios.cameraview.CameraLogger; +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; import java.nio.FloatBuffer; @@ -76,7 +78,12 @@ public class EglViewport extends EglElement { public EglViewport() { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; - mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER); + + //mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER); + + ShaderInterface effect = new BlackAndWhiteEffect(); + mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, effect.getShader(null)); + maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); checkLocation(maPositionLocation, "aPosition"); maTextureCoordLocation = GLES20.glGetAttribLocation(mProgramHandle, "aTextureCoord"); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java new file mode 100644 index 00000000..09a39c24 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java @@ -0,0 +1,20 @@ +package com.otaliastudios.cameraview.shadereffects; + +import android.opengl.GLSurfaceView; + +/** + * An interface that every effect must implement so that there is a common + * getShader method that every effect class is force to override + */ +public interface ShaderInterface { + /** + * Returns Shader code + * + * @param mGlSurfaceView + * send this for every shader but this will only be used when the + * shader needs it. + * @return complete shader code in C + */ + public String getShader(GLSurfaceView mGlSurfaceView); + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java new file mode 100644 index 00000000..3e9efcce --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java @@ -0,0 +1,88 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Attempts to auto-fix the preview based on histogram equalization. + */ +public class AutoFixEffect implements ShaderInterface { + private float scale; + + /** + * Initialize Effect + * + * @param scale Float, between 0 and 1. Zero means no adjustment, while 1 + * indicates the maximum amount of adjustment. + */ + public AutoFixEffect(float scale) { + if (scale < 0.0f) + scale = 0.0f; + if (scale > 1.0f) + scale = 1.0f; + + this.scale = scale; + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES tex_sampler_0;\n" + + "uniform samplerExternalOES tex_sampler_1;\n" + + "uniform samplerExternalOES tex_sampler_2;\n" + + " float scale;\n" + " float shift_scale;\n" + + " float hist_offset;\n" + " float hist_scale;\n" + + " float density_offset;\n" + " float density_scale;\n" + + "varying vec2 vTextureCoord;\n" + "void main() {\n" + + " shift_scale = " + + (1.0f / 256f) + + ";\n" + + " hist_offset = " + + (0.5f / 766f) + + ";\n" + + " hist_scale = " + + (765f / 766f) + + ";\n" + + " density_offset = " + + (0.5f / 1024f) + + ";\n" + + " density_scale = " + + (1023f / 1024f) + + ";\n" + + " scale = " + + scale + + ";\n" + + " const vec3 weights = vec3(0.33333, 0.33333, 0.33333);\n" + + " vec4 color = texture2D(tex_sampler_0, vTextureCoord);\n" + + " float energy = dot(color.rgb, weights);\n" + + " float mask_value = energy - 0.5;\n" + + " float alpha;\n" + + " if (mask_value > 0.0) {\n" + + " alpha = (pow(2.0 * mask_value, 1.5) - 1.0) * scale + 1.0;\n" + + " } else { \n" + + " alpha = (pow(2.0 * mask_value, 2.0) - 1.0) * scale + 1.0;\n" + + " }\n" + + " float index = energy * hist_scale + hist_offset;\n" + + " vec4 temp = texture2D(tex_sampler_1, vec2(index, 0.5));\n" + + " float value = temp.g + temp.r * shift_scale;\n" + + " index = value * density_scale + density_offset;\n" + + " temp = texture2D(tex_sampler_2, vec2(index, 0.5));\n" + + " value = temp.g + temp.r * shift_scale;\n" + + " float dst_energy = energy * alpha + value * (1.0 - alpha);\n" + + " float max_energy = energy / max(color.r, max(color.g, color.b));\n" + + " if (dst_energy > max_energy) {\n" + + " dst_energy = max_energy;\n" + + " }\n" + + " if (energy == 0.0) {\n" + + " gl_FragColor = color;\n" + + " } else {\n" + + " gl_FragColor = vec4(color.rgb * dst_energy / energy, color.a);\n" + + " }\n" + "}\n"; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java new file mode 100644 index 00000000..cdea63b3 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java @@ -0,0 +1,34 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Converts the preview into black and white colors + */ +public class BlackAndWhiteEffect implements ShaderInterface { + /** + * Initialize Effect + */ + public BlackAndWhiteEffect() { + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float colorR = (color.r + color.g + color.b) / 3.0;\n" + + " float colorG = (color.r + color.g + color.b) / 3.0;\n" + + " float colorB = (color.r + color.g + color.b) / 3.0;\n" + + " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n" + + "}\n"; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java new file mode 100644 index 00000000..0d399834 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java @@ -0,0 +1,43 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Adjusts the brightness of the preview. + */ +public class BrightnessEffect implements ShaderInterface { + private float brightnessValue; + + /** + * Initialize Effect + * + * @param brightnessvalue Range should be between 0.1- 2.0 with 1.0 being normal. + */ + public BrightnessEffect(float brightnessvalue) { + if (brightnessvalue < 0.1f) + brightnessvalue = 0.1f; + if (brightnessvalue > 2.0f) + brightnessvalue = 2.0f; + + this.brightnessValue = brightnessvalue; + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + "float brightness ;\n" + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + " brightness =" + brightnessValue + + ";\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " gl_FragColor = brightness * color;\n" + "}\n"; + + return shader; + + } + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java new file mode 100644 index 00000000..6dddb63a --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java @@ -0,0 +1,41 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +/** + * Adjusts the contrast of the preview. + */ +public class ContrastEffect implements ShaderInterface { + private float contrast; + + /** + * Initialize Effect + * + * @param contrast Range should be between 0.1- 2.0 with 1.0 being normal. + */ + public ContrastEffect(float contrast) { + if (contrast < 0.1f) + contrast = 0.1f; + if (contrast > 2.0f) + contrast = 2.0f; + + this.contrast = contrast; + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " float contrast;\n" + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + " contrast =" + contrast + ";\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " color -= 0.5;\n" + " color *= contrast;\n" + + " color += 0.5;\n" + " gl_FragColor = color;\n" + "}\n"; + return shader; + + } + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java new file mode 100644 index 00000000..d576901d --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java @@ -0,0 +1,45 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Applies a cross process effect on preview, in which the red and green channels + * are enhanced while the blue channel is restricted. + */ +public class CrossProcessEffect implements ShaderInterface { + + /** + * Initialize Effect + */ + public CrossProcessEffect() { + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + "varying vec2 vTextureCoord;\n" + "void main() {\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " vec3 ncolor = vec3(0.0, 0.0, 0.0);\n" + " float value;\n" + + " if (color.r < 0.5) {\n" + " value = color.r;\n" + + " } else {\n" + " value = 1.0 - color.r;\n" + " }\n" + + " float red = 4.0 * value * value * value;\n" + + " if (color.r < 0.5) {\n" + " ncolor.r = red;\n" + + " } else {\n" + " ncolor.r = 1.0 - red;\n" + " }\n" + + " if (color.g < 0.5) {\n" + " value = color.g;\n" + + " } else {\n" + " value = 1.0 - color.g;\n" + " }\n" + + " float green = 2.0 * value * value;\n" + + " if (color.g < 0.5) {\n" + " ncolor.g = green;\n" + + " } else {\n" + " ncolor.g = 1.0 - green;\n" + " }\n" + + " ncolor.b = color.b * 0.5 + 0.25;\n" + + " gl_FragColor = vec4(ncolor.rgb, color.a);\n" + "}\n"; + + return shader; + + } + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java new file mode 100644 index 00000000..8eb0e713 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java @@ -0,0 +1,114 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +import java.util.Date; +import java.util.Random; + +/** + * Applies black and white documentary style effect on preview. + */ +public class DocumentaryEffect implements ShaderInterface { + private int mWidth; + private int mHeight; + private Random mRandom; + + /** + * Initialize Effect + */ + public DocumentaryEffect() { + + } + + /** + * Init all values that will be used by this shader. + * + * @param mGlSurfaceView which is responsible for displaying your video + */ + private void initValues(GLSurfaceView mGlSurfaceView) { + mWidth = mGlSurfaceView.getWidth(); + mHeight = mGlSurfaceView.getHeight(); + mRandom = new Random(new Date().getTime()); + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + initValues(mGlSurfaceView); + float scale[] = new float[2]; + if (mWidth > mHeight) { + scale[0] = 1f; + scale[1] = ((float) mHeight) / mWidth; + } else { + scale[0] = ((float) mWidth) / mHeight; + scale[1] = 1f; + } + float max_dist = ((float) Math.sqrt(scale[0] * scale[0] + scale[1] + * scale[1])) * 0.5f; + + float seed[] = {mRandom.nextFloat(), mRandom.nextFloat()}; + + String scaleString[] = new String[2]; + String seedString[] = new String[2]; + + scaleString[0] = "scale[0] = " + scale[0] + ";\n"; + scaleString[1] = "scale[1] = " + scale[1] + ";\n"; + + seedString[0] = "seed[0] = " + seed[0] + ";\n"; + seedString[1] = "seed[1] = " + seed[1] + ";\n"; + + String inv_max_distString = "inv_max_dist = " + 1.0f / max_dist + ";\n"; + String stepsizeString = "stepsize = " + 1.0f / 255.0f + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " vec2 seed;\n" + + " float stepsize;\n" + + " float inv_max_dist;\n" + + " vec2 scale;\n" + + "varying vec2 vTextureCoord;\n" + + "float rand(vec2 loc) {\n" + + " float theta1 = dot(loc, vec2(0.9898, 0.233));\n" + + " float theta2 = dot(loc, vec2(12.0, 78.0));\n" + + " float value = cos(theta1) * sin(theta2) + sin(theta1) * cos(theta2);\n" + + + // keep value of part1 in range: (2^-14 to 2^14). + " 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" + // Parameters that were created above + + scaleString[0] + + scaleString[1] + + seedString[0] + + seedString[1] + + inv_max_distString + + stepsizeString + + // black white + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float dither = rand(vTextureCoord + 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" + + + // grayscale + " float gray = dot(new_color, vec3(0.299, 0.587, 0.114));\n" + + " new_color = vec3(gray, gray, gray);\n" + + + // vignette + " vec2 coord = vTextureCoord - vec2(0.5, 0.5);\n" + + " float dist = length(coord * scale);\n" + + " float lumen = 0.85 / (1.0 + exp((dist * inv_max_dist - 0.83) * 20.0)) + 0.15;\n" + + " gl_FragColor = vec4(new_color * lumen, color.a);\n" + + "}\n"; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java new file mode 100644 index 00000000..9ef654af --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java @@ -0,0 +1,71 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.graphics.Color; +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Representation of preview using only two color tones. + */ +public class DuotoneEffect implements ShaderInterface { + // Default values + private int mFirstColor = Color.MAGENTA; + private int mSecondColor = Color.YELLOW; + + /** + * Initialize effect + * + * @param mFirstColor Integer, representing an ARGB color with 8 bits per channel. + * May be created using Color class. + * @param mSecondColor Integer, representing an ARGB color with 8 bits per channel. + * May be created using Color class. + */ + public DuotoneEffect(int mFirstColor, int mSecondColor) { + this.mFirstColor = mFirstColor; + this.mSecondColor = mSecondColor; + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + float first[] = {Color.red(mFirstColor) / 255f, + Color.green(mFirstColor) / 255f, Color.blue(mFirstColor) / 255f}; + float second[] = {Color.red(mSecondColor) / 255f, + Color.green(mSecondColor) / 255f, + Color.blue(mSecondColor) / 255f}; + + String firstColorString[] = new String[3]; + String secondColorString[] = new String[3]; + + firstColorString[0] = "first[0] = " + first[0] + ";\n"; + firstColorString[1] = "first[1] = " + first[1] + ";\n"; + firstColorString[2] = "first[2] = " + first[2] + ";\n"; + + secondColorString[0] = "second[0] = " + second[0] + ";\n"; + secondColorString[1] = "second[1] = " + second[1] + ";\n"; + secondColorString[2] = "second[2] = " + second[2] + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " vec3 first;\n" + + " vec3 second;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + // Parameters that were created above + + firstColorString[0] + + firstColorString[1] + + firstColorString[2] + + secondColorString[0] + + secondColorString[1] + + secondColorString[2] + + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float energy = (color.r + color.g + color.b) * 0.3333;\n" + + " vec3 new_color = (1.0 - energy) * first + energy * second;\n" + + " gl_FragColor = vec4(new_color.rgb, color.a);\n" + "}\n"; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java new file mode 100644 index 00000000..99da3d2c --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java @@ -0,0 +1,64 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Applies back-light filling to the preview. + */ +public class FillLightEffect implements ShaderInterface { + private float strength = 0f; + + /** + * Initialize Effect + * + * @param strength Float, between 0 and 1. 0 means no change. + */ + public FillLightEffect(float strength) { + if (strength < 0.0f) + strength = 0f; + if (strength > 1.0f) + strength = 1f; + + this.strength = strength; + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + float fade_gamma = 0.3f; + float amt = 1.0f - strength; + float mult = 1.0f / (amt * 0.7f + 0.3f); + float faded = fade_gamma + (1.0f - fade_gamma) * mult; + float igamma = 1.0f / faded; + + String multString = "mult = " + mult + ";\n"; + String igammaString = "igamma = " + igamma + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " float mult;\n" + + " float igamma;\n" + + "varying vec2 vTextureCoord;\n" + + "void main()\n" + + "{\n" + // Parameters that were created above + + multString + + igammaString + + + " const vec3 color_weights = vec3(0.25, 0.5, 0.25);\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float lightmask = dot(color.rgb, color_weights);\n" + + " float backmask = (1.0 - lightmask);\n" + + " vec3 ones = vec3(1.0, 1.0, 1.0);\n" + + " vec3 diff = pow(mult * color.rgb, igamma * ones) - color.rgb;\n" + + " diff = min(diff, 1.0);\n" + + " vec3 new_color = min(color.rgb + diff * backmask, 1.0);\n" + + " gl_FragColor = vec4(new_color, color.a);\n" + "}\n"; + + return shader; + + } + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java new file mode 100644 index 00000000..c18293d0 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java @@ -0,0 +1,46 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Apply Gamma Effect on preview being played + */ +public class GammaEffect implements ShaderInterface { + private float gammaValue; + + /** + * Initialize Effect + * + * @param gammaValue Range should be between 0.0 - 2.0 with 1.0 being normal. + */ + public GammaEffect(float gammaValue) { + if (gammaValue < 0.0f) + gammaValue = 0.0f; + if (gammaValue > 2.0f) + gammaValue = 2.0f; + this.gammaValue = gammaValue; + + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + + "float gamma=" + gammaValue + ";\n" + + + "void main() {\n" + + + "vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + + "gl_FragColor = vec4(pow(textureColor.rgb, vec3(gamma)), textureColor.w);\n" + + + "}\n"; + + return shader; + } +} \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java new file mode 100644 index 00000000..26e7a3b9 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java @@ -0,0 +1,103 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +import java.util.Date; +import java.util.Random; + +/** + * Applies film grain effect to preview. + */ +public class GrainEffect implements ShaderInterface { + private int mWidth; + private int mHeight; + private float strength; + private Random mRandom; + + /** + * Initialize Effect + * + * @param strength Float, between 0 and 1. Zero means no distortion, while 1 + * indicates the maximum amount of adjustment. + */ + public GrainEffect(float strength) { + if (strength < 0.0f) + strength = 0.0f; + if (strength > 1.0f) + strength = 1.0f; + this.strength = strength; + } + + /** + * Init all values that will be used by this shader. + * + * @param mGlSurfaceView which is responsible for displaying your video + */ + private void initValues(GLSurfaceView mGlSurfaceView) { + mWidth = mGlSurfaceView.getWidth(); + mHeight = mGlSurfaceView.getHeight(); + mRandom = new Random(new Date().getTime()); + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + initValues(mGlSurfaceView); + + float seed[] = {mRandom.nextFloat(), mRandom.nextFloat()}; + String scaleString = "scale = " + strength + ";\n"; + String seedString[] = new String[2]; + seedString[0] = "seed[0] = " + seed[0] + ";\n"; + seedString[1] = "seed[1] = " + seed[1] + ";\n"; + String stepX = "stepX = " + 0.5f / mWidth + ";\n"; + String stepY = "stepY = " + 0.5f / mHeight + ";\n"; + + // locString[1] = "loc[1] = loc[1]+" + seedString[1] + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + " vec2 seed;\n" + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES tex_sampler_0;\n" + + "uniform samplerExternalOES tex_sampler_1;\n" + + "float scale;\n" + + " float stepX;\n" + + " float stepY;\n" + + "float rand(vec2 loc) {\n" + + " float theta1 = dot(loc, vec2(0.9898, 0.233));\n" + + " float theta2 = dot(loc, vec2(12.0, 78.0));\n" + + " float value = cos(theta1) * sin(theta2) + sin(theta1) * cos(theta2);\n" + + + // keep value of part1 in range: (2^-14 to 2^14). + " 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" + + " float sum = (part1 + part2 + part3);\n" + + " return fract(sum)*scale;\n" + + "}\n" + + "void main() {\n" + // Parameters that were created above + + seedString[0] + + seedString[1] + + scaleString + + stepX + + stepY + + " float noise = texture2D(tex_sampler_1, vTextureCoord + vec2(-stepX, -stepY)).r * 0.224;\n" + + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(-stepX, stepY)).r * 0.224;\n" + + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(stepX, -stepY)).r * 0.224;\n" + + " noise += texture2D(tex_sampler_1, vTextureCoord + vec2(stepX, stepY)).r * 0.224;\n" + + " noise += 0.4448;\n" + + " noise *= scale;\n" + + " vec4 color = texture2D(tex_sampler_0, vTextureCoord);\n" + + " float energy = 0.33333 * color.r + 0.33333 * color.g + 0.33333 * color.b;\n" + + " float mask = (1.0 - sqrt(energy));\n" + + " float weight = 1.0 - 1.333 * mask * noise;\n" + + " gl_FragColor = vec4(color.rgb * weight, color.a);\n" + + " gl_FragColor = gl_FragColor+vec4(rand(vTextureCoord + seed), rand(vTextureCoord + seed),rand(vTextureCoord + seed),1);\n" + + "}\n"; + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java new file mode 100644 index 00000000..2f3ed4de --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java @@ -0,0 +1,32 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Converts preview to GreyScale. + */ +public class GreyScaleEffect implements ShaderInterface { + /** + * Initialize Effect + */ + public GreyScaleEffect() { + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + "varying vec2 vTextureCoord;\n" + "void main() {\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float y = dot(color, vec4(0.299, 0.587, 0.114, 0));\n" + + " gl_FragColor = vec4(y, y, y, color.a);\n" + "}\n"; + ; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java new file mode 100644 index 00000000..08582505 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java @@ -0,0 +1,70 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Apply Hue effect on the preview + */ +public class HueEffect implements ShaderInterface { + float hueValue; + + /** + * Initialize Effect + *

+ * Hue value chart + * + * @param hueDegrees Range of value should be between 0 to 360 degrees as described in the image above + */ + public HueEffect(float hueDegrees) { +// manipulating input value so that we can map it on 360 degree circle + hueValue = ((hueDegrees - 45) / 45f + 0.5f) * -1; + + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + + "float hue=" + hueValue + ";\n" + + + "void main() {\n" + + + "vec4 kRGBToYPrime = vec4 (0.299, 0.587, 0.114, 0.0);\n" + + "vec4 kRGBToI = vec4 (0.595716, -0.274453, -0.321263, 0.0);\n" + + "vec4 kRGBToQ = vec4 (0.211456, -0.522591, 0.31135, 0.0);\n" + + + "vec4 kYIQToR = vec4 (1.0, 0.9563, 0.6210, 0.0);\n" + + "vec4 kYIQToG = vec4 (1.0, -0.2721, -0.6474, 0.0);\n" + + "vec4 kYIQToB = vec4 (1.0, -1.1070, 1.7046, 0.0);\n" + + + + "vec4 color = texture2D(sTexture, vTextureCoord);\n" + + + "float YPrime = dot(color, kRGBToYPrime);\n" + + "float I = dot(color, kRGBToI);\n" + + "float Q = dot(color, kRGBToQ);\n" + + + "float chroma = sqrt (I * I + Q * Q);\n" + + + "Q = chroma * sin (hue);\n" + + + "I = chroma * cos (hue);\n" + + + "vec4 yIQ = vec4 (YPrime, I, Q, 0.0);\n" + + + "color.r = dot (yIQ, kYIQToR);\n" + + "color.g = dot (yIQ, kYIQToG);\n" + + "color.b = dot (yIQ, kYIQToB);\n" + + "gl_FragColor = color;\n" + + + "}\n"; + + return shader; + } +} \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java new file mode 100644 index 00000000..ed406e28 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java @@ -0,0 +1,34 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Inverts the preview colors. This can also be known as negative Effect. + */ +public class InvertColorsEffect implements ShaderInterface { + /** + * Initialize Effect + */ + public InvertColorsEffect() { + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float colorR = (1.0 - color.r) / 1.0;\n" + + " float colorG = (1.0 - color.g) / 1.0;\n" + + " float colorB = (1.0 - color.b) / 1.0;\n" + + " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n" + + "}\n"; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java new file mode 100644 index 00000000..0f1f8748 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java @@ -0,0 +1,158 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +import java.util.Date; +import java.util.Random; + +/** + * Applies lomo-camera style effect to preview. + */ +public class LamoishEffect implements ShaderInterface { + private int mWidth; + private int mHeight; + private Random mRandom; + + /** + * Initialize Effect + */ + public LamoishEffect() { + + } + + /** + * Init all values that will be used by this shader. + * + * @param mGlSurfaceView which is responsible for displaying your video + */ + private void initValues(GLSurfaceView mGlSurfaceView) { + mWidth = mGlSurfaceView.getWidth(); + mHeight = mGlSurfaceView.getHeight(); + mRandom = new Random(new Date().getTime()); + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + initValues(mGlSurfaceView); + float scale[] = new float[2]; + if (mWidth > mHeight) { + scale[0] = 1f; + scale[1] = ((float) mHeight) / mWidth; + } else { + scale[0] = ((float) mWidth) / mHeight; + scale[1] = 1f; + } + float max_dist = ((float) Math.sqrt(scale[0] * scale[0] + scale[1] + * scale[1])) * 0.5f; + + float seed[] = {mRandom.nextFloat(), mRandom.nextFloat()}; + + String scaleString[] = new String[2]; + String seedString[] = new String[2]; + + scaleString[0] = "scale[0] = " + scale[0] + ";\n"; + scaleString[1] = "scale[1] = " + scale[1] + ";\n"; + + seedString[0] = "seed[0] = " + seed[0] + ";\n"; + seedString[1] = "seed[1] = " + seed[1] + ";\n"; + + String inv_max_distString = "inv_max_dist = " + 1.0f / max_dist + ";\n"; + String stepsizeString = "stepsize = " + 1.0f / 255.0f + ";\n"; + String stepsizeXString = "stepsizeX = " + 1.0f / mWidth + ";\n"; + String stepsizeYString = "stepsizeY = " + 1.0f / mHeight + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " vec2 seed;\n" + + " float stepsizeX;\n" + + " float stepsizeY;\n" + + " float stepsize;\n" + + " vec2 scale;\n" + + " float inv_max_dist;\n" + + "varying vec2 vTextureCoord;\n" + + "float rand(vec2 loc) {\n" + + " float theta1 = dot(loc, vec2(0.9898, 0.233));\n" + + " float theta2 = dot(loc, vec2(12.0, 78.0));\n" + + " float value = cos(theta1) * sin(theta2) + sin(theta1) * cos(theta2);\n" + + + // keep value of part1 in range: (2^-14 to 2^14). + " 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" + // Parameters that were created above + + scaleString[0] + + scaleString[1] + + seedString[0] + + seedString[1] + + inv_max_distString + + stepsizeString + + stepsizeXString + + stepsizeYString + // sharpen + + " vec3 nbr_color = vec3(0.0, 0.0, 0.0);\n" + + " vec2 coord;\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " coord.x = vTextureCoord.x - 0.5 * stepsizeX;\n" + + " coord.y = vTextureCoord.y - stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " coord.x = vTextureCoord.x - stepsizeX;\n" + + " coord.y = vTextureCoord.y + 0.5 * stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " coord.x = vTextureCoord.x + stepsizeX;\n" + + " coord.y = vTextureCoord.y - 0.5 * stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " coord.x = vTextureCoord.x + stepsizeX;\n" + + " coord.y = vTextureCoord.y + 0.5 * stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " vec3 s_color = vec3(color.rgb + 0.3 * nbr_color);\n" + + + // cross process + " vec3 c_color = vec3(0.0, 0.0, 0.0);\n" + + " float value;\n" + + " if (s_color.r < 0.5) {\n" + + " value = s_color.r;\n" + + " } else {\n" + + " value = 1.0 - s_color.r;\n" + + " }\n" + + " float red = 4.0 * value * value * value;\n" + + " if (s_color.r < 0.5) {\n" + + " c_color.r = red;\n" + + " } else {\n" + + " c_color.r = 1.0 - red;\n" + + " }\n" + + " if (s_color.g < 0.5) {\n" + + " value = s_color.g;\n" + + " } else {\n" + + " value = 1.0 - s_color.g;\n" + + " }\n" + + " float green = 2.0 * value * value;\n" + + " if (s_color.g < 0.5) {\n" + + " c_color.g = green;\n" + + " } else {\n" + + " c_color.g = 1.0 - green;\n" + + " }\n" + + " c_color.b = s_color.b * 0.5 + 0.25;\n" + + + // blackwhite + " float dither = rand(vTextureCoord + 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" + + + // vignette + " coord = vTextureCoord - vec2(0.5, 0.5);\n" + + " float dist = length(coord * scale);\n" + + " float lumen = 0.85 / (1.0 + exp((dist * inv_max_dist - 0.73) * 20.0)) + 0.15;\n" + + " gl_FragColor = vec4(bw_color * lumen, color.a);\n" + "}\n"; + ; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java new file mode 100644 index 00000000..f5872662 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java @@ -0,0 +1,31 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Displays the normal preview without any effect. + */ +public class NoEffect implements ShaderInterface { + /** + * Initialize + */ + public NoEffect() { + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + + "void main() {\n" + + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + + "}\n"; + + return shader; + + } +} \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java new file mode 100644 index 00000000..414241be --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java @@ -0,0 +1,33 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Applies Posterization effect to Preview. + */ +public class PosterizeEffect implements ShaderInterface { + /** + * Initialize Effect + */ + public PosterizeEffect() { + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + "varying vec2 vTextureCoord;\n" + "void main() {\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " vec3 pcolor;\n" + + " pcolor.r = (color.r >= 0.5) ? 0.75 : 0.25;\n" + + " pcolor.g = (color.g >= 0.5) ? 0.75 : 0.25;\n" + + " pcolor.b = (color.b >= 0.5) ? 0.75 : 0.25;\n" + + " gl_FragColor = vec4(pcolor, color.a);\n" + "}\n"; + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java new file mode 100644 index 00000000..4f919d19 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java @@ -0,0 +1,86 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Adjusts color saturation of preview. + */ +public class SaturationEffect implements ShaderInterface { + private float scale = 0f; + + /** + * Initialize Effect + * + * @param scale Float, between -1 and 1. 0 means no change, while -1 indicates + * full desaturation, i.e. grayscale. + */ + public SaturationEffect(float scale) { + + this.scale = scale; + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + float shift = 1.0f / 255.0f; + float weights[] = {2f / 8f, 5f / 8f, 1f / 8f}; + float exponents[] = new float[3]; + + String weightsString[] = new String[3]; + String exponentsString[] = new String[3]; + exponentsString[0] = ""; + exponentsString[1] = ""; + exponentsString[2] = ""; + String scaleString = ""; + + if (scale > 0.0f) { + exponents[0] = (0.9f * scale) + 1.0f; + exponents[1] = (2.1f * scale) + 1.0f; + exponents[2] = (2.7f * scale) + 1.0f; + exponentsString[0] = "exponents[0] = " + exponents[0] + ";\n"; + exponentsString[1] = "exponents[1] = " + exponents[1] + ";\n"; + exponentsString[2] = "exponents[2] = " + exponents[2] + ";\n"; + } else + scaleString = "scale = " + (1.0f + scale) + ";\n"; + + weightsString[0] = "weights[0] = " + weights[0] + ";\n"; + weightsString[1] = "weights[1] = " + weights[1] + ";\n"; + weightsString[2] = "weights[2] = " + weights[2] + ";\n"; + String shiftString = "shift = " + shift + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + " float scale;\n" + + " float shift;\n" + " vec3 weights;\n" + " vec3 exponents;\n" + + "varying vec2 vTextureCoord;\n" + "void main() {\n" + // Parameters that were created above + + weightsString[0] + + weightsString[1] + + weightsString[2] + + shiftString + + scaleString + + " vec4 oldcolor = texture2D(sTexture, vTextureCoord);\n" + + " float kv = dot(oldcolor.rgb, weights) + shift;\n" + + " vec3 new_color = scale * oldcolor.rgb + (1.0 - scale) * kv;\n" + + " gl_FragColor= vec4(new_color, oldcolor.a);\n" + // Parameters that were created above + + weightsString[0] + + weightsString[1] + + weightsString[2] + + exponentsString[0] + + exponentsString[1] + + exponentsString[2] + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float de = dot(color.rgb, weights);\n" + + " float inv_de = 1.0 / de;\n" + + " vec3 verynew_color = de * pow(color.rgb * inv_de, exponents);\n" + + " float max_color = max(max(max(verynew_color.r, verynew_color.g), verynew_color.b), 1.0);\n" + + " gl_FragColor = gl_FragColor+vec4(verynew_color / max_color, color.a);\n" + + "}\n"; + + return shader; + + } + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java new file mode 100644 index 00000000..5034b75e --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java @@ -0,0 +1,49 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Converts preview to Sepia tone. + */ +public class SepiaEffect implements ShaderInterface { + /** + * Initialize Effect + */ + public SepiaEffect() { + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + float weights[] = {805.0f / 2048.0f, 715.0f / 2048.0f, + 557.0f / 2048.0f, 1575.0f / 2048.0f, 1405.0f / 2048.0f, + 1097.0f / 2048.0f, 387.0f / 2048.0f, 344.0f / 2048.0f, + 268.0f / 2048.0f}; + String matrixString[] = new String[9]; + + matrixString[0] = " matrix[0][0]=" + weights[0] + ";\n"; + matrixString[1] = " matrix[0][1]=" + weights[1] + ";\n"; + matrixString[2] = " matrix[0][2]=" + weights[2] + ";\n"; + matrixString[3] = " matrix[1][0]=" + weights[3] + ";\n"; + matrixString[4] = " matrix[1][1]=" + weights[4] + ";\n"; + matrixString[5] = " matrix[1][2]=" + weights[5] + ";\n"; + matrixString[6] = " matrix[2][0]=" + weights[6] + ";\n"; + matrixString[7] = " matrix[2][1]=" + weights[7] + ";\n"; + matrixString[8] = " matrix[2][2]=" + weights[8] + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + " mat3 matrix;\n" + + "varying vec2 vTextureCoord;\n" + "void main() {\n" + + matrixString[0] + matrixString[1] + matrixString[2] + + matrixString[3] + matrixString[4] + matrixString[5] + + matrixString[6] + matrixString[7] + matrixString[8] + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " vec3 new_color = min(matrix * color.rgb, 1.0);\n" + + " gl_FragColor = vec4(new_color.rgb, color.a);\n" + "}\n"; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java new file mode 100644 index 00000000..494a6136 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java @@ -0,0 +1,80 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Sharpens the preview. + */ +public class SharpnessEffect implements ShaderInterface { + private int mWidth; + private int mHeight; + private float scale = 0f; + + /** + * Initialize Effect + * + * @param scale Float, between 0 and 1. 0 means no change. + */ + public SharpnessEffect(float scale) { + if (scale < 0.0f) + scale = 0.0f; + if (scale > 1.0f) + scale = 1.0f; + + this.scale = scale; + } + + /** + * Init all values that will be used by this shader. + * + * @param mGlSurfaceView which is responsible for displaying your video + */ + private void initValues(GLSurfaceView mGlSurfaceView) { + mWidth = mGlSurfaceView.getWidth(); + mHeight = mGlSurfaceView.getHeight(); + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + initValues(mGlSurfaceView); + + String stepsizeXString = "stepsizeX = " + 1.0f / mWidth + ";\n"; + String stepsizeYString = "stepsizeY = " + 1.0f / mHeight + ";\n"; + String scaleString = "scale = " + scale + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " float scale;\n" + + " float stepsizeX;\n" + + " float stepsizeY;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + // Parameters that were created above + + stepsizeXString + + stepsizeYString + + scaleString + + " vec3 nbr_color = vec3(0.0, 0.0, 0.0);\n" + + " vec2 coord;\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " coord.x = vTextureCoord.x - 0.5 * stepsizeX;\n" + + " coord.y = vTextureCoord.y - stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " coord.x = vTextureCoord.x - stepsizeX;\n" + + " coord.y = vTextureCoord.y + 0.5 * stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " coord.x = vTextureCoord.x + stepsizeX;\n" + + " coord.y = vTextureCoord.y - 0.5 * stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " coord.x = vTextureCoord.x + stepsizeX;\n" + + " coord.y = vTextureCoord.y + 0.5 * stepsizeY;\n" + + " nbr_color += texture2D(sTexture, coord).rgb - color.rgb;\n" + + " gl_FragColor = vec4(color.rgb - 2.0 * scale * nbr_color, color.a);\n" + + "}\n"; + + return shader; + + } + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java new file mode 100644 index 00000000..bf3e61b6 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java @@ -0,0 +1,55 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + +/** + * Adjusts color temperature of the preview. + */ +public class TemperatureEffect implements ShaderInterface { + private float scale = 0f; + + /** + * Initialize Effect + * + * @param scale Float, between 0 and 1, with 0 indicating cool, and 1 + * indicating warm. A value of of 0.5 indicates no change. + */ + public TemperatureEffect(float scale) { + if (scale < 0.0f) + scale = 0.0f; + if (scale > 1.0f) + scale = 1.0f; + this.scale = scale; + + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + + String scaleString = "scale = " + (2.0f * scale - 1.0f) + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " float scale;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" // Parameters that were created above + + scaleString + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " vec3 new_color = color.rgb;\n" + + " new_color.r = color.r + color.r * ( 1.0 - color.r) * scale;\n" + + " new_color.b = color.b - color.b * ( 1.0 - color.b) * scale;\n" + + " if (scale > 0.0) { \n" + + " new_color.g = color.g + color.g * ( 1.0 - color.g) * scale * 0.25;\n" + + " }\n" + + " float max_value = max(new_color.r, max(new_color.g, new_color.b));\n" + + " if (max_value > 1.0) { \n" + + " new_color /= max_value;\n" + " } \n" + + " gl_FragColor = vec4(new_color, color.a);\n" + "}\n"; + + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java new file mode 100644 index 00000000..abfd6a7b --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java @@ -0,0 +1,63 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.graphics.Color; +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + + +/** + * Tints the preview with specified color.. + */ +public class TintEffect implements ShaderInterface { + private int mTint = 0xFF0000FF; + + /** + * Initialize Effect + * + * @param color Integer, representing an ARGB color with 8 bits per channel. + * May be created using Color class. + */ + public TintEffect(int color) { + this.mTint = color; + + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + float color_ratio[] = {0.21f, 0.71f, 0.07f}; + String color_ratioString[] = new String[3]; + color_ratioString[0] = "color_ratio[0] = " + color_ratio[0] + ";\n"; + color_ratioString[1] = "color_ratio[1] = " + color_ratio[1] + ";\n"; + color_ratioString[2] = "color_ratio[2] = " + color_ratio[2] + ";\n"; + + float tint_color[] = {Color.red(mTint) / 255f, + Color.green(mTint) / 255f, Color.blue(mTint) / 255f}; + + String tintString[] = new String[3]; + tintString[0] = "tint[0] = " + tint_color[0] + ";\n"; + tintString[1] = "tint[1] = " + tint_color[1] + ";\n"; + tintString[2] = "tint[2] = " + tint_color[2] + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " vec3 tint;\n" + + " vec3 color_ratio;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + // Parameters that were created above + + color_ratioString[0] + + color_ratioString[1] + + color_ratioString[2] + + tintString[0] + + tintString[1] + + tintString[2] + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " float avg_color = dot(color_ratio, color.rgb);\n" + + " vec3 new_color = min(0.8 * avg_color + 0.2 * tint, 1.0);\n" + + " gl_FragColor = vec4(new_color.rgb, color.a);\n" + "}\n"; + return shader; + + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java new file mode 100644 index 00000000..01792e42 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java @@ -0,0 +1,95 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import android.opengl.GLSurfaceView; + +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; + + +/** + * Applies lomo-camera style effect to your preview. + */ +public class VignetteEffect implements ShaderInterface { + private int mWidth = 0; + private int mHeight = 0; + private float mScale = 0f; + private final float mShade = 0.85f; + + /** + * Initialize Effect + * + * @param scale Float, between 0 and 1. 0 means no change. + */ + public VignetteEffect(float scale) { + if (scale < 0.0f) + scale = 0.0f; + if (scale > 1.0f) + scale = 1.0f; + this.mScale = scale; + + } + + /** + * Init all values that will be used by this shader. + * + * @param mGlSurfaceView which is responsible for displaying your preview + */ + private void initValues(GLSurfaceView mGlSurfaceView) { + mWidth = mGlSurfaceView.getWidth(); + mHeight = mGlSurfaceView.getHeight(); + } + + @Override + public String getShader(GLSurfaceView mGlSurfaceView) { + initValues(mGlSurfaceView); + float scale[] = new float[2]; + if (mWidth > mHeight) { + scale[0] = 1f; + scale[1] = ((float) mHeight) / mWidth; + } else { + scale[0] = ((float) mWidth) / mHeight; + scale[1] = 1f; + } + float max_dist = ((float) Math.sqrt(scale[0] * scale[0] + scale[1] + * scale[1])) * 0.5f; + + String scaleString[] = new String[2]; + + scaleString[0] = "scale[0] = " + scale[0] + ";\n"; + scaleString[1] = "scale[1] = " + scale[1] + ";\n"; + String inv_max_distString = "inv_max_dist = " + 1.0f / max_dist + ";\n"; + String shadeString = "shade = " + mShade + ";\n"; + + // The 'range' is between 1.3 to 0.6. When scale is zero then range is + // 1.3 + // which means no vignette at all because the luminousity difference is + // less than 1/256 and will cause nothing. + String rangeString = "range = " + + (1.30f - (float) Math.sqrt(mScale) * 0.7f) + ";\n"; + + String shader = "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "uniform samplerExternalOES sTexture;\n" + + " float range;\n" + + " float inv_max_dist;\n" + + " float shade;\n" + + " vec2 scale;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + // Parameters that were created above + + scaleString[0] + + scaleString[1] + + inv_max_distString + + shadeString + + rangeString + + " const float slope = 20.0;\n" + + " vec2 coord = vTextureCoord - vec2(0.5, 0.5);\n" + + " float dist = length(coord * scale);\n" + + " float lumen = shade / (1.0 + exp((dist * inv_max_dist - range) * slope)) + (1.0 - shade);\n" + + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + + " gl_FragColor = vec4(color.rgb * lumen, color.a);\n" + + "}\n"; + + return shader; + + } +} From 32ef8f55382ba454c13278da9ecb9e74c7014aa1 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Wed, 24 Jul 2019 17:54:11 +0530 Subject: [PATCH 02/12] added setting shaders --- .../com/otaliastudios/cameraview/CameraView.java | 16 ++++++++++++++++ .../cameraview/internal/egl/EglViewport.java | 9 +++++---- .../cameraview/preview/GlCameraPreview.java | 4 ++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index e54bfaab..b1f070be 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -26,6 +26,7 @@ import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import android.util.AttributeSet; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; @@ -67,6 +68,8 @@ import com.otaliastudios.cameraview.preview.CameraPreview; import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; +import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.SizeSelector; @@ -2129,4 +2132,17 @@ public class CameraView extends FrameLayout implements LifecycleObserver { } //endregion + + //region Effects + + public void changeEffect(ShaderInterface shader) { + if (mCameraPreview instanceof GlCameraPreview) { + String effect = shader.getShader(((GlCameraPreview) mCameraPreview).getView()); + ((GlCameraPreview) mCameraPreview).setEffectFragmentShader(effect); + } else { + LOG.e("changeEffect", "changeEffect is supported only for GLSurfaceView"); + } + } + + //endregion } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index e015cb7b..0840de77 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -79,10 +79,7 @@ public class EglViewport extends EglElement { public EglViewport() { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; - //mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER); - - ShaderInterface effect = new BlackAndWhiteEffect(); - mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, effect.getShader(null)); + mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER); maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); checkLocation(maPositionLocation, "aPosition"); @@ -124,6 +121,10 @@ public class EglViewport extends EglElement { return texId; } + public void changeEffectFragmentShader(String fragmentShader){ + mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, fra); + } + public void drawFrame(int textureId, float[] textureMatrix) { drawFrame(textureId, textureMatrix, mVertexCoordinatesArray, diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index 525c579d..c88a921a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -308,4 +308,8 @@ public class GlCameraPreview extends CameraPreview Date: Wed, 24 Jul 2019 18:47:16 +0530 Subject: [PATCH 03/12] intermediate commit --- .../com/otaliastudios/cameraview/internal/egl/EglViewport.java | 2 +- .../com/otaliastudios/cameraview/preview/GlCameraPreview.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 0840de77..c9b21670 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -122,7 +122,7 @@ public class EglViewport extends EglElement { } public void changeEffectFragmentShader(String fragmentShader){ - mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, fra); + mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, fragmentShader); } public void drawFrame(int textureId, float[] textureMatrix) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index c88a921a..b2ec5c5a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -7,6 +7,7 @@ import android.opengl.Matrix; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import android.util.Log; import android.view.LayoutInflater; import android.view.SurfaceHolder; import android.view.View; From 92a82c4f0427d55dfdd61503c215d41ad2a1db42 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 26 Jul 2019 18:55:20 +0530 Subject: [PATCH 04/12] added shader implementation --- .../otaliastudios/cameraview/CameraView.java | 11 ++++++++- .../cameraview/internal/egl/EglViewport.java | 23 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index b1f070be..b652e326 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -575,6 +575,13 @@ public class CameraView extends FrameLayout implements LifecycleObserver { LOG.i("onTouchEvent", "tap!"); onGesture(mTapGestureFinder, options); } + + if( MotionEvent.ACTION_UP == event.getAction()) { + Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); + + changeEffect(new BlackAndWhiteEffect()); + } + return true; } @@ -2139,8 +2146,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if (mCameraPreview instanceof GlCameraPreview) { String effect = shader.getShader(((GlCameraPreview) mCameraPreview).getView()); ((GlCameraPreview) mCameraPreview).setEffectFragmentShader(effect); + + //doInstantiatePreview(); } else { - LOG.e("changeEffect", "changeEffect is supported only for GLSurfaceView"); + LOG.w("changeEffect", "changeEffect is supported only for GLSurfaceView"); } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index c9b21670..8567adca 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -76,10 +76,19 @@ public class EglViewport extends EglElement { // private int muTexOffsetLoc; // Used for filtering // private int muColorAdjustLoc; // Used for filtering + private String vertexShader = SIMPLE_VERTEX_SHADER; + private String fragmentShader = SIMPLE_FRAGMENT_SHADER; + + private boolean isShaderChanged = false; + public EglViewport() { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; + initProgram(); + } - mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER); + private void initProgram(){ + + mProgramHandle = createProgram(vertexShader, fragmentShader); maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); checkLocation(maPositionLocation, "aPosition"); @@ -91,7 +100,6 @@ public class EglViewport extends EglElement { checkLocation(muTexMatrixLocation, "uTexMatrix"); // Stuff from Drawable2d.FULL_RECTANGLE - } public void release(boolean doEglCleanup) { @@ -122,9 +130,12 @@ public class EglViewport extends EglElement { } public void changeEffectFragmentShader(String fragmentShader){ - mProgramHandle = createProgram(SIMPLE_VERTEX_SHADER, fragmentShader); + this.fragmentShader = fragmentShader; + isShaderChanged = true; } + + public void drawFrame(int textureId, float[] textureMatrix) { drawFrame(textureId, textureMatrix, mVertexCoordinatesArray, @@ -147,6 +158,12 @@ public class EglViewport extends EglElement { private void drawFrame(int textureId, float[] textureMatrix, FloatBuffer vertexBuffer, FloatBuffer texBuffer) { + + if (isShaderChanged){ + initProgram(); + isShaderChanged = false; + } + check("draw start"); // Select the program. From 6f8b3e2297ad6805e7dfce643b30a8824f041d22 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Mon, 29 Jul 2019 13:10:55 +0530 Subject: [PATCH 05/12] refatored code --- .../otaliastudios/cameraview/CameraView.java | 19 +++- .../cameraview/internal/egl/EglViewport.java | 2 - .../shadereffects/BaseShaderEffect.java | 104 ++++++++++++++++++ .../shadereffects/ShaderInterface.java | 20 ---- .../shadereffects/effects/AutoFixEffect.java | 11 +- .../effects/BlackAndWhiteEffect.java | 14 +-- .../effects/BrightnessEffect.java | 8 +- .../shadereffects/effects/ContrastEffect.java | 8 +- .../effects/CrossProcessEffect.java | 8 +- .../effects/DocumentaryEffect.java | 15 +-- .../shadereffects/effects/DuotoneEffect.java | 7 +- .../effects/FillLightEffect.java | 8 +- .../shadereffects/effects/GammaEffect.java | 8 +- .../shadereffects/effects/GrainEffect.java | 6 +- .../effects/GreyScaleEffect.java | 8 +- .../shadereffects/effects/HueEffect.java | 8 +- .../effects/InvertColorsEffect.java | 8 +- .../shadereffects/effects/LamoishEffect.java | 6 +- .../shadereffects/effects/NoEffect.java | 8 +- .../effects/PosterizeEffect.java | 8 +- .../effects/SaturationEffect.java | 8 +- .../shadereffects/effects/SepiaEffect.java | 8 +- .../effects/SharpnessEffect.java | 6 +- .../effects/TemperatureEffect.java | 8 +- .../shadereffects/effects/TintEffect.java | 7 +- .../shadereffects/effects/VignetteEffect.java | 6 +- 26 files changed, 192 insertions(+), 135 deletions(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java delete mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index b652e326..c5f01edb 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -19,6 +19,7 @@ import android.graphics.PointF; import android.graphics.Rect; import android.location.Location; import android.media.MediaActionSound; +import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Handler; import android.os.Looper; @@ -68,7 +69,7 @@ import com.otaliastudios.cameraview.preview.CameraPreview; import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; @@ -579,7 +580,8 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if( MotionEvent.ACTION_UP == event.getAction()) { Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); - changeEffect(new BlackAndWhiteEffect()); + BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); + changeEffect(effect); } return true; @@ -2142,9 +2144,18 @@ public class CameraView extends FrameLayout implements LifecycleObserver { //region Effects - public void changeEffect(ShaderInterface shader) { + public GLSurfaceView getCurrentPreviewingGlSurfaceView(){ if (mCameraPreview instanceof GlCameraPreview) { - String effect = shader.getShader(((GlCameraPreview) mCameraPreview).getView()); + return ((GlCameraPreview) mCameraPreview).getView(); + } + + LOG.w("getCurrentPreviewingGlSurfaceView", "current preview is not GLSurfaceView"); + return null; + } + + public void changeEffect(BaseShaderEffect shader) { + if (mCameraPreview instanceof GlCameraPreview) { + String effect = shader.getFragmentShader(); ((GlCameraPreview) mCameraPreview).setEffectFragmentShader(effect); //doInstantiatePreview(); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 8567adca..1859fb2e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -5,8 +5,6 @@ import android.opengl.GLES11Ext; import android.opengl.GLES20; import com.otaliastudios.cameraview.CameraLogger; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; -import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; import java.nio.FloatBuffer; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java new file mode 100644 index 00000000..29270b9a --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java @@ -0,0 +1,104 @@ +package com.otaliastudios.cameraview.shadereffects; + +import android.opengl.GLSurfaceView; + +/** + * An interface that every effect must implement so that there is a common + * getFragmentShader method that every effect class is force to override + */ +public abstract class BaseShaderEffect { + + /** + * Empty default constructor + */ + public BaseShaderEffect(){ + } + + /** + * parameterized constructor with previewing GLSurfaceView as parameter + * @param glSurfaceView + */ + public BaseShaderEffect(GLSurfaceView glSurfaceView) { + this.mGlSurfaceView = glSurfaceView; + } + + /** + * Previewing GlSurfaceview. + * This will be used by a few effects. + */ + protected GLSurfaceView mGlSurfaceView; + + public void setGlSurfaceView(GLSurfaceView glSurfaceView) { + this.mGlSurfaceView = glSurfaceView; + } + + public String getPositionVariableName() { + return mPositionVariableName; + } + + /** + * Local variable name which were used in the shader code. + * These will be used by openGL program to render these vertex and fragment shader + */ + private String mPositionVariableName = "aPosition"; + private String mTextureCoordinateVariableName = "aTextureCoord"; + private String mMVPMatrixVariableName = "uMVPMatrix"; + private String mTextureMatrixVariableName = "uTexMatrix"; + + + public void setPositionVariableName(String positionVariableName) { + this.mPositionVariableName = positionVariableName; + } + + public String getTexttureCoordinateVariableName() { + return mTextureCoordinateVariableName; + } + + public void setTexttureCoordinateVariableName(String texttureCoordinateVariableName) { + this.mTextureCoordinateVariableName = texttureCoordinateVariableName; + } + + public String getMVPMatrixVariableName() { + return mMVPMatrixVariableName; + } + + public void setMVPMatrixVariableName(String mvpMatrixVariableName) { + this.mMVPMatrixVariableName = mvpMatrixVariableName; + } + + public String getTextureMatrixVariableName() { + return mTextureMatrixVariableName; + } + + public void setTextureMatrixVariableName(String textureMatrixVariableName) { + this.mTextureMatrixVariableName = textureMatrixVariableName; + } + + /** + * Get vertex Shader code + * + * @return complete shader code in C + *

+ * This is the default implementation, each effect can implement its own. + */ + public String getVertextShader() { + return "uniform mat4 uMVPMatrix;\n" + + "uniform mat4 uTexMatrix;\n" + + "attribute vec4 aPosition;\n" + + "attribute vec4 aTextureCoord;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + + " gl_Position = uMVPMatrix * aPosition;\n" + + " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" + + "}\n"; + } + + + /** + * Get fragment Shader code + * + * @return complete shader code in C + */ + public abstract String getFragmentShader(); + +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java deleted file mode 100644 index 09a39c24..00000000 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderInterface.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.otaliastudios.cameraview.shadereffects; - -import android.opengl.GLSurfaceView; - -/** - * An interface that every effect must implement so that there is a common - * getShader method that every effect class is force to override - */ -public interface ShaderInterface { - /** - * Returns Shader code - * - * @param mGlSurfaceView - * send this for every shader but this will only be used when the - * shader needs it. - * @return complete shader code in C - */ - public String getShader(GLSurfaceView mGlSurfaceView); - -} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java index 3e9efcce..42afb1e9 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java @@ -1,13 +1,14 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Attempts to auto-fix the preview based on histogram equalization. */ -public class AutoFixEffect implements ShaderInterface { +public class AutoFixEffect extends BaseShaderEffect { + + + private float scale; /** @@ -26,7 +27,7 @@ public class AutoFixEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java index cdea63b3..5e9b21c6 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BlackAndWhiteEffect.java @@ -1,21 +1,21 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Converts the preview into black and white colors */ -public class BlackAndWhiteEffect implements ShaderInterface { +public class BlackAndWhiteEffect extends BaseShaderEffect { + + /** - * Initialize Effect + * Initialize effect */ - public BlackAndWhiteEffect() { + public BlackAndWhiteEffect(){ } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java index 0d399834..d684428b 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Adjusts the brightness of the preview. */ -public class BrightnessEffect implements ShaderInterface { +public class BrightnessEffect extends BaseShaderEffect { private float brightnessValue; /** @@ -25,7 +23,7 @@ public class BrightnessEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java index 6dddb63a..103a7955 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java @@ -1,12 +1,10 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Adjusts the contrast of the preview. */ -public class ContrastEffect implements ShaderInterface { +public class ContrastEffect extends BaseShaderEffect { private float contrast; /** @@ -24,7 +22,7 @@ public class ContrastEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java index d576901d..8b327cc1 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CrossProcessEffect.java @@ -1,14 +1,12 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Applies a cross process effect on preview, in which the red and green channels * are enhanced while the blue channel is restricted. */ -public class CrossProcessEffect implements ShaderInterface { +public class CrossProcessEffect extends BaseShaderEffect { /** * Initialize Effect @@ -17,7 +15,7 @@ public class CrossProcessEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java index 8eb0e713..b03351e7 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java @@ -2,7 +2,7 @@ package com.otaliastudios.cameraview.shadereffects.effects; import android.opengl.GLSurfaceView; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import java.util.Date; import java.util.Random; @@ -10,22 +10,13 @@ import java.util.Random; /** * Applies black and white documentary style effect on preview. */ -public class DocumentaryEffect implements ShaderInterface { +public class DocumentaryEffect extends BaseShaderEffect { private int mWidth; private int mHeight; private Random mRandom; - /** - * Initialize Effect - */ - public DocumentaryEffect() { - - } - /** * Init all values that will be used by this shader. - * - * @param mGlSurfaceView which is responsible for displaying your video */ private void initValues(GLSurfaceView mGlSurfaceView) { mWidth = mGlSurfaceView.getWidth(); @@ -34,7 +25,7 @@ public class DocumentaryEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { initValues(mGlSurfaceView); float scale[] = new float[2]; if (mWidth > mHeight) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java index 9ef654af..1626121e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java @@ -1,14 +1,13 @@ package com.otaliastudios.cameraview.shadereffects.effects; import android.graphics.Color; -import android.opengl.GLSurfaceView; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Representation of preview using only two color tones. */ -public class DuotoneEffect implements ShaderInterface { +public class DuotoneEffect extends BaseShaderEffect { // Default values private int mFirstColor = Color.MAGENTA; private int mSecondColor = Color.YELLOW; @@ -27,7 +26,7 @@ public class DuotoneEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { float first[] = {Color.red(mFirstColor) / 255f, Color.green(mFirstColor) / 255f, Color.blue(mFirstColor) / 255f}; float second[] = {Color.red(mSecondColor) / 255f, diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java index 99da3d2c..850674ba 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Applies back-light filling to the preview. */ -public class FillLightEffect implements ShaderInterface { +public class FillLightEffect extends BaseShaderEffect { private float strength = 0f; /** @@ -25,7 +23,7 @@ public class FillLightEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { float fade_gamma = 0.3f; float amt = 1.0f - strength; float mult = 1.0f / (amt * 0.7f + 0.3f); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java index c18293d0..a60085e4 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Apply Gamma Effect on preview being played */ -public class GammaEffect implements ShaderInterface { +public class GammaEffect extends BaseShaderEffect { private float gammaValue; /** @@ -25,7 +23,7 @@ public class GammaEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java index 26e7a3b9..bb1efbe1 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java @@ -2,7 +2,7 @@ package com.otaliastudios.cameraview.shadereffects.effects; import android.opengl.GLSurfaceView; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import java.util.Date; import java.util.Random; @@ -10,7 +10,7 @@ import java.util.Random; /** * Applies film grain effect to preview. */ -public class GrainEffect implements ShaderInterface { +public class GrainEffect extends BaseShaderEffect { private int mWidth; private int mHeight; private float strength; @@ -42,7 +42,7 @@ public class GrainEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { initValues(mGlSurfaceView); float seed[] = {mRandom.nextFloat(), mRandom.nextFloat()}; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java index 2f3ed4de..2406f6ff 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GreyScaleEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Converts preview to GreyScale. */ -public class GreyScaleEffect implements ShaderInterface { +public class GreyScaleEffect extends BaseShaderEffect { /** * Initialize Effect */ @@ -15,7 +13,7 @@ public class GreyScaleEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java index 08582505..dbe1e669 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Apply Hue effect on the preview */ -public class HueEffect implements ShaderInterface { +public class HueEffect extends BaseShaderEffect { float hueValue; /** @@ -24,7 +22,7 @@ public class HueEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java index ed406e28..8510436a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/InvertColorsEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Inverts the preview colors. This can also be known as negative Effect. */ -public class InvertColorsEffect implements ShaderInterface { +public class InvertColorsEffect extends BaseShaderEffect { /** * Initialize Effect */ @@ -15,7 +13,7 @@ public class InvertColorsEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java index 0f1f8748..f3c9ce66 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java @@ -2,7 +2,7 @@ package com.otaliastudios.cameraview.shadereffects.effects; import android.opengl.GLSurfaceView; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import java.util.Date; import java.util.Random; @@ -10,7 +10,7 @@ import java.util.Random; /** * Applies lomo-camera style effect to preview. */ -public class LamoishEffect implements ShaderInterface { +public class LamoishEffect extends BaseShaderEffect { private int mWidth; private int mHeight; private Random mRandom; @@ -34,7 +34,7 @@ public class LamoishEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { initValues(mGlSurfaceView); float scale[] = new float[2]; if (mWidth > mHeight) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java index f5872662..08a4820c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Displays the normal preview without any effect. */ -public class NoEffect implements ShaderInterface { +public class NoEffect extends BaseShaderEffect { /** * Initialize */ @@ -15,7 +13,7 @@ public class NoEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java index 414241be..4fd90b96 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/PosterizeEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Applies Posterization effect to Preview. */ -public class PosterizeEffect implements ShaderInterface { +public class PosterizeEffect extends BaseShaderEffect { /** * Initialize Effect */ @@ -15,7 +13,7 @@ public class PosterizeEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String shader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java index 4f919d19..a99174a8 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Adjusts color saturation of preview. */ -public class SaturationEffect implements ShaderInterface { +public class SaturationEffect extends BaseShaderEffect { private float scale = 0f; /** @@ -22,7 +20,7 @@ public class SaturationEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { float shift = 1.0f / 255.0f; float weights[] = {2f / 8f, 5f / 8f, 1f / 8f}; float exponents[] = new float[3]; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java index 5034b75e..821612c6 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SepiaEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Converts preview to Sepia tone. */ -public class SepiaEffect implements ShaderInterface { +public class SepiaEffect extends BaseShaderEffect { /** * Initialize Effect */ @@ -15,7 +13,7 @@ public class SepiaEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { float weights[] = {805.0f / 2048.0f, 715.0f / 2048.0f, 557.0f / 2048.0f, 1575.0f / 2048.0f, 1405.0f / 2048.0f, 1097.0f / 2048.0f, 387.0f / 2048.0f, 344.0f / 2048.0f, diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java index 494a6136..80ef90eb 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java @@ -1,12 +1,12 @@ package com.otaliastudios.cameraview.shadereffects.effects; import android.opengl.GLSurfaceView; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Sharpens the preview. */ -public class SharpnessEffect implements ShaderInterface { +public class SharpnessEffect extends BaseShaderEffect { private int mWidth; private int mHeight; private float scale = 0f; @@ -36,7 +36,7 @@ public class SharpnessEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { initValues(mGlSurfaceView); String stepsizeXString = "stepsizeX = " + 1.0f / mWidth + ";\n"; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java index bf3e61b6..15621adc 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java @@ -1,13 +1,11 @@ package com.otaliastudios.cameraview.shadereffects.effects; -import android.opengl.GLSurfaceView; - -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Adjusts color temperature of the preview. */ -public class TemperatureEffect implements ShaderInterface { +public class TemperatureEffect extends BaseShaderEffect { private float scale = 0f; /** @@ -26,7 +24,7 @@ public class TemperatureEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { String scaleString = "scale = " + (2.0f * scale - 1.0f) + ";\n"; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java index abfd6a7b..7ad49570 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java @@ -1,15 +1,14 @@ package com.otaliastudios.cameraview.shadereffects.effects; import android.graphics.Color; -import android.opengl.GLSurfaceView; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Tints the preview with specified color.. */ -public class TintEffect implements ShaderInterface { +public class TintEffect extends BaseShaderEffect { private int mTint = 0xFF0000FF; /** @@ -24,7 +23,7 @@ public class TintEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { float color_ratio[] = {0.21f, 0.71f, 0.07f}; String color_ratioString[] = new String[3]; color_ratioString[0] = "color_ratio[0] = " + color_ratio[0] + ";\n"; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java index 01792e42..ff92582d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java @@ -2,13 +2,13 @@ package com.otaliastudios.cameraview.shadereffects.effects; import android.opengl.GLSurfaceView; -import com.otaliastudios.cameraview.shadereffects.ShaderInterface; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; /** * Applies lomo-camera style effect to your preview. */ -public class VignetteEffect implements ShaderInterface { +public class VignetteEffect extends BaseShaderEffect { private int mWidth = 0; private int mHeight = 0; private float mScale = 0f; @@ -39,7 +39,7 @@ public class VignetteEffect implements ShaderInterface { } @Override - public String getShader(GLSurfaceView mGlSurfaceView) { + public String getFragmentShader() { initValues(mGlSurfaceView); float scale[] = new float[2]; if (mWidth > mHeight) { From ffdd071b968c5159fcbb7fd43b361c0e02a6b48d Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Mon, 29 Jul 2019 15:09:22 +0530 Subject: [PATCH 06/12] implemented initial effects --- .../otaliastudios/cameraview/CameraView.java | 71 +++++++++++-------- .../cameraview/internal/egl/EglViewport.java | 41 ++++++++--- .../cameraview/preview/GlCameraPreview.java | 6 +- .../shadereffects/ShaderEffectFactory.java | 52 ++++++++++++++ .../shadereffects/effects/NoEffect.java | 13 ++++ .../effects/SharpnessEffect.java | 23 +++--- .../effects/TemperatureEffect.java | 11 +-- .../shadereffects/effects/TintEffect.java | 11 ++- .../shadereffects/effects/VignetteEffect.java | 20 ++++-- 9 files changed, 184 insertions(+), 64 deletions(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index c5f01edb..9089cbea 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -4,12 +4,6 @@ import android.Manifest; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; - -import androidx.annotation.VisibleForTesting; -import androidx.lifecycle.Lifecycle; -import androidx.lifecycle.LifecycleObserver; -import androidx.lifecycle.LifecycleOwner; -import androidx.lifecycle.OnLifecycleEvent; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.PackageInfo; @@ -23,9 +17,6 @@ import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Handler; import android.os.Looper; -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; @@ -33,27 +24,35 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.OnLifecycleEvent; + import com.otaliastudios.cameraview.controls.Audio; import com.otaliastudios.cameraview.controls.Control; import com.otaliastudios.cameraview.controls.ControlParser; import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; -import com.otaliastudios.cameraview.engine.Camera2Engine; -import com.otaliastudios.cameraview.engine.offset.Reference; -import com.otaliastudios.cameraview.markers.MarkerLayout; -import com.otaliastudios.cameraview.engine.Camera1Engine; -import com.otaliastudios.cameraview.engine.CameraEngine; -import com.otaliastudios.cameraview.frame.Frame; -import com.otaliastudios.cameraview.frame.FrameProcessor; -import com.otaliastudios.cameraview.gesture.Gesture; -import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.controls.Grid; import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.controls.Preview; import com.otaliastudios.cameraview.controls.VideoCodec; import com.otaliastudios.cameraview.controls.WhiteBalance; +import com.otaliastudios.cameraview.engine.Camera1Engine; +import com.otaliastudios.cameraview.engine.Camera2Engine; +import com.otaliastudios.cameraview.engine.CameraEngine; +import com.otaliastudios.cameraview.engine.offset.Reference; +import com.otaliastudios.cameraview.frame.Frame; +import com.otaliastudios.cameraview.frame.FrameProcessor; +import com.otaliastudios.cameraview.gesture.Gesture; +import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.gesture.GestureFinder; import com.otaliastudios.cameraview.gesture.GestureParser; import com.otaliastudios.cameraview.gesture.PinchGestureFinder; @@ -63,6 +62,9 @@ import com.otaliastudios.cameraview.internal.GridLinesLayout; import com.otaliastudios.cameraview.internal.utils.CropHelper; import com.otaliastudios.cameraview.internal.utils.OrientationHelper; import com.otaliastudios.cameraview.internal.utils.WorkerHandler; +import com.otaliastudios.cameraview.markers.AutoFocusMarker; +import com.otaliastudios.cameraview.markers.AutoFocusTrigger; +import com.otaliastudios.cameraview.markers.MarkerLayout; import com.otaliastudios.cameraview.markers.MarkerParser; import com.otaliastudios.cameraview.overlay.OverlayLayout; import com.otaliastudios.cameraview.preview.CameraPreview; @@ -70,14 +72,15 @@ import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; -import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; +import com.otaliastudios.cameraview.shadereffects.ShaderEffectFactory; +import com.otaliastudios.cameraview.shadereffects.effects.SharpnessEffect; +import com.otaliastudios.cameraview.shadereffects.effects.TemperatureEffect; +import com.otaliastudios.cameraview.shadereffects.effects.TintEffect; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.SizeSelector; import com.otaliastudios.cameraview.size.SizeSelectorParser; import com.otaliastudios.cameraview.size.SizeSelectors; -import com.otaliastudios.cameraview.markers.AutoFocusMarker; -import com.otaliastudios.cameraview.markers.AutoFocusTrigger; import java.io.File; import java.util.ArrayList; @@ -88,7 +91,6 @@ import java.util.concurrent.CopyOnWriteArrayList; import static android.view.View.MeasureSpec.AT_MOST; import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.UNSPECIFIED; - import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; /** @@ -580,8 +582,8 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if( MotionEvent.ACTION_UP == event.getAction()) { Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); - BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(effect); + //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); + changeEffect(ShaderEffectFactory.ShaderEffects.SHARPNESS_EFFECT); } return true; @@ -2144,7 +2146,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { //region Effects - public GLSurfaceView getCurrentPreviewingGlSurfaceView(){ + public GLSurfaceView getCurrentPreviewingGlSurfaceView() { if (mCameraPreview instanceof GlCameraPreview) { return ((GlCameraPreview) mCameraPreview).getView(); } @@ -2153,12 +2155,23 @@ public class CameraView extends FrameLayout implements LifecycleObserver { return null; } - public void changeEffect(BaseShaderEffect shader) { + public void changeEffect(ShaderEffectFactory.ShaderEffects effect) { if (mCameraPreview instanceof GlCameraPreview) { - String effect = shader.getFragmentShader(); - ((GlCameraPreview) mCameraPreview).setEffectFragmentShader(effect); + GLSurfaceView previewingSurfaceView = getCurrentPreviewingGlSurfaceView(); + if (previewingSurfaceView != null) { + BaseShaderEffect shaderEffect = ShaderEffectFactory.getShaderFromFactory(effect, previewingSurfaceView); + + ((SharpnessEffect)shaderEffect).setSharpnessValue(1.0f); + ((GlCameraPreview) mCameraPreview).setShaderEffect(shaderEffect); + } + } else { + LOG.w("changeEffect", "changeEffect is supported only for GLSurfaceView"); + } + } - //doInstantiatePreview(); + public void changeEffect(BaseShaderEffect shaderEffect) { + if (mCameraPreview instanceof GlCameraPreview) { + ((GlCameraPreview) mCameraPreview).setShaderEffect(shaderEffect); } else { LOG.w("changeEffect", "changeEffect is supported only for GLSurfaceView"); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 1859fb2e..3be83b2a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -5,6 +5,8 @@ import android.opengl.GLES11Ext; import android.opengl.GLES20; import com.otaliastudios.cameraview.CameraLogger; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; import java.nio.FloatBuffer; @@ -74,19 +76,38 @@ public class EglViewport extends EglElement { // private int muTexOffsetLoc; // Used for filtering // private int muColorAdjustLoc; // Used for filtering - private String vertexShader = SIMPLE_VERTEX_SHADER; - private String fragmentShader = SIMPLE_FRAGMENT_SHADER; + private String mVertexShader = SIMPLE_VERTEX_SHADER; + private String mFragmentShader = SIMPLE_FRAGMENT_SHADER; - private boolean isShaderChanged = false; + private BaseShaderEffect mShaderEffect; + + private boolean mIsShaderChanged = false; public EglViewport() { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; + mShaderEffect = new NoEffect(); initProgram(); } private void initProgram(){ - mProgramHandle = createProgram(vertexShader, fragmentShader); + release(); + + mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; + + mProgramHandle = createProgram(mShaderEffect.getVertextShader(), mShaderEffect.getFragmentShader()); + + maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getPositionVariableName()); + checkLocation(maPositionLocation, mShaderEffect.getPositionVariableName()); + maTextureCoordLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getTexttureCoordinateVariableName()); + checkLocation(maTextureCoordLocation, mShaderEffect.getTexttureCoordinateVariableName()); + muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getMVPMatrixVariableName()); + checkLocation(muMVPMatrixLocation, mShaderEffect.getMVPMatrixVariableName()); + muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getTextureMatrixVariableName()); + checkLocation(muTexMatrixLocation, mShaderEffect.getTextureMatrixVariableName()); + + + /*mProgramHandle = createProgram(mVertexShader, mFragmentShader); maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); checkLocation(maPositionLocation, "aPosition"); @@ -95,7 +116,7 @@ public class EglViewport extends EglElement { muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix"); checkLocation(muMVPMatrixLocation, "uMVPMatrix"); muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uTexMatrix"); - checkLocation(muTexMatrixLocation, "uTexMatrix"); + checkLocation(muTexMatrixLocation, "uTexMatrix");*/ // Stuff from Drawable2d.FULL_RECTANGLE } @@ -127,9 +148,9 @@ public class EglViewport extends EglElement { return texId; } - public void changeEffectFragmentShader(String fragmentShader){ - this.fragmentShader = fragmentShader; - isShaderChanged = true; + public void changeShaderEffect(BaseShaderEffect shaderEffect){ + this.mShaderEffect = shaderEffect; + mIsShaderChanged = true; } @@ -157,9 +178,9 @@ public class EglViewport extends EglElement { FloatBuffer vertexBuffer, FloatBuffer texBuffer) { - if (isShaderChanged){ + if (mIsShaderChanged){ initProgram(); - isShaderChanged = false; + mIsShaderChanged = false; } check("draw start"); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index b2ec5c5a..12ba0c79 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -7,7 +7,6 @@ import android.opengl.Matrix; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import android.util.Log; import android.view.LayoutInflater; import android.view.SurfaceHolder; import android.view.View; @@ -16,6 +15,7 @@ import android.view.ViewGroup; import com.otaliastudios.cameraview.R; import com.otaliastudios.cameraview.internal.egl.EglViewport; import com.otaliastudios.cameraview.internal.utils.Op; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.size.AspectRatio; import java.util.Collections; @@ -310,7 +310,7 @@ public class GlCameraPreview extends CameraPreview 1.0f) - scale = 1.0f; + public void setSharpnessValue(float value){ + if (value < 0.0f) + value = 0.0f; + if (value > 1.0f) + value = 1.0f; - this.scale = scale; + this.scale = value; } /** diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java index 15621adc..b6534270 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java @@ -10,17 +10,20 @@ public class TemperatureEffect extends BaseShaderEffect { /** * Initialize Effect - * + */ + public TemperatureEffect() { + } + + /** * @param scale Float, between 0 and 1, with 0 indicating cool, and 1 - * indicating warm. A value of of 0.5 indicates no change. + * indicating warm. A value of of 0.5 indicates no change. */ - public TemperatureEffect(float scale) { + public void setTemperatureScale(float scale){ if (scale < 0.0f) scale = 0.0f; if (scale > 1.0f) scale = 1.0f; this.scale = scale; - } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java index 7ad49570..900df065 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java @@ -9,17 +9,16 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Tints the preview with specified color.. */ public class TintEffect extends BaseShaderEffect { - private int mTint = 0xFF0000FF; + private int mTint = 0xFFFF0000; /** * Initialize Effect - * - * @param color Integer, representing an ARGB color with 8 bits per channel. - * May be created using Color class. */ - public TintEffect(int color) { - this.mTint = color; + public TintEffect() { + } + public void setTintColor(int color){ + this.mTint = color; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java index ff92582d..d7870108 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java @@ -11,21 +11,33 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; public class VignetteEffect extends BaseShaderEffect { private int mWidth = 0; private int mHeight = 0; - private float mScale = 0f; - private final float mShade = 0.85f; + private float mScale = 0.85f; + private float mShade = 0.5f; /** * Initialize Effect * - * @param scale Float, between 0 and 1. 0 means no change. + * @param glSurfaceView GLSurfaceView */ - public VignetteEffect(float scale) { + public VignetteEffect(GLSurfaceView glSurfaceView) { + this.mGlSurfaceView = glSurfaceView; + + } + + public void setVignetteEffectScale(float scale){ if (scale < 0.0f) scale = 0.0f; if (scale > 1.0f) scale = 1.0f; this.mScale = scale; + } + public void setVignetteEffectShade(float shade){ + if (shade < 0.0f) + shade = 0.0f; + if (shade > 1.0f) + shade = 1.0f; + this.mShade = shade; } /** From 2d5ad43e257fb01e6be3da645f85b5ac2c23eb13 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Mon, 29 Jul 2019 15:27:48 +0530 Subject: [PATCH 07/12] modified few filters --- .../otaliastudios/cameraview/CameraView.java | 5 +-- .../shadereffects/ShaderEffectFactory.java | 33 +++++++++++++++++++ .../shadereffects/effects/LamoishEffect.java | 6 ++-- .../effects/SaturationEffect.java | 17 +++++++--- .../effects/SharpnessEffect.java | 4 +-- .../effects/TemperatureEffect.java | 2 +- .../shadereffects/effects/VignetteEffect.java | 4 +-- 7 files changed, 56 insertions(+), 15 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 9089cbea..bd36ef32 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -73,6 +73,7 @@ import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.shadereffects.ShaderEffectFactory; +import com.otaliastudios.cameraview.shadereffects.effects.SaturationEffect; import com.otaliastudios.cameraview.shadereffects.effects.SharpnessEffect; import com.otaliastudios.cameraview.shadereffects.effects.TemperatureEffect; import com.otaliastudios.cameraview.shadereffects.effects.TintEffect; @@ -583,7 +584,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(ShaderEffectFactory.ShaderEffects.SHARPNESS_EFFECT); + changeEffect(ShaderEffectFactory.ShaderEffects.INVERT_COLOR_EFFECT); } return true; @@ -2161,7 +2162,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if (previewingSurfaceView != null) { BaseShaderEffect shaderEffect = ShaderEffectFactory.getShaderFromFactory(effect, previewingSurfaceView); - ((SharpnessEffect)shaderEffect).setSharpnessValue(1.0f); + //((SaturationEffect)shaderEffect).setSaturationValue(1f); ((GlCameraPreview) mCameraPreview).setShaderEffect(shaderEffect); } } else { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java index 32ce7d4e..73f7019c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java @@ -3,7 +3,12 @@ package com.otaliastudios.cameraview.shadereffects; import android.opengl.GLSurfaceView; import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; +import com.otaliastudios.cameraview.shadereffects.effects.InvertColorsEffect; +import com.otaliastudios.cameraview.shadereffects.effects.LamoishEffect; import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; +import com.otaliastudios.cameraview.shadereffects.effects.PosterizeEffect; +import com.otaliastudios.cameraview.shadereffects.effects.SaturationEffect; +import com.otaliastudios.cameraview.shadereffects.effects.SepiaEffect; import com.otaliastudios.cameraview.shadereffects.effects.SharpnessEffect; import com.otaliastudios.cameraview.shadereffects.effects.TemperatureEffect; import com.otaliastudios.cameraview.shadereffects.effects.TintEffect; @@ -12,7 +17,14 @@ import com.otaliastudios.cameraview.shadereffects.effects.VignetteEffect; public class ShaderEffectFactory { public enum ShaderEffects { + NO_EFFECT, + BLACK_AND_WHITE_EFFECT, + INVERT_COLOR_EFFECT, + LAMOISH_EFFECT, + POSTERIZE_EFFECT, + SATURATION_EFFECT, + SEPIA_EFFECT, SHARPNESS_EFFECT, TEMPERATURE_EFFECT, TINT_EFFECT, @@ -26,6 +38,26 @@ public class ShaderEffectFactory { shaderEffect = new BlackAndWhiteEffect(); break; + case INVERT_COLOR_EFFECT: + shaderEffect = new InvertColorsEffect(); + break; + + case LAMOISH_EFFECT: + shaderEffect = new LamoishEffect(glSurfaceView); + break; + + case POSTERIZE_EFFECT: + shaderEffect = new PosterizeEffect(); + break; + + case SATURATION_EFFECT: + shaderEffect = new SaturationEffect(); + break; + + case SEPIA_EFFECT: + shaderEffect = new SepiaEffect(); + break; + case SHARPNESS_EFFECT: shaderEffect = new SharpnessEffect(glSurfaceView); break; @@ -43,6 +75,7 @@ public class ShaderEffectFactory { break; + case NO_EFFECT: default: shaderEffect = new NoEffect(); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java index f3c9ce66..db1721da 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/LamoishEffect.java @@ -17,9 +17,11 @@ public class LamoishEffect extends BaseShaderEffect { /** * Initialize Effect + * + * @param glSurfaceView GLSurfaceView */ - public LamoishEffect() { - + public LamoishEffect(GLSurfaceView glSurfaceView) { + this.mGlSurfaceView = glSurfaceView; } /** diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java index a99174a8..d4c09d1f 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java @@ -10,13 +10,20 @@ public class SaturationEffect extends BaseShaderEffect { /** * Initialize Effect - * - * @param scale Float, between -1 and 1. 0 means no change, while -1 indicates - * full desaturation, i.e. grayscale. */ - public SaturationEffect(float scale) { + public SaturationEffect() { + } - this.scale = scale; + /** + * @param value Float, between -1 and 1. 0 means no change, while -1 indicates + * full desaturated, i.e. grayscale. + */ + public void setSaturationValue(float value){ + if (value < -1.0f) + value = -1.0f; + else if (value > 1.0f) + value = 1.0f; + this.scale = value; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java index 448d155b..c7c32d7e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java @@ -13,8 +13,6 @@ public class SharpnessEffect extends BaseShaderEffect { /** * Initialize Effect - * - * */ public SharpnessEffect(GLSurfaceView glSurfaceView) { this.mGlSurfaceView = glSurfaceView; @@ -26,7 +24,7 @@ public class SharpnessEffect extends BaseShaderEffect { public void setSharpnessValue(float value){ if (value < 0.0f) value = 0.0f; - if (value > 1.0f) + else if (value > 1.0f) value = 1.0f; this.scale = value; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java index b6534270..effd13c5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java @@ -21,7 +21,7 @@ public class TemperatureEffect extends BaseShaderEffect { public void setTemperatureScale(float scale){ if (scale < 0.0f) scale = 0.0f; - if (scale > 1.0f) + else if (scale > 1.0f) scale = 1.0f; this.scale = scale; } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java index d7870108..f3c1fe84 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java @@ -27,7 +27,7 @@ public class VignetteEffect extends BaseShaderEffect { public void setVignetteEffectScale(float scale){ if (scale < 0.0f) scale = 0.0f; - if (scale > 1.0f) + else if (scale > 1.0f) scale = 1.0f; this.mScale = scale; } @@ -35,7 +35,7 @@ public class VignetteEffect extends BaseShaderEffect { public void setVignetteEffectShade(float shade){ if (shade < 0.0f) shade = 0.0f; - if (shade > 1.0f) + else if (shade > 1.0f) shade = 1.0f; this.mShade = shade; } From 28d7c605ba4e2e71a4158ebc48a67acd3bbb5b97 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Mon, 29 Jul 2019 18:08:53 +0530 Subject: [PATCH 08/12] modified all effects --- .../otaliastudios/cameraview/CameraView.java | 9 ++- .../shadereffects/BaseShaderEffect.java | 14 ----- .../shadereffects/ShaderEffectFactory.java | 60 +++++++++++++++++++ .../effects/BrightnessEffect.java | 18 ++++-- .../shadereffects/effects/ContrastEffect.java | 17 ++++-- .../effects/DocumentaryEffect.java | 4 ++ .../shadereffects/effects/DuotoneEffect.java | 20 ++++--- .../effects/FillLightEffect.java | 10 +++- .../shadereffects/effects/GammaEffect.java | 13 ++-- .../shadereffects/effects/GrainEffect.java | 13 +++- .../shadereffects/effects/HueEffect.java | 16 ++--- 11 files changed, 143 insertions(+), 51 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index bd36ef32..bdbdf014 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -9,6 +9,7 @@ import android.content.ContextWrapper; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.TypedArray; +import android.graphics.Color; import android.graphics.PointF; import android.graphics.Rect; import android.location.Location; @@ -73,6 +74,11 @@ import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.shadereffects.ShaderEffectFactory; +import com.otaliastudios.cameraview.shadereffects.effects.BrightnessEffect; +import com.otaliastudios.cameraview.shadereffects.effects.ContrastEffect; +import com.otaliastudios.cameraview.shadereffects.effects.DuotoneEffect; +import com.otaliastudios.cameraview.shadereffects.effects.GrainEffect; +import com.otaliastudios.cameraview.shadereffects.effects.HueEffect; import com.otaliastudios.cameraview.shadereffects.effects.SaturationEffect; import com.otaliastudios.cameraview.shadereffects.effects.SharpnessEffect; import com.otaliastudios.cameraview.shadereffects.effects.TemperatureEffect; @@ -584,7 +590,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(ShaderEffectFactory.ShaderEffects.INVERT_COLOR_EFFECT); + changeEffect(ShaderEffectFactory.ShaderEffects.BRIGHTNESS_EFFECT); } return true; @@ -2162,7 +2168,6 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if (previewingSurfaceView != null) { BaseShaderEffect shaderEffect = ShaderEffectFactory.getShaderFromFactory(effect, previewingSurfaceView); - //((SaturationEffect)shaderEffect).setSaturationValue(1f); ((GlCameraPreview) mCameraPreview).setShaderEffect(shaderEffect); } } else { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java index 29270b9a..97f05454 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java @@ -8,20 +8,6 @@ import android.opengl.GLSurfaceView; */ public abstract class BaseShaderEffect { - /** - * Empty default constructor - */ - public BaseShaderEffect(){ - } - - /** - * parameterized constructor with previewing GLSurfaceView as parameter - * @param glSurfaceView - */ - public BaseShaderEffect(GLSurfaceView glSurfaceView) { - this.mGlSurfaceView = glSurfaceView; - } - /** * Previewing GlSurfaceview. * This will be used by a few effects. diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java index 73f7019c..c60b7a6c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java @@ -3,6 +3,16 @@ package com.otaliastudios.cameraview.shadereffects; import android.opengl.GLSurfaceView; import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; +import com.otaliastudios.cameraview.shadereffects.effects.BrightnessEffect; +import com.otaliastudios.cameraview.shadereffects.effects.ContrastEffect; +import com.otaliastudios.cameraview.shadereffects.effects.CrossProcessEffect; +import com.otaliastudios.cameraview.shadereffects.effects.DocumentaryEffect; +import com.otaliastudios.cameraview.shadereffects.effects.DuotoneEffect; +import com.otaliastudios.cameraview.shadereffects.effects.FillLightEffect; +import com.otaliastudios.cameraview.shadereffects.effects.GammaEffect; +import com.otaliastudios.cameraview.shadereffects.effects.GrainEffect; +import com.otaliastudios.cameraview.shadereffects.effects.GreyScaleEffect; +import com.otaliastudios.cameraview.shadereffects.effects.HueEffect; import com.otaliastudios.cameraview.shadereffects.effects.InvertColorsEffect; import com.otaliastudios.cameraview.shadereffects.effects.LamoishEffect; import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; @@ -20,6 +30,16 @@ public class ShaderEffectFactory { NO_EFFECT, BLACK_AND_WHITE_EFFECT, + BRIGHTNESS_EFFECT, + CONTRAST_EFFECT, + CROSS_PROCESS_EFFECT, + DOCUMENTARY_EFFECT, + DUO_TONE_COLOR_EFFECT, + FILL_LIGHT_EFFECT, + GAMMA_EFFECT, + GRAIN_EFFECT, + GREY_SCALE_EFFECT, + HUE_EFFECT, INVERT_COLOR_EFFECT, LAMOISH_EFFECT, POSTERIZE_EFFECT, @@ -38,6 +58,46 @@ public class ShaderEffectFactory { shaderEffect = new BlackAndWhiteEffect(); break; + case BRIGHTNESS_EFFECT: + shaderEffect = new BrightnessEffect(); + break; + + case CONTRAST_EFFECT: + shaderEffect = new ContrastEffect(); + break; + + case CROSS_PROCESS_EFFECT: + shaderEffect = new CrossProcessEffect(); + break; + + case DOCUMENTARY_EFFECT: + shaderEffect = new DocumentaryEffect(glSurfaceView); + break; + + case DUO_TONE_COLOR_EFFECT: + shaderEffect = new DuotoneEffect(); + break; + + case FILL_LIGHT_EFFECT: + shaderEffect = new FillLightEffect(); + break; + + case GAMMA_EFFECT: + shaderEffect = new GammaEffect(); + break; + + case GRAIN_EFFECT: + shaderEffect = new GrainEffect(glSurfaceView); + break; + + case GREY_SCALE_EFFECT: + shaderEffect = new GreyScaleEffect(); + break; + + case HUE_EFFECT: + shaderEffect = new HueEffect(); + break; + case INVERT_COLOR_EFFECT: shaderEffect = new InvertColorsEffect(); break; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java index d684428b..81af0618 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java @@ -6,17 +6,23 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Adjusts the brightness of the preview. */ public class BrightnessEffect extends BaseShaderEffect { - private float brightnessValue; + private float brightnessValue = 2.0f; /** * Initialize Effect + */ + public BrightnessEffect() { + } + + /** + * setBrightnessValue * - * @param brightnessvalue Range should be between 0.1- 2.0 with 1.0 being normal. + * @param brightnessvalue Range should be between 1.0- 2.0 with 1.0 being normal. */ - public BrightnessEffect(float brightnessvalue) { - if (brightnessvalue < 0.1f) - brightnessvalue = 0.1f; - if (brightnessvalue > 2.0f) + public void setBrightnessValue(float brightnessvalue) { + if (brightnessvalue < 1.0f) + brightnessvalue = 1.0f; + else if (brightnessvalue > 2.0f) brightnessvalue = 2.0f; this.brightnessValue = brightnessvalue; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java index 103a7955..d93222d5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java @@ -5,17 +5,22 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Adjusts the contrast of the preview. */ public class ContrastEffect extends BaseShaderEffect { - private float contrast; + private float contrast = 2.0f; /** * Initialize Effect + */ + public ContrastEffect() { + } + + /** * - * @param contrast Range should be between 0.1- 2.0 with 1.0 being normal. + * @param contrast Range should be between 1.0- 2.0 with 1.0 being normal. */ - public ContrastEffect(float contrast) { - if (contrast < 0.1f) - contrast = 0.1f; - if (contrast > 2.0f) + public void setContrast(float contrast){ + if (contrast < 1.0f) + contrast = 1.0f; + else if (contrast > 2.0f) contrast = 2.0f; this.contrast = contrast; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java index b03351e7..907a7139 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DocumentaryEffect.java @@ -15,6 +15,10 @@ public class DocumentaryEffect extends BaseShaderEffect { private int mHeight; private Random mRandom; + public DocumentaryEffect(GLSurfaceView glSurfaceView) { + this.mGlSurfaceView = glSurfaceView; + } + /** * Init all values that will be used by this shader. */ diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java index 1626121e..0350b7d8 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java @@ -14,15 +14,21 @@ public class DuotoneEffect extends BaseShaderEffect { /** * Initialize effect + */ + public DuotoneEffect() { + } + + /** + * setDuoToneColors * - * @param mFirstColor Integer, representing an ARGB color with 8 bits per channel. - * May be created using Color class. - * @param mSecondColor Integer, representing an ARGB color with 8 bits per channel. - * May be created using Color class. + * @param firstColor Integer, representing an ARGB color with 8 bits per channel. + * May be created using Color class. + * @param secondColor Integer, representing an ARGB color with 8 bits per channel. + * May be created using Color class. */ - public DuotoneEffect(int mFirstColor, int mSecondColor) { - this.mFirstColor = mFirstColor; - this.mSecondColor = mSecondColor; + public void setDuoToneColors(int firstColor, int secondColor) { + this.mFirstColor = firstColor; + this.mSecondColor = secondColor; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java index 850674ba..d9278e87 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java @@ -10,13 +10,19 @@ public class FillLightEffect extends BaseShaderEffect { /** * Initialize Effect + */ + public FillLightEffect() { + } + + /** + * setStrength * * @param strength Float, between 0 and 1. 0 means no change. */ - public FillLightEffect(float strength) { + public void setStrength(float strength){ if (strength < 0.0f) strength = 0f; - if (strength > 1.0f) + else if (strength > 1.0f) strength = 1f; this.strength = strength; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java index a60085e4..e62496b2 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java @@ -6,20 +6,25 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Apply Gamma Effect on preview being played */ public class GammaEffect extends BaseShaderEffect { - private float gammaValue; + private float gammaValue = 2.0f; /** * Initialize Effect + */ + public GammaEffect() { + } + + /** + * setGammaValue * * @param gammaValue Range should be between 0.0 - 2.0 with 1.0 being normal. */ - public GammaEffect(float gammaValue) { + public void setGammaValue(float gammaValue){ if (gammaValue < 0.0f) gammaValue = 0.0f; - if (gammaValue > 2.0f) + else if (gammaValue > 2.0f) gammaValue = 2.0f; this.gammaValue = gammaValue; - } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java index bb1efbe1..506649d7 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java @@ -13,19 +13,26 @@ import java.util.Random; public class GrainEffect extends BaseShaderEffect { private int mWidth; private int mHeight; - private float strength; + private float strength = 0.5f; private Random mRandom; /** * Initialize Effect + */ + public GrainEffect(GLSurfaceView glSurfaceView) { + this.mGlSurfaceView = glSurfaceView; + } + + /** + * setDistortionStrength * * @param strength Float, between 0 and 1. Zero means no distortion, while 1 * indicates the maximum amount of adjustment. */ - public GrainEffect(float strength) { + public void setDistortionStrength(float strength){ if (strength < 0.0f) strength = 0.0f; - if (strength > 1.0f) + else if (strength > 1.0f) strength = 1.0f; this.strength = strength; } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java index dbe1e669..824155c7 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/HueEffect.java @@ -6,19 +6,21 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Apply Hue effect on the preview */ public class HueEffect extends BaseShaderEffect { - float hueValue; + float hueValue = 0.0f; /** * Initialize Effect - *

- * Hue value chart - * + */ + public HueEffect() { + } + + /** + * Hue value chart - https://cloud.githubusercontent.com/assets/2201511/21810115/b99ac22a-d74a-11e6-9f6c-ef74d15c88c7.jpg" > * @param hueDegrees Range of value should be between 0 to 360 degrees as described in the image above */ - public HueEffect(float hueDegrees) { -// manipulating input value so that we can map it on 360 degree circle + public void setHueDegreeValue(float hueDegrees){ + // manipulating input value so that we can map it on 360 degree circle hueValue = ((hueDegrees - 45) / 45f + 0.5f) * -1; - } @Override From fc05682eeb0a7e4eb821e46aef2ca8c786a099e7 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Tue, 30 Jul 2019 15:43:32 +0530 Subject: [PATCH 09/12] implemented shader while taking picture and video --- .../otaliastudios/cameraview/CameraView.java | 2 +- .../cameraview/internal/egl/EglViewport.java | 41 +------------------ .../picture/SnapshotGlPictureRecorder.java | 7 +++- .../cameraview/preview/GlCameraPreview.java | 9 +++- .../preview/RendererFrameCallback.java | 4 +- .../shadereffects/effects/NoEffect.java | 8 ++-- .../video/SnapshotVideoRecorder.java | 12 ++++-- 7 files changed, 33 insertions(+), 50 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index bdbdf014..56605975 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -590,7 +590,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(ShaderEffectFactory.ShaderEffects.BRIGHTNESS_EFFECT); + changeEffect(ShaderEffectFactory.ShaderEffects.SEPIA_EFFECT); } return true; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 3be83b2a..8cd225a5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -17,28 +17,6 @@ public class EglViewport extends EglElement { private final static CameraLogger LOG = CameraLogger.create(EglViewport.class.getSimpleName()); - // Simple vertex shader. - private static final String SIMPLE_VERTEX_SHADER = - "uniform mat4 uMVPMatrix;\n" + - "uniform mat4 uTexMatrix;\n" + - "attribute vec4 aPosition;\n" + - "attribute vec4 aTextureCoord;\n" + - "varying vec2 vTextureCoord;\n" + - "void main() {\n" + - " gl_Position = uMVPMatrix * aPosition;\n" + - " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" + - "}\n"; - - // Simple fragment shader for use with external 2D textures - private static final String SIMPLE_FRAGMENT_SHADER = - "#extension GL_OES_EGL_image_external : require\n" + - "precision mediump float;\n" + - "varying vec2 vTextureCoord;\n" + - "uniform samplerExternalOES sTexture;\n" + - "void main() {\n" + - " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + - "}\n"; - // Stuff from Drawable2d.FULL_RECTANGLE // A full square, extending from -1 to +1 in both dimensions. // When the model/view/projection matrix is identity, this will exactly cover the viewport. @@ -76,15 +54,14 @@ public class EglViewport extends EglElement { // private int muTexOffsetLoc; // Used for filtering // private int muColorAdjustLoc; // Used for filtering - private String mVertexShader = SIMPLE_VERTEX_SHADER; - private String mFragmentShader = SIMPLE_FRAGMENT_SHADER; - private BaseShaderEffect mShaderEffect; private boolean mIsShaderChanged = false; public EglViewport() { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; + + //init the default shader effect mShaderEffect = new NoEffect(); initProgram(); } @@ -105,20 +82,6 @@ public class EglViewport extends EglElement { checkLocation(muMVPMatrixLocation, mShaderEffect.getMVPMatrixVariableName()); muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getTextureMatrixVariableName()); checkLocation(muTexMatrixLocation, mShaderEffect.getTextureMatrixVariableName()); - - - /*mProgramHandle = createProgram(mVertexShader, mFragmentShader); - - maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); - checkLocation(maPositionLocation, "aPosition"); - maTextureCoordLocation = GLES20.glGetAttribLocation(mProgramHandle, "aTextureCoord"); - checkLocation(maTextureCoordLocation, "aTextureCoord"); - muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix"); - checkLocation(muMVPMatrixLocation, "uMVPMatrix"); - muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uTexMatrix"); - checkLocation(muTexMatrixLocation, "uTexMatrix");*/ - - // Stuff from Drawable2d.FULL_RECTANGLE } public void release(boolean doEglCleanup) { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java index d13ef3a9..494e1f1a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java @@ -27,6 +27,7 @@ import com.otaliastudios.cameraview.internal.utils.WorkerHandler; import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.preview.RendererFrameCallback; import com.otaliastudios.cameraview.preview.RendererThread; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; @@ -99,7 +100,7 @@ public class SnapshotGlPictureRecorder extends PictureRecorder { @RendererThread @Override - public void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, final float scaleX, final float scaleY) { + public void onRendererFrame(@NonNull SurfaceTexture surfaceTexture, final float scaleX, final float scaleY, BaseShaderEffect shaderEffect) { mPreview.removeRendererFrameCallback(this); // This kinda work but has drawbacks: @@ -121,6 +122,10 @@ public class SnapshotGlPictureRecorder extends PictureRecorder { // and draw the last frame again there. final EGLContext eglContext = EGL14.eglGetCurrentContext(); final EglCore core = new EglCore(eglContext, EglCore.FLAG_RECORDABLE); + + //set the current shader before taking the snapshot + mViewport.changeShaderEffect(shaderEffect); + // final EGLSurface oldSurface = EGL14.eglGetCurrentSurface(EGL14.EGL_DRAW); // final EGLDisplay oldDisplay = EGL14.eglGetCurrentDisplay(); WorkerHandler.execute(new Runnable() { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index 12ba0c79..77f1f061 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -16,6 +16,7 @@ import com.otaliastudios.cameraview.R; import com.otaliastudios.cameraview.internal.egl.EglViewport; import com.otaliastudios.cameraview.internal.utils.Op; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; import com.otaliastudios.cameraview.size.AspectRatio; import java.util.Collections; @@ -69,6 +70,8 @@ public class GlCameraPreview extends CameraPreview Date: Wed, 31 Jul 2019 12:18:37 +0530 Subject: [PATCH 10/12] updated all effects --- .../otaliastudios/cameraview/CameraView.java | 17 ----- .../cameraview/internal/egl/EglViewport.java | 6 +- .../cameraview/preview/GlCameraPreview.java | 4 +- .../shadereffects/BaseShaderEffect.java | 70 ++++++++++++++----- .../shadereffects/ShaderEffectFactory.java | 4 +- .../shadereffects/effects/CustomEffect.java | 26 +++++++ .../shadereffects/effects/NoEffect.java | 42 ----------- .../shadereffects/effects/NoFilterEffect.java | 11 +++ 8 files changed, 96 insertions(+), 84 deletions(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java delete mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 56605975..45a382be 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -9,7 +9,6 @@ import android.content.ContextWrapper; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.TypedArray; -import android.graphics.Color; import android.graphics.PointF; import android.graphics.Rect; import android.location.Location; @@ -74,15 +73,6 @@ import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.shadereffects.ShaderEffectFactory; -import com.otaliastudios.cameraview.shadereffects.effects.BrightnessEffect; -import com.otaliastudios.cameraview.shadereffects.effects.ContrastEffect; -import com.otaliastudios.cameraview.shadereffects.effects.DuotoneEffect; -import com.otaliastudios.cameraview.shadereffects.effects.GrainEffect; -import com.otaliastudios.cameraview.shadereffects.effects.HueEffect; -import com.otaliastudios.cameraview.shadereffects.effects.SaturationEffect; -import com.otaliastudios.cameraview.shadereffects.effects.SharpnessEffect; -import com.otaliastudios.cameraview.shadereffects.effects.TemperatureEffect; -import com.otaliastudios.cameraview.shadereffects.effects.TintEffect; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.SizeSelector; @@ -586,13 +576,6 @@ public class CameraView extends FrameLayout implements LifecycleObserver { onGesture(mTapGestureFinder, options); } - if( MotionEvent.ACTION_UP == event.getAction()) { - Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); - - //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(ShaderEffectFactory.ShaderEffects.SEPIA_EFFECT); - } - return true; } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 8cd225a5..e0bee9d2 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -6,7 +6,7 @@ import android.opengl.GLES20; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; -import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoFilterEffect; import java.nio.FloatBuffer; @@ -62,7 +62,7 @@ public class EglViewport extends EglElement { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; //init the default shader effect - mShaderEffect = new NoEffect(); + mShaderEffect = new NoFilterEffect(); initProgram(); } @@ -72,7 +72,7 @@ public class EglViewport extends EglElement { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; - mProgramHandle = createProgram(mShaderEffect.getVertextShader(), mShaderEffect.getFragmentShader()); + mProgramHandle = createProgram(mShaderEffect.getVertexShader(), mShaderEffect.getFragmentShader()); maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getPositionVariableName()); checkLocation(maPositionLocation, mShaderEffect.getPositionVariableName()); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index 77f1f061..35d36186 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -16,7 +16,7 @@ import com.otaliastudios.cameraview.R; import com.otaliastudios.cameraview.internal.egl.EglViewport; import com.otaliastudios.cameraview.internal.utils.Op; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; -import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoFilterEffect; import com.otaliastudios.cameraview.size.AspectRatio; import java.util.Collections; @@ -167,7 +167,7 @@ public class GlCameraPreview extends CameraPreview + * This class has a default Vertex Shader implementation which in most cases not required to touch. + * In Effects like sepia, B/W any many, only pixel color changes which can be managed by only fragment shader. + * If there is some other effect which requires vertex shader also change, you can override it. + *

+ * If your provide your own vertex and fragment shader, + * please set the {@link #mPositionVariableName}, {@link #mTextureCoordinateVariableName}, + * {@link #mMVPMatrixVariableName}, {@link #mTextureMatrixVariableName} + * according to your shader code. + *

+ * Please note that these shader applies on live preview as well as pictureSnapshot and videoSnapshot, + * we only support GLES11Ext.GL_TEXTURE_EXTERNAL_OES + * check EglViewport() + *

+ * The default implementation of this class is NoEffect. */ public abstract class BaseShaderEffect { + /** + * Vertex shader code written in Shader Language (C) and stored as String. + * This wil be used by GL to apply any effect. + */ + + protected String mVertexShader = + "uniform mat4 uMVPMatrix;\n" + + "uniform mat4 uTexMatrix;\n" + + "attribute vec4 aPosition;\n" + + "attribute vec4 aTextureCoord;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + + " gl_Position = uMVPMatrix * aPosition;\n" + + " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" + + "}\n"; + + + /** + * Fragment shader code written in Shader Language (C) and stored as String. + * This wil be used by GL to apply any effect. + */ + protected String mFragmentShader = + "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + + "void main() {\n" + + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + + "}\n"; + + /** * Previewing GlSurfaceview. * This will be used by a few effects. @@ -18,10 +63,6 @@ public abstract class BaseShaderEffect { this.mGlSurfaceView = glSurfaceView; } - public String getPositionVariableName() { - return mPositionVariableName; - } - /** * Local variable name which were used in the shader code. * These will be used by openGL program to render these vertex and fragment shader @@ -31,6 +72,9 @@ public abstract class BaseShaderEffect { private String mMVPMatrixVariableName = "uMVPMatrix"; private String mTextureMatrixVariableName = "uTexMatrix"; + public String getPositionVariableName() { + return mPositionVariableName; + } public void setPositionVariableName(String positionVariableName) { this.mPositionVariableName = positionVariableName; @@ -64,19 +108,9 @@ public abstract class BaseShaderEffect { * Get vertex Shader code * * @return complete shader code in C - *

- * This is the default implementation, each effect can implement its own. */ - public String getVertextShader() { - return "uniform mat4 uMVPMatrix;\n" + - "uniform mat4 uTexMatrix;\n" + - "attribute vec4 aPosition;\n" + - "attribute vec4 aTextureCoord;\n" + - "varying vec2 vTextureCoord;\n" + - "void main() {\n" + - " gl_Position = uMVPMatrix * aPosition;\n" + - " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" + - "}\n"; + public String getVertexShader() { + return mVertexShader; } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java index c60b7a6c..da0ab453 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java @@ -15,7 +15,7 @@ import com.otaliastudios.cameraview.shadereffects.effects.GreyScaleEffect; import com.otaliastudios.cameraview.shadereffects.effects.HueEffect; import com.otaliastudios.cameraview.shadereffects.effects.InvertColorsEffect; import com.otaliastudios.cameraview.shadereffects.effects.LamoishEffect; -import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoFilterEffect; import com.otaliastudios.cameraview.shadereffects.effects.PosterizeEffect; import com.otaliastudios.cameraview.shadereffects.effects.SaturationEffect; import com.otaliastudios.cameraview.shadereffects.effects.SepiaEffect; @@ -137,7 +137,7 @@ public class ShaderEffectFactory { case NO_EFFECT: default: - shaderEffect = new NoEffect(); + shaderEffect = new NoFilterEffect(); } return shaderEffect; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java new file mode 100644 index 00000000..3bdb7139 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java @@ -0,0 +1,26 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; + + +/** + * This class is to implement any custom effect. + */ +public class CustomEffect extends BaseShaderEffect { + + /** + * Parameterized constructor with vertex and fragment shader as parameter + * + * @param vertexShader + * @param fragmentShader + */ + public CustomEffect(String vertexShader, String fragmentShader) { + this.mVertexShader = vertexShader; + this.mFragmentShader = fragmentShader; + } + + @Override + public String getFragmentShader() { + return mFragmentShader; + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java deleted file mode 100644 index 3a260a27..00000000 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.otaliastudios.cameraview.shadereffects.effects; - -import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; - -/** - * Displays the normal preview without any effect. - */ -public class NoEffect extends BaseShaderEffect { - /** - * Initialize - */ - public NoEffect() { - } - - @Override - public String getFragmentShader() { - - /*String shader = "#extension GL_OES_EGL_image_external : require\n" - + "precision mediump float;\n" - + "varying vec2 vTextureCoord;\n" - + "uniform samplerExternalOES sTexture;\n" - + "void main() {\n" - + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" - + "}\n";*/ - - //This fragment shader is copied from black and white, - //this is for testing purpose and need to be removed once testing is done. - String shader = "#extension GL_OES_EGL_image_external : require\n" - + "precision mediump float;\n" - + "varying vec2 vTextureCoord;\n" - + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" - + " vec4 color = texture2D(sTexture, vTextureCoord);\n" - + " float colorR = (color.r + color.g + color.b) / 3.0;\n" - + " float colorG = (color.r + color.g + color.b) / 3.0;\n" - + " float colorB = (color.r + color.g + color.b) / 3.0;\n" - + " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n" - + "}\n"; - - return shader; - - } -} \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java new file mode 100644 index 00000000..6474dd39 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java @@ -0,0 +1,11 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; + +public class NoFilterEffect extends BaseShaderEffect { + + @Override + public String getFragmentShader() { + return mFragmentShader; + } +} From 230ba97702b708b99d30cd1d34926f5b0f8004b4 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 2 Aug 2019 16:18:18 +0530 Subject: [PATCH 11/12] modified all filters range to 0.0f-1.0f --- .../shadereffects/ShaderEffectFactory.java | 7 ++++++ .../shadereffects/effects/AutoFixEffect.java | 16 +++++++++---- .../effects/BrightnessEffect.java | 18 ++++++++++---- .../shadereffects/effects/ContrastEffect.java | 20 +++++++++++----- .../shadereffects/effects/DuotoneEffect.java | 8 +++++++ .../effects/FillLightEffect.java | 8 +++++-- .../shadereffects/effects/GammaEffect.java | 17 +++++++++---- .../shadereffects/effects/GrainEffect.java | 6 ++++- .../effects/SaturationEffect.java | 24 +++++++++++++------ .../effects/SharpnessEffect.java | 4 ++++ .../effects/TemperatureEffect.java | 4 ++++ .../shadereffects/effects/TintEffect.java | 4 ++++ .../shadereffects/effects/VignetteEffect.java | 8 +++++++ 13 files changed, 114 insertions(+), 30 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java index da0ab453..d8835c87 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java @@ -2,6 +2,7 @@ package com.otaliastudios.cameraview.shadereffects; import android.opengl.GLSurfaceView; +import com.otaliastudios.cameraview.shadereffects.effects.AutoFixEffect; import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; import com.otaliastudios.cameraview.shadereffects.effects.BrightnessEffect; import com.otaliastudios.cameraview.shadereffects.effects.ContrastEffect; @@ -29,6 +30,7 @@ public class ShaderEffectFactory { public enum ShaderEffects { NO_EFFECT, + AUTO_FIX_EFFECT, BLACK_AND_WHITE_EFFECT, BRIGHTNESS_EFFECT, CONTRAST_EFFECT, @@ -54,6 +56,11 @@ public class ShaderEffectFactory { public static BaseShaderEffect getShaderFromFactory(ShaderEffects effect, GLSurfaceView glSurfaceView) { BaseShaderEffect shaderEffect; switch (effect) { + + case AUTO_FIX_EFFECT: + shaderEffect = new AutoFixEffect(); + break; + case BLACK_AND_WHITE_EFFECT: shaderEffect = new BlackAndWhiteEffect(); break; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java index 42afb1e9..1cde31ad 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/AutoFixEffect.java @@ -7,20 +7,26 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; */ public class AutoFixEffect extends BaseShaderEffect { + private float scale = 1.0f; + /** + * Initialize Effect + */ + public AutoFixEffect() { + } - private float scale; + public float getScale() { + return scale; + } /** - * Initialize Effect - * * @param scale Float, between 0 and 1. Zero means no adjustment, while 1 * indicates the maximum amount of adjustment. */ - public AutoFixEffect(float scale) { + public void setScale(float scale) { if (scale < 0.0f) scale = 0.0f; - if (scale > 1.0f) + else if (scale > 1.0f) scale = 1.0f; this.scale = scale; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java index 81af0618..0f9476c6 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/BrightnessEffect.java @@ -17,15 +17,23 @@ public class BrightnessEffect extends BaseShaderEffect { /** * setBrightnessValue * - * @param brightnessvalue Range should be between 1.0- 2.0 with 1.0 being normal. + * @param brightnessvalue Range should be between 0.0- 1.0 with 0.0 being normal. */ public void setBrightnessValue(float brightnessvalue) { - if (brightnessvalue < 1.0f) + if (brightnessvalue < 0.0f) + brightnessvalue = 0.0f; + else if (brightnessvalue > 1.0f) brightnessvalue = 1.0f; - else if (brightnessvalue > 2.0f) - brightnessvalue = 2.0f; - this.brightnessValue = brightnessvalue; + //since the shader excepts a range of 1.0 - 2.0 + // will add the 1.0 to every value + this.brightnessValue = 1.0f + brightnessvalue; + } + + public float getBrightnessValue() { + //since the shader excepts a range of 1.0 - 2.0 + //to keep it between 0.0f - 1.0f range, will subtract the 1.0 to every value + return brightnessValue - 1.0f; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java index d93222d5..98752936 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/ContrastEffect.java @@ -14,16 +14,24 @@ public class ContrastEffect extends BaseShaderEffect { } /** - * - * @param contrast Range should be between 1.0- 2.0 with 1.0 being normal. + *setContrast + * @param contrast Range should be between 0.0- 1.0 with 0.0 being normal. */ public void setContrast(float contrast){ - if (contrast < 1.0f) + if (contrast < 0.0f) + contrast = 0.0f; + else if (contrast > 1.0f) contrast = 1.0f; - else if (contrast > 2.0f) - contrast = 2.0f; - this.contrast = contrast; + //since the shader excepts a range of 1.0 - 2.0 + //will add the 1.0 to every value + this.contrast = contrast + 1.0f; + } + + public float getContrast() { + //since the shader excepts a range of 1.0 - 2.0 + //to keep it between 0.0f - 1.0f range, will subtract the 1.0 to every value + return contrast - 1.0f; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java index 0350b7d8..3fbc9bbc 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/DuotoneEffect.java @@ -31,6 +31,14 @@ public class DuotoneEffect extends BaseShaderEffect { this.mSecondColor = secondColor; } + public int getFirstColor() { + return mFirstColor; + } + + public int getSecondColor() { + return mSecondColor; + } + @Override public String getFragmentShader() { float first[] = {Color.red(mFirstColor) / 255f, diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java index d9278e87..30448d8f 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/FillLightEffect.java @@ -6,7 +6,7 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Applies back-light filling to the preview. */ public class FillLightEffect extends BaseShaderEffect { - private float strength = 0f; + private float strength = 0.5f; /** * Initialize Effect @@ -17,7 +17,7 @@ public class FillLightEffect extends BaseShaderEffect { /** * setStrength * - * @param strength Float, between 0 and 1. 0 means no change. + * @param strength Float, between 0.0 and 1.0 where 0.0 means no change. */ public void setStrength(float strength){ if (strength < 0.0f) @@ -28,6 +28,10 @@ public class FillLightEffect extends BaseShaderEffect { this.strength = strength; } + public float getStrength() { + return strength; + } + @Override public String getFragmentShader() { float fade_gamma = 0.3f; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java index e62496b2..1a65bd31 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GammaEffect.java @@ -17,14 +17,23 @@ public class GammaEffect extends BaseShaderEffect { /** * setGammaValue * - * @param gammaValue Range should be between 0.0 - 2.0 with 1.0 being normal. + * @param gammaValue Range should be between 0.0 - 1.0 with 0.5 being normal. */ public void setGammaValue(float gammaValue){ if (gammaValue < 0.0f) gammaValue = 0.0f; - else if (gammaValue > 2.0f) - gammaValue = 2.0f; - this.gammaValue = gammaValue; + else if (gammaValue > 1.0f) + gammaValue = 1.0f; + + //since the shader excepts a range of 0.0 - 2.0 + //will multiply the 2.0 to every value + this.gammaValue = gammaValue * 2.0f; + } + + public float getGammaValue() { + //since the shader excepts a range of 0.0 - 2.0 + //to keep it between 0.0f - 1.0f range, will divide it with 2.0 + return gammaValue / 2.0f; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java index 506649d7..decb8f19 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/GrainEffect.java @@ -26,7 +26,7 @@ public class GrainEffect extends BaseShaderEffect { /** * setDistortionStrength * - * @param strength Float, between 0 and 1. Zero means no distortion, while 1 + * @param strength Float, between 0.0f and 1.0. Zero means no distortion, while 1 * indicates the maximum amount of adjustment. */ public void setDistortionStrength(float strength){ @@ -37,6 +37,10 @@ public class GrainEffect extends BaseShaderEffect { this.strength = strength; } + public float getStrength() { + return strength; + } + /** * Init all values that will be used by this shader. * diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java index d4c09d1f..bbb14f0d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SaturationEffect.java @@ -6,7 +6,7 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Adjusts color saturation of preview. */ public class SaturationEffect extends BaseShaderEffect { - private float scale = 0f; + private float scale = 1.0f; /** * Initialize Effect @@ -15,15 +15,25 @@ public class SaturationEffect extends BaseShaderEffect { } /** - * @param value Float, between -1 and 1. 0 means no change, while -1 indicates - * full desaturated, i.e. grayscale. + * @param value Float, between 0.0 and 1. 0 means no change, while 0.0 indicates + * full desaturated, i.e. grayscale. + * and 1.0 indicates full saturation */ - public void setSaturationValue(float value){ - if (value < -1.0f) - value = -1.0f; + public void setSaturationValue(float value) { + if (value < 0.0f) + value = 0.0f; else if (value > 1.0f) value = 1.0f; - this.scale = value; + + //since the shader excepts a range of -1.0 to 1.0 + //will multiply it by 2.0f and subtract 1.0 to every value + this.scale = (2.0f * value) - 1.0f; + } + + public float getSaturationValue() { + //since the shader excepts a range of -1.0 to 1.0 + //will add 1.0 to every value and divide it by 2.0f + return (scale + 1.0f) / 2.0f; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java index c7c32d7e..103fcd3e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/SharpnessEffect.java @@ -30,6 +30,10 @@ public class SharpnessEffect extends BaseShaderEffect { this.scale = value; } + public float getSharpnessValue() { + return scale; + } + /** * Init all values that will be used by this shader. * diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java index effd13c5..fc399767 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java @@ -26,6 +26,10 @@ public class TemperatureEffect extends BaseShaderEffect { this.scale = scale; } + public float getTemperatureScale() { + return scale; + } + @Override public String getFragmentShader() { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java index 900df065..166cd57c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java @@ -21,6 +21,10 @@ public class TintEffect extends BaseShaderEffect { this.mTint = color; } + public int getTintColor() { + return mTint; + } + @Override public String getFragmentShader() { float color_ratio[] = {0.21f, 0.71f, 0.07f}; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java index f3c1fe84..9b89b19f 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java @@ -24,6 +24,10 @@ public class VignetteEffect extends BaseShaderEffect { } + /** + * setVignetteEffectScale + * @param scale Float, between 0.0 and 1. 0 + */ public void setVignetteEffectScale(float scale){ if (scale < 0.0f) scale = 0.0f; @@ -32,6 +36,10 @@ public class VignetteEffect extends BaseShaderEffect { this.mScale = scale; } + /** + * setVignetteEffectShade + * @param shade Float, between 0.0 and 1. 0 + */ public void setVignetteEffectShade(float shade){ if (shade < 0.0f) shade = 0.0f; From 935a5e1461fda179cab415a38a699e79cfa41b36 Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Fri, 2 Aug 2019 16:53:37 +0530 Subject: [PATCH 12/12] added control to filter --- .../cameraview/demo/CameraActivity.java | 81 +++++++++++++++++++ demo/src/main/res/drawable/ic_filters.xml | 6 ++ demo/src/main/res/layout/activity_camera.xml | 36 +++++++-- 3 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 demo/src/main/res/drawable/ic_filters.xml diff --git a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java index 6af85d2f..d72171f4 100644 --- a/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java +++ b/demo/src/main/java/com/otaliastudios/cameraview/demo/CameraActivity.java @@ -34,6 +34,8 @@ import com.otaliastudios.cameraview.VideoResult; import com.otaliastudios.cameraview.controls.Preview; import com.otaliastudios.cameraview.frame.Frame; import com.otaliastudios.cameraview.frame.FrameProcessor; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; +import com.otaliastudios.cameraview.shadereffects.ShaderEffectFactory; import java.io.ByteArrayOutputStream; import java.io.File; @@ -51,6 +53,8 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis private ViewGroup controlPanel; private long mCaptureTime; + private ShaderEffectFactory.ShaderEffects mCurrentEffect = ShaderEffectFactory.ShaderEffects.NO_EFFECT; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -95,6 +99,7 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis findViewById(R.id.captureVideo).setOnClickListener(this); findViewById(R.id.captureVideoSnapshot).setOnClickListener(this); findViewById(R.id.toggleCamera).setOnClickListener(this); + findViewById(R.id.changeFilter).setOnClickListener(this); controlPanel = findViewById(R.id.controls); ViewGroup group = (ViewGroup) controlPanel.getChildAt(0); @@ -236,6 +241,7 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis case R.id.captureVideo: captureVideo(); break; case R.id.captureVideoSnapshot: captureVideoSnapshot(); break; case R.id.toggleCamera: toggleCamera(); break; + case R.id.changeFilter: changeCurrentFilter(); break; } } @@ -312,6 +318,81 @@ public class CameraActivity extends AppCompatActivity implements View.OnClickLis } } + private void changeCurrentFilter(){ + switch (mCurrentEffect){ + case NO_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.AUTO_FIX_EFFECT; + break; + case AUTO_FIX_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.BLACK_AND_WHITE_EFFECT; + break; + case BLACK_AND_WHITE_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.BRIGHTNESS_EFFECT; + break; + case BRIGHTNESS_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.CONTRAST_EFFECT; + break; + case CONTRAST_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.CROSS_PROCESS_EFFECT; + break; + case CROSS_PROCESS_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.DOCUMENTARY_EFFECT; + break; + case DOCUMENTARY_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.DUO_TONE_COLOR_EFFECT; + break; + case DUO_TONE_COLOR_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.FILL_LIGHT_EFFECT; + break; + case FILL_LIGHT_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.GAMMA_EFFECT; + break; + case GAMMA_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.GRAIN_EFFECT; + break; + case GRAIN_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.GREY_SCALE_EFFECT; + break; + case GREY_SCALE_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.HUE_EFFECT; + break; + case HUE_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.INVERT_COLOR_EFFECT; + break; + case INVERT_COLOR_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.LAMOISH_EFFECT; + break; + case LAMOISH_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.POSTERIZE_EFFECT; + break; + case POSTERIZE_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.SATURATION_EFFECT; + break; + case SATURATION_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.SEPIA_EFFECT; + break; + case SEPIA_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.SHARPNESS_EFFECT; + break; + case SHARPNESS_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.TEMPERATURE_EFFECT; + break; + case TEMPERATURE_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.TINT_EFFECT; + break; + case TINT_EFFECT: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.VIGNETTE_EFFECT; + break; + + case VIGNETTE_EFFECT: + default: + mCurrentEffect = ShaderEffectFactory.ShaderEffects.NO_EFFECT; + break; + } + + camera.changeEffect(mCurrentEffect); + } + @Override public boolean onValueChanged(@NonNull Option option, @NonNull T value, @NonNull String name) { if ((option instanceof Option.Width || option instanceof Option.Height)) { diff --git a/demo/src/main/res/drawable/ic_filters.xml b/demo/src/main/res/drawable/ic_filters.xml new file mode 100644 index 00000000..c807bb6d --- /dev/null +++ b/demo/src/main/res/drawable/ic_filters.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/demo/src/main/res/layout/activity_camera.xml b/demo/src/main/res/layout/activity_camera.xml index 1f94941c..ca9c6879 100644 --- a/demo/src/main/res/layout/activity_camera.xml +++ b/demo/src/main/res/layout/activity_camera.xml @@ -46,14 +46,34 @@ - + + + + + + + + + + +