Fix multifilter bug, fixes #875

pull/953/head
Mattia Iavarone 5 years ago
parent 3731bda761
commit c2996fcde6
  1. 15
      cameraview/src/main/java/com/otaliastudios/cameraview/filter/MultiFilter.java

@ -48,6 +48,7 @@ public class MultiFilter implements Filter, OneParameterFilter, TwoParameterFilt
static class State { static class State {
@VisibleForTesting boolean isProgramCreated = false; @VisibleForTesting boolean isProgramCreated = false;
@VisibleForTesting boolean isFramebufferCreated = false; @VisibleForTesting boolean isFramebufferCreated = false;
private boolean sizeChanged = false;
@VisibleForTesting Size size = null; @VisibleForTesting Size size = null;
private int programHandle = -1; private int programHandle = -1;
private GlFramebuffer outputFramebuffer = null; private GlFramebuffer outputFramebuffer = null;
@ -135,8 +136,17 @@ public class MultiFilter implements Filter, OneParameterFilter, TwoParameterFilt
private void maybeCreateFramebuffer(@NonNull Filter filter, boolean isFirst, boolean isLast) { private void maybeCreateFramebuffer(@NonNull Filter filter, boolean isFirst, boolean isLast) {
State state = states.get(filter); State state = states.get(filter);
if (isLast) {
//noinspection ConstantConditions //noinspection ConstantConditions
if (state.isFramebufferCreated || isLast) return; state.sizeChanged = false;
return;
}
//noinspection ConstantConditions
if (state.sizeChanged) {
maybeDestroyFramebuffer(filter);
state.sizeChanged = false;
}
if (!state.isFramebufferCreated) {
state.isFramebufferCreated = true; state.isFramebufferCreated = true;
state.outputTexture = new GlTexture(GLES20.GL_TEXTURE0, state.outputTexture = new GlTexture(GLES20.GL_TEXTURE0,
GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_2D,
@ -145,6 +155,7 @@ public class MultiFilter implements Filter, OneParameterFilter, TwoParameterFilt
state.outputFramebuffer = new GlFramebuffer(); state.outputFramebuffer = new GlFramebuffer();
state.outputFramebuffer.attach(state.outputTexture); state.outputFramebuffer.attach(state.outputTexture);
} }
}
private void maybeDestroyFramebuffer(@NonNull Filter filter) { private void maybeDestroyFramebuffer(@NonNull Filter filter) {
State state = states.get(filter); State state = states.get(filter);
@ -157,11 +168,13 @@ public class MultiFilter implements Filter, OneParameterFilter, TwoParameterFilt
state.outputTexture = null; state.outputTexture = null;
} }
// Any thread...
private void maybeSetSize(@NonNull Filter filter) { private void maybeSetSize(@NonNull Filter filter) {
State state = states.get(filter); State state = states.get(filter);
//noinspection ConstantConditions //noinspection ConstantConditions
if (size != null && !size.equals(state.size)) { if (size != null && !size.equals(state.size)) {
state.size = size; state.size = size;
state.sizeChanged = true;
filter.setSize(size.getWidth(), size.getHeight()); filter.setSize(size.getWidth(), size.getHeight());
} }
} }

Loading…
Cancel
Save