diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filter/BaseFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filter/BaseFilter.java index 89682b80..e6ec3d60 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filter/BaseFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filter/BaseFilter.java @@ -210,6 +210,7 @@ public abstract class BaseFilter implements Filter { return copy; } + @SuppressWarnings("WeakerAccess") protected BaseFilter onCopy() { try { return getClass().newInstance(); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/BrightnessFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/BrightnessFilter.java index b3a04bc3..5aa8e416 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/BrightnessFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/BrightnessFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Adjusts the brightness of the frames. */ -public class BrightnessFilter extends BaseFilter { +public class BrightnessFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -22,28 +23,24 @@ public class BrightnessFilter extends BaseFilter { + " gl_FragColor = brightness * color;\n" + "}\n"; - private float brightness = 2.0f; + private float brightness = 2.0f; // 1.0F...2.0F private int brightnessLocation = -1; - @SuppressWarnings("WeakerAccess") public BrightnessFilter() { } /** * Sets the brightness adjustment. - * 0.0: normal brightness. - * 1.0: high brightness. + * 1.0: normal brightness. + * 2.0: high brightness. * * @param brightness brightness. */ - @SuppressWarnings("WeakerAccess") + @SuppressWarnings({"WeakerAccess", "unused"}) public void setBrightness(float brightness) { - if (brightness < 0.0f) brightness = 0.0f; - if (brightness > 1.0f) brightness = 1.0f; - - //since the shader excepts a range of 1.0 - 2.0 - // will add the 1.0 to every value - this.brightness = 1.0f + brightness; + if (brightness < 1.0f) brightness = 1.0f; + if (brightness > 2.0f) brightness = 2.0f; + this.brightness = brightness; } /** @@ -54,9 +51,19 @@ public class BrightnessFilter extends BaseFilter { */ @SuppressWarnings({"unused", "WeakerAccess"}) public float getBrightness() { - //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 brightness - 1.0f; + return brightness; + } + + @Override + public void setParameter1(float value) { + // parameter is 0...1, brightness is 1...2. + setBrightness(value + 1); + } + + @Override + public float getParameter1() { + // parameter is 0...1, brightness is 1...2. + return getBrightness() - 1F; } @NonNull @@ -84,12 +91,4 @@ public class BrightnessFilter extends BaseFilter { GLES20.glUniform1f(brightnessLocation, brightness); GlUtils.checkError("glUniform1f"); } - - - @Override - protected BaseFilter onCopy() { - BrightnessFilter filter = new BrightnessFilter(); - filter.setBrightness(getBrightness()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/ContrastFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/ContrastFilter.java index 801e6733..cc2e601c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/ContrastFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/ContrastFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Adjusts the contrast. */ -public class ContrastFilter extends BaseFilter { +public class ContrastFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -25,26 +26,23 @@ public class ContrastFilter extends BaseFilter { + " gl_FragColor = color;\n" + "}\n"; - private float contrast = 2.0f; + private float contrast = 2F; private int contrastLocation = -1; - @SuppressWarnings("WeakerAccess") public ContrastFilter() { } /** * Sets the current contrast adjustment. - * 0.0: no adjustment - * 1.0: maximum adjustment + * 1.0: no adjustment + * 2.0: increased contrast * * @param contrast contrast */ @SuppressWarnings("WeakerAccess") public void setContrast(float contrast) { - if (contrast < 0.0f) contrast = 0.0f; - if (contrast > 1.0f) contrast = 1.0f; - //since the shader excepts a range of 1.0 - 2.0 - //will add the 1.0 to every value - this.contrast = contrast + 1.0f; + if (contrast < 1.0f) contrast = 1.0f; + if (contrast > 2.0f) contrast = 2.0f; + this.contrast = contrast; } /** @@ -55,9 +53,19 @@ public class ContrastFilter extends BaseFilter { */ @SuppressWarnings({"unused", "WeakerAccess"}) 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; + return contrast; + } + + @Override + public void setParameter1(float value) { + // parameter is 0...1, contrast is 1...2. + setContrast(value + 1); + } + + @Override + public float getParameter1() { + // parameter is 0...1, contrast is 1...2. + return getContrast() - 1F; } @NonNull @@ -85,11 +93,4 @@ public class ContrastFilter extends BaseFilter { GLES20.glUniform1f(contrastLocation, contrast); GlUtils.checkError("glUniform1f"); } - - @Override - protected BaseFilter onCopy() { - ContrastFilter filter = new ContrastFilter(); - filter.setContrast(getContrast()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/DuotoneFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/DuotoneFilter.java index a508c9d7..5700c542 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/DuotoneFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/DuotoneFilter.java @@ -7,12 +7,13 @@ import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.TwoParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Representation of input frames using only two color tones. */ -public class DuotoneFilter extends BaseFilter { +public class DuotoneFilter extends BaseFilter implements TwoParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -33,7 +34,6 @@ public class DuotoneFilter extends BaseFilter { private int mFirstColorLocation = -1; private int mSecondColorLocation = -1; - @SuppressWarnings("WeakerAccess") public DuotoneFilter() { } /** @@ -41,7 +41,7 @@ public class DuotoneFilter extends BaseFilter { * @param firstColor first * @param secondColor second */ - @SuppressWarnings({"unused", "WeakerAccess"}) + @SuppressWarnings({"unused"}) public void setColors(@ColorInt int firstColor, @ColorInt int secondColor) { setFirstColor(firstColor); setSecondColor(secondColor); @@ -93,6 +93,27 @@ public class DuotoneFilter extends BaseFilter { return mSecondColor; } + @Override + public void setParameter1(float value) { + // no easy way to transform 0...1 into a color. + setFirstColor((int) (value * Integer.MAX_VALUE)); + } + + @Override + public float getParameter1() { + return (float) getFirstColor() / Integer.MAX_VALUE; + } + + @Override + public void setParameter2(float value) { + // no easy way to transform 0...1 into a color. + setSecondColor((int) (value * Integer.MAX_VALUE)); + } + + @Override + public float getParameter2() { + return (float) getSecondColor() / Integer.MAX_VALUE; + } @NonNull @Override @@ -134,11 +155,4 @@ public class DuotoneFilter extends BaseFilter { mFirstColorLocation = -1; mSecondColorLocation = -1; } - - @Override - protected BaseFilter onCopy() { - DuotoneFilter filter = new DuotoneFilter(); - filter.setColors(getFirstColor(), getSecondColor()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/FillLightFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/FillLightFilter.java index 346435d9..8ba50692 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/FillLightFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/FillLightFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Applies back-light filling to the frames. */ -public class FillLightFilter extends BaseFilter { +public class FillLightFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -34,7 +35,6 @@ public class FillLightFilter extends BaseFilter { private int multiplierLocation = -1; private int gammaLocation = -1; - @SuppressWarnings("WeakerAccess") public FillLightFilter() { } /** @@ -62,6 +62,15 @@ public class FillLightFilter extends BaseFilter { return strength; } + @Override + public void setParameter1(float value) { + setStrength(value); + } + + @Override + public float getParameter1() { + return getStrength(); + } @NonNull @Override @@ -99,12 +108,4 @@ public class FillLightFilter extends BaseFilter { GLES20.glUniform1f(gammaLocation, gamma); GlUtils.checkError("glUniform1f"); } - - - @Override - protected BaseFilter onCopy() { - FillLightFilter filter = new FillLightFilter(); - filter.setStrength(getStrength()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GammaFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GammaFilter.java index 0d3ec794..55cc2e86 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GammaFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GammaFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Applies gamma correction to the frames. */ -public class GammaFilter extends BaseFilter { +public class GammaFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -25,22 +26,19 @@ public class GammaFilter extends BaseFilter { private float gamma = 2.0f; private int gammaLocation = -1; - @SuppressWarnings("WeakerAccess") public GammaFilter() { } /** - * Sets the new gamma value in the 0.0 - 1.0 range. - * The 0.5 value means no correction will be applied. + * Sets the new gamma value in the 0.0 - 2.0 range. + * The 1.0 value means no correction will be applied. * * @param gamma gamma value */ @SuppressWarnings("WeakerAccess") public void setGamma(float gamma) { if (gamma < 0.0f) gamma = 0.0f; - if (gamma > 1.0f) gamma = 1.0f; - //since the shader excepts a range of 0.0 - 2.0 - //will multiply the 2.0 to every value - this.gamma = gamma * 2.0f; + if (gamma > 2.0f) gamma = 2.0f; + this.gamma = gamma; } /** @@ -49,11 +47,19 @@ public class GammaFilter extends BaseFilter { * @see #setGamma(float) * @return gamma */ - @SuppressWarnings({"unused", "WeakerAccess"}) + @SuppressWarnings("WeakerAccess") public float getGamma() { - //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 gamma / 2.0f; + return gamma; + } + + @Override + public void setParameter1(float value) { + setGamma(value * 2F); + } + + @Override + public float getParameter1() { + return getGamma() / 2F; } @NonNull @@ -80,13 +86,5 @@ public class GammaFilter extends BaseFilter { super.onPreDraw(transformMatrix); GLES20.glUniform1f(gammaLocation, gamma); GlUtils.checkError("glUniform1f"); - - } - - @Override - protected BaseFilter onCopy() { - GammaFilter filter = new GammaFilter(); - filter.setGamma(getGamma()); - return filter; } } \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GrainFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GrainFilter.java index 09285996..01ddd853 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GrainFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/GrainFilter.java @@ -5,6 +5,7 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; import java.util.Random; @@ -12,7 +13,7 @@ import java.util.Random; /** * Applies film grain effect to the frames. */ -public class GrainFilter extends BaseFilter { +public class GrainFilter extends BaseFilter implements OneParameterFilter { private final static Random RANDOM = new Random(); private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" @@ -95,6 +96,15 @@ public class GrainFilter extends BaseFilter { return strength; } + @Override + public void setParameter1(float value) { + setStrength(value); + } + + @Override + public float getParameter1() { + return getStrength(); + } @NonNull @Override @@ -131,11 +141,4 @@ public class GrainFilter extends BaseFilter { GLES20.glUniform1f(stepYLocation, 0.5f / height); GlUtils.checkError("glUniform1f"); } - - @Override - protected BaseFilter onCopy() { - GrainFilter filter = new GrainFilter(); - filter.setStrength(getStrength()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/HueFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/HueFilter.java index f1f8f21d..a013d5b4 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/HueFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/HueFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Applies a hue effect on the input frames. */ -public class HueFilter extends BaseFilter { +public class HueFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -41,7 +42,6 @@ public class HueFilter extends BaseFilter { private float hue = 0.0f; private int hueLocation = -1; - @SuppressWarnings("WeakerAccess") public HueFilter() { } /** @@ -52,7 +52,7 @@ public class HueFilter extends BaseFilter { */ @SuppressWarnings({"unused", "WeakerAccess"}) public void setHue(float hue) { - this.hue = hue; + this.hue = hue % 360; } /** @@ -66,6 +66,16 @@ public class HueFilter extends BaseFilter { return hue; } + @Override + public void setParameter1(float value) { + setHue(value * 360F); + } + + @Override + public float getParameter1() { + return getHue() / 360F; + } + @NonNull @Override public String getFragmentShader() { @@ -93,11 +103,4 @@ public class HueFilter extends BaseFilter { GLES20.glUniform1f(hueLocation, shaderHue); GlUtils.checkError("glUniform1f"); } - - @Override - protected BaseFilter onCopy() { - HueFilter filter = new HueFilter(); - filter.setHue(getHue()); - return filter; - } } \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SaturationFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SaturationFilter.java index 3aad3f46..905addbd 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SaturationFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SaturationFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Adjusts color saturation. */ -public class SaturationFilter extends BaseFilter { +public class SaturationFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -37,29 +38,25 @@ public class SaturationFilter extends BaseFilter { + " gl_FragColor = gl_FragColor+vec4(verynew_color / max_color, color.a);\n" + "}\n"; - private float scale = 1.0f; + private float scale = 1F; // -1...1 private int scaleLocation = -1; private int exponentsLocation = -1; - @SuppressWarnings("WeakerAccess") public SaturationFilter() { } /** * Sets the saturation correction value: - * 0.0: fully desaturated, grayscale. - * 0.5: no change. - * 1.0: fully saturated. + * -1.0: fully desaturated, grayscale. + * 0.0: no change. + * +1.0: fully saturated. * * @param value new value */ @SuppressWarnings("WeakerAccess") public void setSaturation(float value) { - if (value < 0.0f) value = 0.0f; - if (value > 1.0f) value = 1.0f; - - //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; + if (value < -1F) value = -1F; + if (value > 1F) value = 1F; + scale = value; } /** @@ -70,9 +67,17 @@ public class SaturationFilter extends BaseFilter { */ @SuppressWarnings("WeakerAccess") public float getSaturation() { - //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; + return scale; + } + + @Override + public void setParameter1(float value) { + setSaturation(2F * value - 1F); + } + + @Override + public float getParameter1() { + return (getSaturation() + 1F) / 2F; } @NonNull @@ -116,11 +121,4 @@ public class SaturationFilter extends BaseFilter { GlUtils.checkError("glUniform3f"); } } - - @Override - protected BaseFilter onCopy() { - SaturationFilter filter = new SaturationFilter(); - filter.setSaturation(getSaturation()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SharpnessFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SharpnessFilter.java index c3bc417d..5e60543a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SharpnessFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/SharpnessFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Sharpens the input frames. */ -public class SharpnessFilter extends BaseFilter { +public class SharpnessFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -45,7 +46,6 @@ public class SharpnessFilter extends BaseFilter { private int stepSizeXLocation = -1; private int stepSizeYLocation = -1; - @SuppressWarnings("WeakerAccess") public SharpnessFilter() { } @Override @@ -80,6 +80,16 @@ public class SharpnessFilter extends BaseFilter { return scale; } + @Override + public void setParameter1(float value) { + setSharpness(value); + } + + @Override + public float getParameter1() { + return getSharpness(); + } + @NonNull @Override public String getFragmentShader() { @@ -115,10 +125,4 @@ public class SharpnessFilter extends BaseFilter { GLES20.glUniform1f(stepSizeYLocation, 1.0F / height); GlUtils.checkError("glUniform1f"); } - @Override - protected BaseFilter onCopy() { - SharpnessFilter filter = new SharpnessFilter(); - filter.setSharpness(getSharpness()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TemperatureFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TemperatureFilter.java index 75c86df6..b9c7e6df 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TemperatureFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TemperatureFilter.java @@ -5,12 +5,13 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Adjusts color temperature. */ -public class TemperatureFilter extends BaseFilter { +public class TemperatureFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -32,24 +33,23 @@ public class TemperatureFilter extends BaseFilter { + " gl_FragColor = vec4(new_color, color.a);\n" + "}\n"; - private float scale = 0f; + private float scale = 1F; // -1...1 private int scaleLocation = -1; - @SuppressWarnings("WeakerAccess") public TemperatureFilter() { } /** * Sets the new temperature value: - * 0.0: cool colors - * 0.5: no change + * -1.0: cool colors + * 0.0: no change * 1.0: warm colors * * @param value new value */ @SuppressWarnings("WeakerAccess") public void setTemperature(float value) { - if (value < 0.0f) value = 0.0f; - if (value > 1.0f) value = 1.0f; + if (value < -1F) value = -1F; + if (value > 1F) value = 1F; this.scale = value; } @@ -64,6 +64,16 @@ public class TemperatureFilter extends BaseFilter { return scale; } + @Override + public void setParameter1(float value) { + setTemperature((2F * value - 1F)); + } + + @Override + public float getParameter1() { + return (getTemperature() + 1F) / 2F; + } + @NonNull @Override public String getFragmentShader() { @@ -86,14 +96,7 @@ public class TemperatureFilter extends BaseFilter { @Override protected void onPreDraw(float[] transformMatrix) { super.onPreDraw(transformMatrix); - GLES20.glUniform1f(scaleLocation, (2.0f * scale - 1.0f)); + GLES20.glUniform1f(scaleLocation, scale); GlUtils.checkError("glUniform1f"); } - - @Override - protected BaseFilter onCopy() { - TemperatureFilter filter = new TemperatureFilter(); - filter.setTemperature(getTemperature()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TintFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TintFilter.java index e31e5f90..e5f31769 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TintFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/TintFilter.java @@ -7,13 +7,14 @@ import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.OneParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Tints the frames with specified color. */ -public class TintFilter extends BaseFilter { +public class TintFilter extends BaseFilter implements OneParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -33,7 +34,6 @@ public class TintFilter extends BaseFilter { private int tint = Color.RED; private int tintLocation = -1; - @SuppressWarnings("WeakerAccess") public TintFilter() { } /** @@ -57,6 +57,17 @@ public class TintFilter extends BaseFilter { return tint; } + @Override + public void setParameter1(float value) { + // no easy way to transform 0...1 into a color. + setTint((int) (value * Integer.MAX_VALUE)); + } + + @Override + public float getParameter1() { + return (float) getTint() / Integer.MAX_VALUE; + } + @NonNull @Override public String getFragmentShader() { @@ -87,11 +98,4 @@ public class TintFilter extends BaseFilter { GLES20.glUniform3fv(tintLocation, 1, channels, 0); GlUtils.checkError("glUniform3fv"); } - - @Override - protected BaseFilter onCopy() { - TintFilter filter = new TintFilter(); - filter.setTint(getTint()); - return filter; - } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/VignetteFilter.java b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/VignetteFilter.java index a3981954..b4b8af3b 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/filters/VignetteFilter.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/filters/VignetteFilter.java @@ -5,13 +5,14 @@ import android.opengl.GLES20; import androidx.annotation.NonNull; import com.otaliastudios.cameraview.filter.BaseFilter; +import com.otaliastudios.cameraview.filter.TwoParameterFilter; import com.otaliastudios.cameraview.internal.GlUtils; /** * Applies a vignette effect to input frames. */ -public class VignetteFilter extends BaseFilter { +public class VignetteFilter extends BaseFilter implements TwoParameterFilter { private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" @@ -30,8 +31,8 @@ public class VignetteFilter extends BaseFilter { + " gl_FragColor = vec4(color.rgb * lumen, color.a);\n" + "}\n"; - private float mScale = 0.85f; - private float mShade = 0.5f; + private float mScale = 0.85f; // 0...1 + private float mShade = 0.5f; // 0...1 private int mWidth = 1; private int mHeight = 1; @@ -40,7 +41,6 @@ public class VignetteFilter extends BaseFilter { private int mShadeLocation = -1; private int mScaleLocation = -1; - @SuppressWarnings("WeakerAccess") public VignetteFilter() { } @Override @@ -94,6 +94,27 @@ public class VignetteFilter extends BaseFilter { return mShade; } + + @Override + public void setParameter1(float value) { + setVignetteScale(value); + } + + @Override + public float getParameter1() { + return getVignetteScale(); + } + + @Override + public void setParameter2(float value) { + setVignetteShade(value); + } + + @Override + public float getParameter2() { + return getVignetteShade(); + } + @NonNull @Override public String getFragmentShader() { @@ -150,12 +171,4 @@ public class VignetteFilter extends BaseFilter { GLES20.glUniform1f(mRangeLocation, range); GlUtils.checkError("glUniform1f"); } - - @Override - protected BaseFilter onCopy() { - VignetteFilter filter = new VignetteFilter(); - filter.setVignetteScale(getVignetteScale()); - filter.setVignetteShade(getVignetteShade()); - return filter; - } }