Fix multifilter bug, fixes #875

pull/953/head
Mattia Iavarone 5 years ago
parent 3731bda761
commit c2996fcde6
  1. 29
      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,15 +136,25 @@ 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
state.sizeChanged = false;
return;
}
//noinspection ConstantConditions //noinspection ConstantConditions
if (state.isFramebufferCreated || isLast) return; if (state.sizeChanged) {
state.isFramebufferCreated = true; maybeDestroyFramebuffer(filter);
state.outputTexture = new GlTexture(GLES20.GL_TEXTURE0, state.sizeChanged = false;
GLES20.GL_TEXTURE_2D, }
state.size.getWidth(), if (!state.isFramebufferCreated) {
state.size.getHeight()); state.isFramebufferCreated = true;
state.outputFramebuffer = new GlFramebuffer(); state.outputTexture = new GlTexture(GLES20.GL_TEXTURE0,
state.outputFramebuffer.attach(state.outputTexture); GLES20.GL_TEXTURE_2D,
state.size.getWidth(),
state.size.getHeight());
state.outputFramebuffer = new GlFramebuffer();
state.outputFramebuffer.attach(state.outputTexture);
}
} }
private void maybeDestroyFramebuffer(@NonNull Filter filter) { private void maybeDestroyFramebuffer(@NonNull Filter 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