Implement OneParameterFilter and TwoParameterFilter in all filters

pull/535/head
Mattia Iavarone 6 years ago
parent a837f4e928
commit 5ffdbc5713
  1. 1
      cameraview/src/main/java/com/otaliastudios/cameraview/filter/BaseFilter.java
  2. 45
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/BrightnessFilter.java
  3. 41
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/ContrastFilter.java
  4. 34
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/DuotoneFilter.java
  5. 21
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/FillLightFilter.java
  6. 38
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/GammaFilter.java
  7. 19
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/GrainFilter.java
  8. 23
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/HueFilter.java
  9. 42
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/SaturationFilter.java
  10. 20
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/SharpnessFilter.java
  11. 33
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/TemperatureFilter.java
  12. 22
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/TintFilter.java
  13. 37
      cameraview/src/main/java/com/otaliastudios/cameraview/filters/VignetteFilter.java

@ -210,6 +210,7 @@ public abstract class BaseFilter implements Filter {
return copy; return copy;
} }
@SuppressWarnings("WeakerAccess")
protected BaseFilter onCopy() { protected BaseFilter onCopy() {
try { try {
return getClass().newInstance(); return getClass().newInstance();

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Adjusts the brightness of the frames. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -22,28 +23,24 @@ public class BrightnessFilter extends BaseFilter {
+ " gl_FragColor = brightness * color;\n" + " gl_FragColor = brightness * color;\n"
+ "}\n"; + "}\n";
private float brightness = 2.0f; private float brightness = 2.0f; // 1.0F...2.0F
private int brightnessLocation = -1; private int brightnessLocation = -1;
@SuppressWarnings("WeakerAccess")
public BrightnessFilter() { } public BrightnessFilter() { }
/** /**
* Sets the brightness adjustment. * Sets the brightness adjustment.
* 0.0: normal brightness. * 1.0: normal brightness.
* 1.0: high brightness. * 2.0: high brightness.
* *
* @param brightness brightness. * @param brightness brightness.
*/ */
@SuppressWarnings("WeakerAccess") @SuppressWarnings({"WeakerAccess", "unused"})
public void setBrightness(float brightness) { public void setBrightness(float brightness) {
if (brightness < 0.0f) brightness = 0.0f; if (brightness < 1.0f) brightness = 1.0f;
if (brightness > 1.0f) brightness = 1.0f; if (brightness > 2.0f) brightness = 2.0f;
this.brightness = brightness;
//since the shader excepts a range of 1.0 - 2.0
// will add the 1.0 to every value
this.brightness = 1.0f + brightness;
} }
/** /**
@ -54,9 +51,19 @@ public class BrightnessFilter extends BaseFilter {
*/ */
@SuppressWarnings({"unused", "WeakerAccess"}) @SuppressWarnings({"unused", "WeakerAccess"})
public float getBrightness() { public float getBrightness() {
//since the shader excepts a range of 1.0 - 2.0 return brightness;
//to keep it between 0.0f - 1.0f range, will subtract the 1.0 to every value }
return brightness - 1.0f;
@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 @NonNull
@ -84,12 +91,4 @@ public class BrightnessFilter extends BaseFilter {
GLES20.glUniform1f(brightnessLocation, brightness); GLES20.glUniform1f(brightnessLocation, brightness);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
BrightnessFilter filter = new BrightnessFilter();
filter.setBrightness(getBrightness());
return filter;
}
} }

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Adjusts the contrast. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -25,26 +26,23 @@ public class ContrastFilter extends BaseFilter {
+ " gl_FragColor = color;\n" + " gl_FragColor = color;\n"
+ "}\n"; + "}\n";
private float contrast = 2.0f; private float contrast = 2F;
private int contrastLocation = -1; private int contrastLocation = -1;
@SuppressWarnings("WeakerAccess")
public ContrastFilter() { } public ContrastFilter() { }
/** /**
* Sets the current contrast adjustment. * Sets the current contrast adjustment.
* 0.0: no adjustment * 1.0: no adjustment
* 1.0: maximum adjustment * 2.0: increased contrast
* *
* @param contrast contrast * @param contrast contrast
*/ */
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public void setContrast(float contrast) { public void setContrast(float contrast) {
if (contrast < 0.0f) contrast = 0.0f; if (contrast < 1.0f) contrast = 1.0f;
if (contrast > 1.0f) contrast = 1.0f; if (contrast > 2.0f) contrast = 2.0f;
//since the shader excepts a range of 1.0 - 2.0 this.contrast = contrast;
//will add the 1.0 to every value
this.contrast = contrast + 1.0f;
} }
/** /**
@ -55,9 +53,19 @@ public class ContrastFilter extends BaseFilter {
*/ */
@SuppressWarnings({"unused", "WeakerAccess"}) @SuppressWarnings({"unused", "WeakerAccess"})
public float getContrast() { public float getContrast() {
//since the shader excepts a range of 1.0 - 2.0 return contrast;
//to keep it between 0.0f - 1.0f range, will subtract the 1.0 to every value }
return contrast - 1.0f;
@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 @NonNull
@ -85,11 +93,4 @@ public class ContrastFilter extends BaseFilter {
GLES20.glUniform1f(contrastLocation, contrast); GLES20.glUniform1f(contrastLocation, contrast);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
ContrastFilter filter = new ContrastFilter();
filter.setContrast(getContrast());
return filter;
}
} }

@ -7,12 +7,13 @@ import androidx.annotation.ColorInt;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.TwoParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Representation of input frames using only two color tones. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -33,7 +34,6 @@ public class DuotoneFilter extends BaseFilter {
private int mFirstColorLocation = -1; private int mFirstColorLocation = -1;
private int mSecondColorLocation = -1; private int mSecondColorLocation = -1;
@SuppressWarnings("WeakerAccess")
public DuotoneFilter() { } public DuotoneFilter() { }
/** /**
@ -41,7 +41,7 @@ public class DuotoneFilter extends BaseFilter {
* @param firstColor first * @param firstColor first
* @param secondColor second * @param secondColor second
*/ */
@SuppressWarnings({"unused", "WeakerAccess"}) @SuppressWarnings({"unused"})
public void setColors(@ColorInt int firstColor, @ColorInt int secondColor) { public void setColors(@ColorInt int firstColor, @ColorInt int secondColor) {
setFirstColor(firstColor); setFirstColor(firstColor);
setSecondColor(secondColor); setSecondColor(secondColor);
@ -93,6 +93,27 @@ public class DuotoneFilter extends BaseFilter {
return mSecondColor; 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 @NonNull
@Override @Override
@ -134,11 +155,4 @@ public class DuotoneFilter extends BaseFilter {
mFirstColorLocation = -1; mFirstColorLocation = -1;
mSecondColorLocation = -1; mSecondColorLocation = -1;
} }
@Override
protected BaseFilter onCopy() {
DuotoneFilter filter = new DuotoneFilter();
filter.setColors(getFirstColor(), getSecondColor());
return filter;
}
} }

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Applies back-light filling to the frames. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -34,7 +35,6 @@ public class FillLightFilter extends BaseFilter {
private int multiplierLocation = -1; private int multiplierLocation = -1;
private int gammaLocation = -1; private int gammaLocation = -1;
@SuppressWarnings("WeakerAccess")
public FillLightFilter() { } public FillLightFilter() { }
/** /**
@ -62,6 +62,15 @@ public class FillLightFilter extends BaseFilter {
return strength; return strength;
} }
@Override
public void setParameter1(float value) {
setStrength(value);
}
@Override
public float getParameter1() {
return getStrength();
}
@NonNull @NonNull
@Override @Override
@ -99,12 +108,4 @@ public class FillLightFilter extends BaseFilter {
GLES20.glUniform1f(gammaLocation, gamma); GLES20.glUniform1f(gammaLocation, gamma);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
FillLightFilter filter = new FillLightFilter();
filter.setStrength(getStrength());
return filter;
}
} }

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Applies gamma correction to the frames. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -25,22 +26,19 @@ public class GammaFilter extends BaseFilter {
private float gamma = 2.0f; private float gamma = 2.0f;
private int gammaLocation = -1; private int gammaLocation = -1;
@SuppressWarnings("WeakerAccess")
public GammaFilter() { } public GammaFilter() { }
/** /**
* Sets the new gamma value in the 0.0 - 1.0 range. * Sets the new gamma value in the 0.0 - 2.0 range.
* The 0.5 value means no correction will be applied. * The 1.0 value means no correction will be applied.
* *
* @param gamma gamma value * @param gamma gamma value
*/ */
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public void setGamma(float gamma) { public void setGamma(float gamma) {
if (gamma < 0.0f) gamma = 0.0f; if (gamma < 0.0f) gamma = 0.0f;
if (gamma > 1.0f) gamma = 1.0f; if (gamma > 2.0f) gamma = 2.0f;
//since the shader excepts a range of 0.0 - 2.0 this.gamma = gamma;
//will multiply the 2.0 to every value
this.gamma = gamma * 2.0f;
} }
/** /**
@ -49,11 +47,19 @@ public class GammaFilter extends BaseFilter {
* @see #setGamma(float) * @see #setGamma(float)
* @return gamma * @return gamma
*/ */
@SuppressWarnings({"unused", "WeakerAccess"}) @SuppressWarnings("WeakerAccess")
public float getGamma() { public float getGamma() {
//since the shader excepts a range of 0.0 - 2.0 return gamma;
//to keep it between 0.0f - 1.0f range, will divide it with 2.0 }
return gamma / 2.0f;
@Override
public void setParameter1(float value) {
setGamma(value * 2F);
}
@Override
public float getParameter1() {
return getGamma() / 2F;
} }
@NonNull @NonNull
@ -80,13 +86,5 @@ public class GammaFilter extends BaseFilter {
super.onPreDraw(transformMatrix); super.onPreDraw(transformMatrix);
GLES20.glUniform1f(gammaLocation, gamma); GLES20.glUniform1f(gammaLocation, gamma);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
}
@Override
protected BaseFilter onCopy() {
GammaFilter filter = new GammaFilter();
filter.setGamma(getGamma());
return filter;
} }
} }

@ -5,6 +5,7 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
import java.util.Random; import java.util.Random;
@ -12,7 +13,7 @@ import java.util.Random;
/** /**
* Applies film grain effect to the frames. * 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 Random RANDOM = new Random();
private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n" 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; return strength;
} }
@Override
public void setParameter1(float value) {
setStrength(value);
}
@Override
public float getParameter1() {
return getStrength();
}
@NonNull @NonNull
@Override @Override
@ -131,11 +141,4 @@ public class GrainFilter extends BaseFilter {
GLES20.glUniform1f(stepYLocation, 0.5f / height); GLES20.glUniform1f(stepYLocation, 0.5f / height);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
GrainFilter filter = new GrainFilter();
filter.setStrength(getStrength());
return filter;
}
} }

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Applies a hue effect on the input frames. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -41,7 +42,6 @@ public class HueFilter extends BaseFilter {
private float hue = 0.0f; private float hue = 0.0f;
private int hueLocation = -1; private int hueLocation = -1;
@SuppressWarnings("WeakerAccess")
public HueFilter() { } public HueFilter() { }
/** /**
@ -52,7 +52,7 @@ public class HueFilter extends BaseFilter {
*/ */
@SuppressWarnings({"unused", "WeakerAccess"}) @SuppressWarnings({"unused", "WeakerAccess"})
public void setHue(float hue) { public void setHue(float hue) {
this.hue = hue; this.hue = hue % 360;
} }
/** /**
@ -66,6 +66,16 @@ public class HueFilter extends BaseFilter {
return hue; return hue;
} }
@Override
public void setParameter1(float value) {
setHue(value * 360F);
}
@Override
public float getParameter1() {
return getHue() / 360F;
}
@NonNull @NonNull
@Override @Override
public String getFragmentShader() { public String getFragmentShader() {
@ -93,11 +103,4 @@ public class HueFilter extends BaseFilter {
GLES20.glUniform1f(hueLocation, shaderHue); GLES20.glUniform1f(hueLocation, shaderHue);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
HueFilter filter = new HueFilter();
filter.setHue(getHue());
return filter;
}
} }

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Adjusts color saturation. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\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" + " gl_FragColor = gl_FragColor+vec4(verynew_color / max_color, color.a);\n"
+ "}\n"; + "}\n";
private float scale = 1.0f; private float scale = 1F; // -1...1
private int scaleLocation = -1; private int scaleLocation = -1;
private int exponentsLocation = -1; private int exponentsLocation = -1;
@SuppressWarnings("WeakerAccess")
public SaturationFilter() { } public SaturationFilter() { }
/** /**
* Sets the saturation correction value: * Sets the saturation correction value:
* 0.0: fully desaturated, grayscale. * -1.0: fully desaturated, grayscale.
* 0.5: no change. * 0.0: no change.
* 1.0: fully saturated. * +1.0: fully saturated.
* *
* @param value new value * @param value new value
*/ */
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public void setSaturation(float value) { public void setSaturation(float value) {
if (value < 0.0f) value = 0.0f; if (value < -1F) value = -1F;
if (value > 1.0f) value = 1.0f; if (value > 1F) value = 1F;
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;
} }
/** /**
@ -70,9 +67,17 @@ public class SaturationFilter extends BaseFilter {
*/ */
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public float getSaturation() { public float getSaturation() {
//since the shader excepts a range of -1.0 to 1.0 return scale;
//will add 1.0 to every value and divide it by 2.0f }
return (scale + 1.0f) / 2.0f;
@Override
public void setParameter1(float value) {
setSaturation(2F * value - 1F);
}
@Override
public float getParameter1() {
return (getSaturation() + 1F) / 2F;
} }
@NonNull @NonNull
@ -116,11 +121,4 @@ public class SaturationFilter extends BaseFilter {
GlUtils.checkError("glUniform3f"); GlUtils.checkError("glUniform3f");
} }
} }
@Override
protected BaseFilter onCopy() {
SaturationFilter filter = new SaturationFilter();
filter.setSaturation(getSaturation());
return filter;
}
} }

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Sharpens the input frames. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -45,7 +46,6 @@ public class SharpnessFilter extends BaseFilter {
private int stepSizeXLocation = -1; private int stepSizeXLocation = -1;
private int stepSizeYLocation = -1; private int stepSizeYLocation = -1;
@SuppressWarnings("WeakerAccess")
public SharpnessFilter() { } public SharpnessFilter() { }
@Override @Override
@ -80,6 +80,16 @@ public class SharpnessFilter extends BaseFilter {
return scale; return scale;
} }
@Override
public void setParameter1(float value) {
setSharpness(value);
}
@Override
public float getParameter1() {
return getSharpness();
}
@NonNull @NonNull
@Override @Override
public String getFragmentShader() { public String getFragmentShader() {
@ -115,10 +125,4 @@ public class SharpnessFilter extends BaseFilter {
GLES20.glUniform1f(stepSizeYLocation, 1.0F / height); GLES20.glUniform1f(stepSizeYLocation, 1.0F / height);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
SharpnessFilter filter = new SharpnessFilter();
filter.setSharpness(getSharpness());
return filter;
}
} }

@ -5,12 +5,13 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Adjusts color temperature. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -32,24 +33,23 @@ public class TemperatureFilter extends BaseFilter {
+ " gl_FragColor = vec4(new_color, color.a);\n" + " gl_FragColor = vec4(new_color, color.a);\n"
+ "}\n"; + "}\n";
private float scale = 0f; private float scale = 1F; // -1...1
private int scaleLocation = -1; private int scaleLocation = -1;
@SuppressWarnings("WeakerAccess")
public TemperatureFilter() { } public TemperatureFilter() { }
/** /**
* Sets the new temperature value: * Sets the new temperature value:
* 0.0: cool colors * -1.0: cool colors
* 0.5: no change * 0.0: no change
* 1.0: warm colors * 1.0: warm colors
* *
* @param value new value * @param value new value
*/ */
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public void setTemperature(float value) { public void setTemperature(float value) {
if (value < 0.0f) value = 0.0f; if (value < -1F) value = -1F;
if (value > 1.0f) value = 1.0f; if (value > 1F) value = 1F;
this.scale = value; this.scale = value;
} }
@ -64,6 +64,16 @@ public class TemperatureFilter extends BaseFilter {
return scale; return scale;
} }
@Override
public void setParameter1(float value) {
setTemperature((2F * value - 1F));
}
@Override
public float getParameter1() {
return (getTemperature() + 1F) / 2F;
}
@NonNull @NonNull
@Override @Override
public String getFragmentShader() { public String getFragmentShader() {
@ -86,14 +96,7 @@ public class TemperatureFilter extends BaseFilter {
@Override @Override
protected void onPreDraw(float[] transformMatrix) { protected void onPreDraw(float[] transformMatrix) {
super.onPreDraw(transformMatrix); super.onPreDraw(transformMatrix);
GLES20.glUniform1f(scaleLocation, (2.0f * scale - 1.0f)); GLES20.glUniform1f(scaleLocation, scale);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
TemperatureFilter filter = new TemperatureFilter();
filter.setTemperature(getTemperature());
return filter;
}
} }

@ -7,13 +7,14 @@ import androidx.annotation.ColorInt;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.OneParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Tints the frames with specified color. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -33,7 +34,6 @@ public class TintFilter extends BaseFilter {
private int tint = Color.RED; private int tint = Color.RED;
private int tintLocation = -1; private int tintLocation = -1;
@SuppressWarnings("WeakerAccess")
public TintFilter() { } public TintFilter() { }
/** /**
@ -57,6 +57,17 @@ public class TintFilter extends BaseFilter {
return tint; 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 @NonNull
@Override @Override
public String getFragmentShader() { public String getFragmentShader() {
@ -87,11 +98,4 @@ public class TintFilter extends BaseFilter {
GLES20.glUniform3fv(tintLocation, 1, channels, 0); GLES20.glUniform3fv(tintLocation, 1, channels, 0);
GlUtils.checkError("glUniform3fv"); GlUtils.checkError("glUniform3fv");
} }
@Override
protected BaseFilter onCopy() {
TintFilter filter = new TintFilter();
filter.setTint(getTint());
return filter;
}
} }

@ -5,13 +5,14 @@ import android.opengl.GLES20;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.filter.BaseFilter; import com.otaliastudios.cameraview.filter.BaseFilter;
import com.otaliastudios.cameraview.filter.TwoParameterFilter;
import com.otaliastudios.cameraview.internal.GlUtils; import com.otaliastudios.cameraview.internal.GlUtils;
/** /**
* Applies a vignette effect to input frames. * 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" private final static String FRAGMENT_SHADER = "#extension GL_OES_EGL_image_external : require\n"
+ "precision mediump float;\n" + "precision mediump float;\n"
@ -30,8 +31,8 @@ public class VignetteFilter extends BaseFilter {
+ " gl_FragColor = vec4(color.rgb * lumen, color.a);\n" + " gl_FragColor = vec4(color.rgb * lumen, color.a);\n"
+ "}\n"; + "}\n";
private float mScale = 0.85f; private float mScale = 0.85f; // 0...1
private float mShade = 0.5f; private float mShade = 0.5f; // 0...1
private int mWidth = 1; private int mWidth = 1;
private int mHeight = 1; private int mHeight = 1;
@ -40,7 +41,6 @@ public class VignetteFilter extends BaseFilter {
private int mShadeLocation = -1; private int mShadeLocation = -1;
private int mScaleLocation = -1; private int mScaleLocation = -1;
@SuppressWarnings("WeakerAccess")
public VignetteFilter() { } public VignetteFilter() { }
@Override @Override
@ -94,6 +94,27 @@ public class VignetteFilter extends BaseFilter {
return mShade; 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 @NonNull
@Override @Override
public String getFragmentShader() { public String getFragmentShader() {
@ -150,12 +171,4 @@ public class VignetteFilter extends BaseFilter {
GLES20.glUniform1f(mRangeLocation, range); GLES20.glUniform1f(mRangeLocation, range);
GlUtils.checkError("glUniform1f"); GlUtils.checkError("glUniform1f");
} }
@Override
protected BaseFilter onCopy() {
VignetteFilter filter = new VignetteFilter();
filter.setVignetteScale(getVignetteScale());
filter.setVignetteShade(getVignetteShade());
return filter;
}
} }

Loading…
Cancel
Save