diff --git a/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImage.java b/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImage.java index 4b3dcadb..9c2e4234 100644 --- a/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImage.java +++ b/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImage.java @@ -35,6 +35,8 @@ import android.os.Handler; import android.provider.MediaStore; import android.view.Display; +import android.view.SurfaceView; +import android.view.TextureView; import android.view.WindowManager; import java.io.File; @@ -47,6 +49,7 @@ import jp.co.cyberagent.android.gpuimage.filter.GPUImageFilter; import jp.co.cyberagent.android.gpuimage.util.Rotation; +import jp.co.cyberagent.android.gpuimage.view.GLRenderView; /** * The main accessor for GPUImage functionality. This class helps to do common @@ -61,9 +64,7 @@ public enum ScaleType {CENTER_INSIDE, CENTER_CROP} private final Context context; private final GPUImageRenderer renderer; - private int surfaceType = SURFACE_TYPE_SURFACE_VIEW; - private GLSurfaceView glSurfaceView; - private GLTextureView glTextureView; + private GLRenderView glRenderView; private GPUImageFilter filter; private Bitmap currentBitmap; private ScaleType scaleType = ScaleType.CENTER_CROP; @@ -99,35 +100,22 @@ private boolean supportsOpenGLES2(final Context context) { } /** - * Sets the GLSurfaceView which will display the preview. + * Sets the GLRenderView which will display the preview. * - * @param view the GLSurfaceView + * @param view the GLRenderView instance */ - public void setGLSurfaceView(final GLSurfaceView view) { - surfaceType = SURFACE_TYPE_SURFACE_VIEW; - glSurfaceView = view; - glSurfaceView.setEGLContextClientVersion(2); - glSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); - glSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888); - glSurfaceView.setRenderer(renderer); - glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); - glSurfaceView.requestRender(); - } - - /** - * Sets the GLTextureView which will display the preview. - * - * @param view the GLTextureView - */ - public void setGLTextureView(final GLTextureView view) { - surfaceType = SURFACE_TYPE_TEXTURE_VIEW; - glTextureView = view; - glTextureView.setEGLContextClientVersion(2); - glTextureView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); - glTextureView.setOpaque(false); - glTextureView.setRenderer(renderer); - glTextureView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); - glTextureView.requestRender(); + public void setGLRenderView(final GLRenderView view) { + glRenderView = view; + glRenderView.setEGLContextClientVersion(2); + glRenderView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); + if (glRenderView instanceof TextureView) { + ((TextureView) glRenderView).setOpaque(false); + } else if (glRenderView instanceof SurfaceView) { + ((SurfaceView) glRenderView).getHolder().setFormat(PixelFormat.RGBA_8888); + } + glRenderView.setRender(renderer); + glRenderView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); + glRenderView.requestRender(); } /** @@ -145,14 +133,8 @@ public void setBackgroundColor(float red, float green, float blue) { * Request the preview to be rendered again. */ public void requestRender() { - if (surfaceType == SURFACE_TYPE_SURFACE_VIEW) { - if (glSurfaceView != null) { - glSurfaceView.requestRender(); - } - } else if (surfaceType == SURFACE_TYPE_TEXTURE_VIEW) { - if (glTextureView != null) { - glTextureView.requestRender(); - } + if (glRenderView != null) { + glRenderView.requestRender(); } } @@ -183,11 +165,7 @@ public void setUpCamera(final Camera camera) { @Deprecated public void setUpCamera(final Camera camera, final int degrees, final boolean flipHorizontal, final boolean flipVertical) { - if (surfaceType == SURFACE_TYPE_SURFACE_VIEW) { - glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); - } else if (surfaceType == SURFACE_TYPE_TEXTURE_VIEW) { - glTextureView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); - } + glRenderView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); renderer.setUpSurfaceTexture(camera); Rotation rotation = Rotation.NORMAL; switch (degrees) { @@ -259,7 +237,7 @@ public void setScaleType(ScaleType scaleType) { * @return array with width and height of bitmap image */ public int[] getScaleSize() { - return new int[] {scaleWidth, scaleHeight}; + return new int[]{scaleWidth, scaleHeight}; } /** @@ -352,7 +330,7 @@ public Bitmap getBitmapWithFilterApplied(final Bitmap bitmap) { * @return the bitmap with filter applied */ public Bitmap getBitmapWithFilterApplied(final Bitmap bitmap, boolean recycle) { - if (glSurfaceView != null || glTextureView != null) { + if (glRenderView != null) { renderer.deleteImage(); renderer.runOnDraw(new Runnable() { diff --git a/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageRenderer.java b/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageRenderer.java index 5fea701b..43f9ff9d 100644 --- a/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageRenderer.java +++ b/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageRenderer.java @@ -40,10 +40,11 @@ import jp.co.cyberagent.android.gpuimage.util.OpenGlUtils; import jp.co.cyberagent.android.gpuimage.util.Rotation; import jp.co.cyberagent.android.gpuimage.util.TextureRotationUtil; +import jp.co.cyberagent.android.gpuimage.view.GLRenderView; import static jp.co.cyberagent.android.gpuimage.util.TextureRotationUtil.TEXTURE_NO_ROTATION; -public class GPUImageRenderer implements GLSurfaceView.Renderer, GLTextureView.Renderer, PreviewCallback { +public class GPUImageRenderer implements GLSurfaceView.Renderer, GLTextureView.Renderer, PreviewCallback, GLRenderView.Renderer { private static final int NO_IMAGE = -1; public static final float CUBE[] = { -1.0f, -1.0f, diff --git a/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageView.java b/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageView.java index a4fbacd8..38a84c89 100644 --- a/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageView.java +++ b/library/src/main/java/jp/co/cyberagent/android/gpuimage/GPUImageView.java @@ -43,6 +43,7 @@ import jp.co.cyberagent.android.gpuimage.filter.GPUImageFilter; import jp.co.cyberagent.android.gpuimage.util.Rotation; +import jp.co.cyberagent.android.gpuimage.view.GLRenderView; import static jp.co.cyberagent.android.gpuimage.GPUImage.SURFACE_TYPE_SURFACE_VIEW; import static jp.co.cyberagent.android.gpuimage.GPUImage.SURFACE_TYPE_TEXTURE_VIEW; @@ -50,7 +51,7 @@ public class GPUImageView extends FrameLayout { private int surfaceType = SURFACE_TYPE_SURFACE_VIEW; - private View surfaceView; + private GLRenderView surfaceView; private GPUImage gpuImage; private boolean isShowLoading = true; private GPUImageFilter filter; @@ -83,12 +84,14 @@ private void init(Context context, AttributeSet attrs) { gpuImage = new GPUImage(context); if (surfaceType == SURFACE_TYPE_TEXTURE_VIEW) { surfaceView = new GPUImageGLTextureView(context, attrs); - gpuImage.setGLTextureView((GLTextureView) surfaceView); } else { surfaceView = new GPUImageGLSurfaceView(context, attrs); - gpuImage.setGLSurfaceView((GLSurfaceView) surfaceView); } - addView(surfaceView); + gpuImage.setGLRenderView(surfaceView); + + if (surfaceView instanceof View) { + addView((View) surfaceView); + } } @Override @@ -451,7 +454,7 @@ public Size(int width, int height) { } } - private class GPUImageGLSurfaceView extends GLSurfaceView { + private class GPUImageGLSurfaceView extends GLSurfaceView implements GLRenderView { public GPUImageGLSurfaceView(Context context) { super(context); } @@ -469,9 +472,16 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } + + @Override + public void setRender(GLRenderView.Renderer render) { + if (render instanceof GLSurfaceView.Renderer) { + setRenderer((GLSurfaceView.Renderer) render); + } + } } - private class GPUImageGLTextureView extends GLTextureView { + private class GPUImageGLTextureView extends GLTextureView implements GLRenderView { public GPUImageGLTextureView(Context context) { super(context); } @@ -489,6 +499,14 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } + + + @Override + public void setRender(GLRenderView.Renderer render) { + if (render instanceof GLTextureView.Renderer) { + setRenderer((GLTextureView.Renderer) render); + } + } } private class LoadingView extends FrameLayout { diff --git a/library/src/main/java/jp/co/cyberagent/android/gpuimage/view/GLRenderView.java b/library/src/main/java/jp/co/cyberagent/android/gpuimage/view/GLRenderView.java new file mode 100644 index 00000000..b19af708 --- /dev/null +++ b/library/src/main/java/jp/co/cyberagent/android/gpuimage/view/GLRenderView.java @@ -0,0 +1,60 @@ +package jp.co.cyberagent.android.gpuimage.view; + +import android.opengl.GLSurfaceView; + +import jp.co.cyberagent.android.gpuimage.GLTextureView; + +/* + * Copyright (C) 2022 MichaelX + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public interface GLRenderView extends ViewCompat { + /** + * @see android.opengl.GLSurfaceView#setEGLContextClientVersion(int) + * @see jp.co.cyberagent.android.gpuimage.GLTextureView#setEGLContextClientVersion(int) + */ + void setEGLContextClientVersion(int glVersion); + + /** + * @see android.opengl.GLSurfaceView#setEGLConfigChooser(int, int, int, int, int, int) + * @see jp.co.cyberagent.android.gpuimage.GLTextureView#setEGLConfigChooser(int, int, int, int, int, int) + */ + void setEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, + int depthSize, int stencilSize); + + /** + * adapter for {@link android.opengl.GLSurfaceView#setRenderer(GLSurfaceView.Renderer)} + * and {@link jp.co.cyberagent.android.gpuimage.GLTextureView#setRenderer(GLTextureView.Renderer)} + */ + void setRender(Renderer render); + + /** + * @see GLSurfaceView#setRenderMode(int) + * @see GLTextureView#setRenderMode(int) + */ + void setRenderMode(int mode); + + /** + * @see GLSurfaceView#requestRender() + * @see GLTextureView#requestRender() + */ + void requestRender(); + + /** + * {@link GLSurfaceView.Renderer} + * {@link GLTextureView.Renderer} + */ + interface Renderer { + } +} diff --git a/library/src/main/java/jp/co/cyberagent/android/gpuimage/view/ViewCompat.java b/library/src/main/java/jp/co/cyberagent/android/gpuimage/view/ViewCompat.java new file mode 100644 index 00000000..ad75ccd2 --- /dev/null +++ b/library/src/main/java/jp/co/cyberagent/android/gpuimage/view/ViewCompat.java @@ -0,0 +1,38 @@ +package jp.co.cyberagent.android.gpuimage.view; + +import android.view.View; + +/* + * Copyright (C) 2022 MichaelX + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public interface ViewCompat { + + /** + * @return The raw measured width of this view. + * @see View#getMeasuredWidth() + */ + int getMeasuredWidth(); + + /** + * @return The raw measured height of this view. + * @see View#getMeasuredHeight() () + */ + int getMeasuredHeight(); + + /** + * @see View#requestLayout() + */ + void requestLayout(); +}