diff options
author | Jorge Ruesga <jorge@ruesga.com> | 2013-08-19 23:08:06 +0200 |
---|---|---|
committer | Jorge Ruesga <jorge@ruesga.com> | 2013-08-19 23:08:06 +0200 |
commit | 8a28e0b1dd9386c70732860e71d5ee91643d61f8 (patch) | |
tree | f840965e28d7412a7ca04d3f4f95a9e50e037004 /src/org/cyanogenmod/wallpapers/photophase/transitions | |
parent | faee676e463486aee0d34c5df8a8b935c5412829 (diff) | |
download | android_packages_wallpapers_PhotoPhase-8a28e0b1dd9386c70732860e71d5ee91643d61f8.tar.gz android_packages_wallpapers_PhotoPhase-8a28e0b1dd9386c70732860e71d5ee91643d61f8.tar.bz2 android_packages_wallpapers_PhotoPhase-8a28e0b1dd9386c70732860e71d5ee91643d61f8.zip |
Fix some memory leaks and improve allocations (#26)
Signed-off-by: Jorge Ruesga <jorge@ruesga.com>
Diffstat (limited to 'src/org/cyanogenmod/wallpapers/photophase/transitions')
4 files changed, 79 insertions, 69 deletions
diff --git a/src/org/cyanogenmod/wallpapers/photophase/transitions/CubeTransition.java b/src/org/cyanogenmod/wallpapers/photophase/transitions/CubeTransition.java index d603a72..bfe300b 100644 --- a/src/org/cyanogenmod/wallpapers/photophase/transitions/CubeTransition.java +++ b/src/org/cyanogenmod/wallpapers/photophase/transitions/CubeTransition.java @@ -67,6 +67,10 @@ public class CubeTransition extends Transition { private boolean mRunning; private long mTime; + private FloatBuffer mPositionBuffer; + private float[] mTranslationMatrix; + private float[] mVertex; + private float mAmount; /** @@ -79,6 +83,7 @@ public class CubeTransition extends Transition { super(ctx, tm, VERTEX_SHADER, FRAGMENT_SHADER); // Initialized + mTranslationMatrix = new float[16]; reset(); } @@ -114,6 +119,17 @@ public class CubeTransition extends Transition { super.select(target); mAmount = getAmount(); + // Create the interal buffer + float[] vertex = target.getFrameVertex(); + if (mPositionBuffer == null) { + ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length * 4); // (# of coordinate values * 4 bytes per float) + bb.order(ByteOrder.nativeOrder()); + mPositionBuffer = bb.asFloatBuffer(); + } + if (mVertex == null) { + mVertex = new float[vertex.length]; + } + // Random mode List<WINDOW_MODES> modes = new ArrayList<CubeTransition.WINDOW_MODES>( @@ -215,33 +231,31 @@ public class CubeTransition extends Transition { GLESUtil.glesCheckError("glEnableVertexAttribArray"); // Position - float[] vertex = cloneVertex(); + setInternalVertex(); float interpolation = delta > 0.5f ? 1 - delta : delta; - float w = Math.abs(vertex[6] - vertex[4]); + float w = Math.abs(mVertex[6] - mVertex[4]); switch (mMode) { case RIGHT_TO_LEFT: - vertex[1] -= interpolation * mAmount; - vertex[5] += interpolation * mAmount; - vertex[4] += w * delta; - vertex[0] = vertex[4]; + mVertex[1] -= interpolation * mAmount; + mVertex[5] += interpolation * mAmount; + mVertex[4] += w * delta; + mVertex[0] = mVertex[4]; break; case LEFT_TO_RIGHT: - vertex[3] -= interpolation * mAmount; - vertex[7] += interpolation * mAmount; - vertex[6] -= w * delta; - vertex[2] = vertex[6]; + mVertex[3] -= interpolation * mAmount; + mVertex[7] += interpolation * mAmount; + mVertex[6] -= w * delta; + mVertex[2] = mVertex[6]; break; default: break; } - ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length * 4); // (# of coordinate values * 4 bytes per float) - bb.order(ByteOrder.nativeOrder()); - FloatBuffer positionBuffer = bb.asFloatBuffer(); - positionBuffer.put(vertex); - positionBuffer.position(0); - GLES20.glVertexAttribPointer(mPositionHandlers[0], 2, GLES20.GL_FLOAT, false, 0, positionBuffer); + mPositionBuffer.position(0); + mPositionBuffer.put(mVertex); + mPositionBuffer.position(0); + GLES20.glVertexAttribPointer(mPositionHandlers[0], 2, GLES20.GL_FLOAT, false, 0, mPositionBuffer); GLESUtil.glesCheckError("glVertexAttribPointer"); GLES20.glEnableVertexAttribArray(mPositionHandlers[0]); GLESUtil.glesCheckError("glEnableVertexAttribArray"); @@ -254,12 +268,12 @@ public class CubeTransition extends Transition { case RIGHT_TO_LEFT: angle = delta * 90; rotateY = -1.0f; - translateX = vertex[2] * -1; + translateX = mVertex[2] * -1; break; case LEFT_TO_RIGHT: angle = delta * -90; rotateY = -1.0f; - translateX = vertex[0] * -1; + translateX = mVertex[0] * -1; break; default: @@ -267,12 +281,11 @@ public class CubeTransition extends Transition { } // Apply the projection and view transformation - float[] translationMatrix = new float[16]; Matrix.setIdentityM(matrix, 0); - Matrix.translateM(translationMatrix, 0, matrix, 0, -translateX, 0.0f, 0.0f); - Matrix.rotateM(translationMatrix, 0, translationMatrix, 0, angle, 0.0f, rotateY, 0.0f); - Matrix.translateM(translationMatrix, 0, translationMatrix, 0, translateX, 0.0f, 0.0f); - GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[0], 1, false, translationMatrix, 0); + Matrix.translateM(mTranslationMatrix, 0, matrix, 0, -translateX, 0.0f, 0.0f); + Matrix.rotateM(mTranslationMatrix, 0, mTranslationMatrix, 0, angle, 0.0f, rotateY, 0.0f); + Matrix.translateM(mTranslationMatrix, 0, mTranslationMatrix, 0, translateX, 0.0f, 0.0f); + GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[0], 1, false, mTranslationMatrix, 0); GLESUtil.glesCheckError("glUniformMatrix4fv"); // Draw @@ -322,33 +335,31 @@ public class CubeTransition extends Transition { GLESUtil.glesCheckError("glEnableVertexAttribArray"); // Position - float[] vertex = cloneVertex(); + setInternalVertex(); float interpolation = delta > 0.5f ? 1 - delta : delta; - float w = Math.abs(vertex[6] - vertex[4]); + float w = Math.abs(mVertex[6] - mVertex[4]); switch (mMode) { case LEFT_TO_RIGHT: - vertex[1] -= interpolation * mAmount; - vertex[5] += interpolation * mAmount; - vertex[4] += w * (1 - delta); - vertex[0] = vertex[4]; + mVertex[1] -= interpolation * mAmount; + mVertex[5] += interpolation * mAmount; + mVertex[4] += w * (1 - delta); + mVertex[0] = mVertex[4]; break; case RIGHT_TO_LEFT: - vertex[3] -= interpolation * mAmount; - vertex[7] += interpolation * mAmount; - vertex[6] -= w * (1 - delta); - vertex[2] = vertex[6]; + mVertex[3] -= interpolation * mAmount; + mVertex[7] += interpolation * mAmount; + mVertex[6] -= w * (1 - delta); + mVertex[2] = mVertex[6]; break; default: break; } - ByteBuffer bb = ByteBuffer.allocateDirect(vertex.length * 4); // (# of coordinate values * 4 bytes per float) - bb.order(ByteOrder.nativeOrder()); - FloatBuffer positionBuffer = bb.asFloatBuffer(); - positionBuffer.put(vertex); - positionBuffer.position(0); - GLES20.glVertexAttribPointer(mPositionHandlers[1], 2, GLES20.GL_FLOAT, false, 0, positionBuffer); + mPositionBuffer.position(0); + mPositionBuffer.put(mVertex); + mPositionBuffer.position(0); + GLES20.glVertexAttribPointer(mPositionHandlers[1], 2, GLES20.GL_FLOAT, false, 0, mPositionBuffer); GLESUtil.glesCheckError("glVertexAttribPointer"); GLES20.glEnableVertexAttribArray(mPositionHandlers[1]); GLESUtil.glesCheckError("glEnableVertexAttribArray"); @@ -361,12 +372,12 @@ public class CubeTransition extends Transition { case LEFT_TO_RIGHT: angle = 90 - (delta * 90); rotateY = -1.0f; - translateX = vertex[2] * -1; + translateX = mVertex[2] * -1; break; case RIGHT_TO_LEFT: angle = -90 + (delta * 90); rotateY = -1.0f; - translateX = vertex[0] * -1; + translateX = mVertex[0] * -1; break; default: @@ -374,12 +385,11 @@ public class CubeTransition extends Transition { } // Apply the projection and view transformation - float[] translationMatrix = new float[16]; Matrix.setIdentityM(matrix, 0); - Matrix.translateM(translationMatrix, 0, matrix, 0, -translateX, 0.0f, 0.0f); - Matrix.rotateM(translationMatrix, 0, translationMatrix, 0, angle, 0.0f, rotateY, 0.0f); - Matrix.translateM(translationMatrix, 0, translationMatrix, 0, translateX, 0.0f, 0.0f); - GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[1], 1, false, translationMatrix, 0); + Matrix.translateM(mTranslationMatrix, 0, matrix, 0, -translateX, 0.0f, 0.0f); + Matrix.rotateM(mTranslationMatrix, 0, mTranslationMatrix, 0, angle, 0.0f, rotateY, 0.0f); + Matrix.translateM(mTranslationMatrix, 0, mTranslationMatrix, 0, translateX, 0.0f, 0.0f); + GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[1], 1, false, mTranslationMatrix, 0); GLESUtil.glesCheckError("glUniformMatrix4fv"); // Draw @@ -451,15 +461,11 @@ public class CubeTransition extends Transition { } /** - * Method that copy the vertex array - * - * @return The copy of the vertex + * Method that prepares the internal vertex array */ - private float[] cloneVertex() { + private void setInternalVertex() { float[] originalVertex = mTarget.getFrameVertex(); - float[] vertex = new float[originalVertex.length]; - System.arraycopy(originalVertex, 0, vertex, 0, originalVertex.length); - return vertex; + System.arraycopy(originalVertex, 0, mVertex, 0, originalVertex.length); } /** diff --git a/src/org/cyanogenmod/wallpapers/photophase/transitions/FlipTransition.java b/src/org/cyanogenmod/wallpapers/photophase/transitions/FlipTransition.java index 295add9..8d0bf79 100644 --- a/src/org/cyanogenmod/wallpapers/photophase/transitions/FlipTransition.java +++ b/src/org/cyanogenmod/wallpapers/photophase/transitions/FlipTransition.java @@ -57,6 +57,8 @@ public class FlipTransition extends Transition { private FLIP_MODES mMode; + private float[] mTranslationMatrix; + private boolean mRunning; private long mTime; @@ -70,6 +72,7 @@ public class FlipTransition extends Transition { super(ctx, tm, VERTEX_SHADER, FRAGMENT_SHADER); // Initialized + mTranslationMatrix = new float[16]; reset(); } @@ -233,12 +236,11 @@ public class FlipTransition extends Transition { } // Apply the projection and view transformation - float[] translationMatrix = new float[16]; Matrix.setIdentityM(matrix, 0); - Matrix.translateM(translationMatrix, 0, matrix, 0, -translateX, -translateY, 0.0f); - Matrix.rotateM(translationMatrix, 0, translationMatrix, 0, angle, rotateX, rotateY, 0.0f); - Matrix.translateM(translationMatrix, 0, translationMatrix, 0, translateX, translateY, 0.0f); - GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[index], 1, false, translationMatrix, 0); + Matrix.translateM(mTranslationMatrix, 0, matrix, 0, -translateX, -translateY, 0.0f); + Matrix.rotateM(mTranslationMatrix, 0, mTranslationMatrix, 0, angle, rotateX, rotateY, 0.0f); + Matrix.translateM(mTranslationMatrix, 0, mTranslationMatrix, 0, translateX, translateY, 0.0f); + GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[index], 1, false, mTranslationMatrix, 0); GLESUtil.glesCheckError("glUniformMatrix4fv"); // Draw diff --git a/src/org/cyanogenmod/wallpapers/photophase/transitions/Transition.java b/src/org/cyanogenmod/wallpapers/photophase/transitions/Transition.java index da8b1b0..cdd5438 100644 --- a/src/org/cyanogenmod/wallpapers/photophase/transitions/Transition.java +++ b/src/org/cyanogenmod/wallpapers/photophase/transitions/Transition.java @@ -182,7 +182,7 @@ public abstract class Transition { createProgram(index); } GLES20.glUseProgram(mProgramHandlers[index]); - GLESUtil.glesCheckError("glUseProgram(" + index + ")"); + GLESUtil.glesCheckError("glUseProgram()"); } /** @@ -195,11 +195,11 @@ public abstract class Transition { GLES20.glDeleteProgram(mProgramHandlers[i]); GLESUtil.glesCheckError("glDeleteProgram"); } - mProgramHandlers[i] = 0; - mTextureHandlers[i] = 0; - mPositionHandlers[i] = 0; - mTextureCoordHandlers[i] = 0; - mMVPMatrixHandlers[i] = 0; + mProgramHandlers[i] = -1; + mTextureHandlers[i] = -1; + mPositionHandlers[i] = -1; + mTextureCoordHandlers[i] = -1; + mMVPMatrixHandlers[i] = -1; } mTransitionTarget = null; mTarget = null; diff --git a/src/org/cyanogenmod/wallpapers/photophase/transitions/WindowTransition.java b/src/org/cyanogenmod/wallpapers/photophase/transitions/WindowTransition.java index d580c8b..b09cfaa 100644 --- a/src/org/cyanogenmod/wallpapers/photophase/transitions/WindowTransition.java +++ b/src/org/cyanogenmod/wallpapers/photophase/transitions/WindowTransition.java @@ -65,6 +65,8 @@ public class WindowTransition extends Transition { private WINDOW_MODES mMode; + private float[] mTranslationMatrix; + private boolean mRunning; private long mTime; @@ -81,6 +83,7 @@ public class WindowTransition extends Transition { super(ctx, tm, VERTEX_SHADER, FRAGMENT_SHADER); // Initialized + mTranslationMatrix = new float[16]; reset(); } @@ -275,12 +278,11 @@ public class WindowTransition extends Transition { } // Apply the projection and view transformation - float[] translationMatrix = new float[16]; Matrix.setIdentityM(matrix, 0); - Matrix.translateM(translationMatrix, 0, matrix, 0, -translateX, 0.0f, 0.0f); - Matrix.rotateM(translationMatrix, 0, translationMatrix, 0, angle, 0.0f, rotateY, 0.0f); - Matrix.translateM(translationMatrix, 0, translationMatrix, 0, translateX, 0.0f, 0.0f); - GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[0], 1, false, translationMatrix, 0); + Matrix.translateM(mTranslationMatrix, 0, matrix, 0, -translateX, 0.0f, 0.0f); + Matrix.rotateM(mTranslationMatrix, 0, mTranslationMatrix, 0, angle, 0.0f, rotateY, 0.0f); + Matrix.translateM(mTranslationMatrix, 0, mTranslationMatrix, 0, translateX, 0.0f, 0.0f); + GLES20.glUniformMatrix4fv(mMVPMatrixHandlers[0], 1, false, mTranslationMatrix, 0); GLESUtil.glesCheckError("glUniformMatrix4fv"); // Draw |