Skip to content

Commit

Permalink
Optimize code and clean code
Browse files Browse the repository at this point in the history
  • Loading branch information
kineita committed May 19, 2020
1 parent a7ced8d commit 8402b5c
Show file tree
Hide file tree
Showing 36 changed files with 183 additions and 591 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ buildscript {

dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down
24 changes: 10 additions & 14 deletions opengl/src/main/java/jp/eita/canvasgl/CanvasGL.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ import kotlin.math.roundToInt
/**
* All the depth of textures are the same. So the texture drawn after will cover the texture drawn before.
*/
class CanvasGL constructor(override val glCanvas: GLCanvas = GLES20Canvas()) : ICanvasGL {
class CanvasGL : ICanvasGL {

private val bitmapTextureMap: MutableMap<Bitmap, BasicTexture> = WeakHashMap()

private val defaultTextureFilter: BasicTextureFilter
private val defaultTextureFilter: BasicTextureFilter = BasicTextureFilter()

private val canvasBackgroundColor: FloatArray
private val canvasBackgroundColor = FloatArray(4)

private val surfaceTextureMatrix = FloatArray(16)

Expand All @@ -50,28 +50,24 @@ class CanvasGL constructor(override val glCanvas: GLCanvas = GLES20Canvas()) : I
override var height = 0
private set

private val defaultDrawShapeFilter: BasicDrawShapeFilter
private val defaultDrawShapeFilter: BasicDrawShapeFilter = BasicDrawShapeFilter()

private val drawCircleFilter = DrawCircleFilter()

private var currentTextureFilter: TextureFilter? = null

init {
glCanvas.setOnPreDrawShapeListener(object : GLCanvas.OnPreDrawShapeListener {
override val glCanvas: GLCanvas = GLES20Canvas().apply {
onPreDrawShapeListener = object : GLCanvas.OnPreDrawShapeListener {
override fun onPreDraw(program: Int, drawShapeFilter: DrawShapeFilter?) {
drawShapeFilter?.onPreDraw(program, this@CanvasGL)
}
}

})
glCanvas.setOnPreDrawTextureListener(object : GLCanvas.OnPreDrawTextureListener {
onPreDrawTextureListener = object : GLCanvas.OnPreDrawTextureListener {
override fun onPreDraw(textureProgram: Int, texture: BasicTexture?, textureFilter: TextureFilter?) {
textureFilter!!.onPreDraw(textureProgram, texture!!, this@CanvasGL)
}

})
defaultTextureFilter = BasicTextureFilter()
defaultDrawShapeFilter = BasicDrawShapeFilter()
canvasBackgroundColor = FloatArray(4)
}
}

override fun bindBitmapToTexture(whichTexture: Int, bitmap: Bitmap): BitmapTexture? {
Expand Down Expand Up @@ -332,7 +328,7 @@ class CanvasGL constructor(override val glCanvas: GLCanvas = GLES20Canvas()) : I
glCanvas.setSize(width, height)
}

override fun resume() { }
override fun resume() {}

override fun pause() {
currentTextureFilter?.destroy()
Expand Down
1 change: 1 addition & 0 deletions opengl/src/main/java/jp/eita/canvasgl/ICanvasGL.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package jp.eita.canvasgl

import android.graphics.Bitmap
Expand Down
31 changes: 9 additions & 22 deletions opengl/src/main/java/jp/eita/canvasgl/glcanvas/BasicTexture.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,11 @@ import java.util.*
// BasicTexture is a Texture corresponds to a real GL secondBitmap.
// The state of a BasicTexture indicates whether its data is loaded to GL memory.
// If a BasicTexture is loaded into GL memory, it has a GL secondBitmap id.
abstract class BasicTexture protected constructor(canvas: GLCanvas? = null, id: Int = 0, state: Int = STATE_UNLOADED) : Texture {
abstract class BasicTexture protected constructor(canvas: GLCanvas? = null, id: Int = -1, protected var state: Int = STATE_UNLOADED) : Texture {

var id = -1
var id = id
protected set

protected var state: Int

override var width = UNSPECIFIED
protected set

Expand All @@ -43,24 +41,17 @@ abstract class BasicTexture protected constructor(canvas: GLCanvas? = null, id:
var textureHeight = 0
protected set

protected var canvasRef: GLCanvas? = null
protected var canvasRef: GLCanvas? = canvas

private var hasBorder1 = false
var hasBorder = false

var isRecycled = false
protected set

init {
setAssociatedCanvas(canvas)
this.id = id
this.state = state
synchronized(ALL_TEXTURES) { ALL_TEXTURES.put(this, null) }
}

protected fun setAssociatedCanvas(canvas: GLCanvas?) {
canvasRef = canvas
}

/**
* Sets the content size of this secondBitmap. In OpenGL, the actual secondBitmap
* size must be of power of 2, the size of the content may be smaller.
Expand Down Expand Up @@ -91,11 +82,7 @@ abstract class BasicTexture protected constructor(canvas: GLCanvas? = null, id:
// Currently our background is black, so we can draw the thumbnails without
// enabling blending.
fun hasBorder(): Boolean {
return hasBorder1
}

protected fun setBorder(hasBorder: Boolean) {
hasBorder1 = hasBorder
return hasBorder
}

override fun draw(canvas: GLCanvas?, x: Int, y: Int) {
Expand Down Expand Up @@ -139,7 +126,7 @@ abstract class BasicTexture protected constructor(canvas: GLCanvas? = null, id:
id = -1 // Don't free it again.
}
state = STATE_UNLOADED
setAssociatedCanvas(null)
canvasRef = null
}

protected fun finalize() {
Expand Down Expand Up @@ -184,9 +171,9 @@ abstract class BasicTexture protected constructor(canvas: GLCanvas? = null, id:

fun invalidateAllTextures() {
synchronized(ALL_TEXTURES) {
for (t in ALL_TEXTURES.keys) {
t.state = STATE_UNLOADED
t.setAssociatedCanvas(null)
for (basicTexture in ALL_TEXTURES.keys) {
basicTexture.state = STATE_UNLOADED
basicTexture.canvasRef = null
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,4 @@ class BitmapTexture constructor(var bitmap: Bitmap, hasBorder: Boolean = false)

override val isOpaque: Boolean
get() = false

}
5 changes: 1 addition & 4 deletions opengl/src/main/java/jp/eita/canvasgl/glcanvas/GLCanvas.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package jp.eita.canvasgl.glcanvas

import android.graphics.Bitmap
Expand Down Expand Up @@ -211,10 +212,6 @@ interface GLCanvas {
*/
fun getBounds(bounds: Rect?, x: Int, y: Int, width: Int, height: Int)

fun setOnPreDrawTextureListener(l: OnPreDrawTextureListener?)

fun setOnPreDrawShapeListener(l: OnPreDrawShapeListener?)

interface OnPreDrawTextureListener {

fun onPreDraw(textureProgram: Int, texture: BasicTexture?, textureFilter: TextureFilter?)
Expand Down
27 changes: 12 additions & 15 deletions opengl/src/main/java/jp/eita/canvasgl/glcanvas/GLCanvasUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,18 @@ object GLCanvasUtils {

private const val MASK_STRING = "********************************"

private val CRC_TABLE = LongArray(256)
private val CRC_TABLE = LongArray(256).apply {
var part: Long

for (i in 0..255) {
part = i.toLong()
for (j in 0..7) {
val x = if (part.toInt() and 1 != 0) POLY64REV else 0
part = part.shr(1) xor x
}
this[i] = part
}
}

// Throws AssertionError if the input is false.
fun assertTrue(cond: Boolean) {
Expand Down Expand Up @@ -326,18 +337,4 @@ object GLCanvasUtils {
fun debug(message: String?, vararg args: Any?) {
Log.v(DEBUG_TAG, String.format(message!!, *args))
}

init {
// http://bioinf.cs.ucl.ac.uk/downloads/crc64/crc64.c
var part: Long

for (i in 0..255) {
part = i.toLong()
for (j in 0..7) {
val x = if (part.toInt() and 1 != 0) POLY64REV else 0
part = part.shr(1) xor x
}
CRC_TABLE[i] = part
}
}
}
72 changes: 35 additions & 37 deletions opengl/src/main/java/jp/eita/canvasgl/glcanvas/GLES20Canvas.kt
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,9 @@ class GLES20Canvas : GLCanvas {
// Keep track of restore state
private var mMatrices = FloatArray(INITIAL_RESTORE_STATE_SIZE * MATRIX_SIZE)

private var mAlphas = FloatArray(INITIAL_RESTORE_STATE_SIZE)
private var mAlphas = FloatArray(INITIAL_RESTORE_STATE_SIZE).apply {
this[mCurrentAlphaIndex] = 1f
}

private val mSaveFlags = IntArrayCustom()

Expand All @@ -122,13 +124,22 @@ class GLES20Canvas : GLCanvas {
private var mScreenHeight = 0

// GL programs
private var mDrawProgram: Int
private var mDrawProgram: Int = assembleProgram(
loadShader(GLES20.GL_VERTEX_SHADER, BasicDrawShapeFilter.DRAW_VERTEX_SHADER),
loadShader(GLES20.GL_FRAGMENT_SHADER, BasicDrawShapeFilter.DRAW_FRAGMENT_SHADER),
mDrawParameters,
mTempIntArray
)

private var mTextureProgram = 0

private var mOesTextureProgram = 0

private var mMeshProgram = 0
private var mMeshProgram: Int = 0.apply{
val textureFragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, BasicTextureFilter.TEXTURE_FRAGMENT_SHADER)
val meshVertexShader = loadShader(GLES20.GL_VERTEX_SHADER, MESH_VERTEX_SHADER)
assembleProgram(meshVertexShader, textureFragmentShader, mMeshParameters, mTempIntArray)
}

// GL buffer containing BOX_COORDINATES
private val mBoxCoordinates: Int
Expand All @@ -137,9 +148,9 @@ class GLES20Canvas : GLCanvas {

private var mDrawShapeFilter: DrawShapeFilter? = null

private var onPreDrawTextureListener: OnPreDrawTextureListener? = null
var onPreDrawTextureListener: OnPreDrawTextureListener? = null

private var onPreDrawShapeListener: OnPreDrawShapeListener? = null
var onPreDrawShapeListener: OnPreDrawShapeListener? = null

// Keep track of statistics for debugging
private var mCountDrawMesh = 0
Expand All @@ -155,27 +166,19 @@ class GLES20Canvas : GLCanvas {
private val mFrameBuffer = IntArray(1)

// Bound textures.
private val mTargetTextures = ArrayList<RawTexture?>()
private val mTargetTextures = ArrayList<RawTexture?>().apply {
add(null)
}

override val gLId: GLId? = GLES20IdImpl()
override val gLId: GLId = GLES20IdImpl()

init {
Matrix.setIdentityM(mTempTextureMatrix, 0)
Matrix.setIdentityM(mMatrices, mCurrentMatrixIndex)
mAlphas[mCurrentAlphaIndex] = 1f
mTargetTextures.add(null)
val boxBuffer = createBuffer(BOX_COORDINATES)
mBoxCoordinates = uploadBuffer(boxBuffer)
mDrawProgram = assembleProgram(loadShader(GLES20.GL_VERTEX_SHADER, BasicDrawShapeFilter.DRAW_VERTEX_SHADER), loadShader(GLES20.GL_FRAGMENT_SHADER, BasicDrawShapeFilter.DRAW_FRAGMENT_SHADER), mDrawParameters, mTempIntArray)
val textureFragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, BasicTextureFilter.TEXTURE_FRAGMENT_SHADER)
val meshVertexShader = loadShader(GLES20.GL_VERTEX_SHADER, MESH_VERTEX_SHADER)
setupMeshProgram(meshVertexShader, textureFragmentShader)
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA)
checkError()
}

private fun setupMeshProgram(meshVertexShader: Int, textureFragmentShader: Int) {
mMeshProgram = assembleProgram(meshVertexShader, textureFragmentShader, mMeshParameters, mTempIntArray)
val boxBuffer = createBuffer(BOX_COORDINATES)
mBoxCoordinates = uploadBuffer(boxBuffer)
}

override fun setSize(width: Int, height: Int) {
Expand Down Expand Up @@ -321,9 +324,7 @@ class GLES20Canvas : GLCanvas {
private fun draw(type: Int, offset: Int, count: Int, x: Float, y: Float, width: Float, height: Float,
color: Int, lineWidth: Float) {
prepareDraw(offset, color, lineWidth)
if (onPreDrawShapeListener != null) {
onPreDrawShapeListener!!.onPreDraw(mDrawProgram, mDrawShapeFilter)
}
onPreDrawShapeListener?.onPreDraw(mDrawProgram, mDrawShapeFilter)
draw(mDrawParameters, type, count, x, y, width, height, null)
}

Expand Down Expand Up @@ -441,11 +442,8 @@ class GLES20Canvas : GLCanvas {
private fun drawTextureRect(texture: BasicTexture?, textureMatrix: FloatArray?, target: RectF, customMVPMatrix: ICustomMVPMatrix?) {
val params = prepareTexture(texture)
setPosition(params, OFFSET_FILL_RECT)
// printMatrix("texture matrix", textureMatrix, 0);
GLES20.glUniformMatrix4fv(params[INDEX_TEXTURE_MATRIX].handle, 1, false, textureMatrix, 0)
if (onPreDrawTextureListener != null) {
onPreDrawTextureListener!!.onPreDraw(if (texture!!.target == GLES20.GL_TEXTURE_2D) mTextureProgram else mOesTextureProgram, texture, mTextureFilter)
}
onPreDrawTextureListener?.onPreDraw(if (texture!!.target == GLES20.GL_TEXTURE_2D) mTextureProgram else mOesTextureProgram, texture, mTextureFilter)
checkError()
if (texture!!.isFlippedVertically) {
save(GLCanvas.SAVE_FLAG_MATRIX)
Expand Down Expand Up @@ -563,12 +561,12 @@ class GLES20Canvas : GLCanvas {
synchronized(mUnboundTextures) {
var ids = mUnboundTextures
if (mUnboundTextures.size() > 0) {
gLId!!.glDeleteTextures(ids.size(), ids.internalArray, 0)
gLId.glDeleteTextures(ids.size(), ids.internalArray, 0)
ids.clear()
}
ids = mDeleteBuffers
if (ids.size() > 0) {
gLId!!.glDeleteBuffers(ids.size(), ids.internalArray, 0)
gLId.glDeleteBuffers(ids.size(), ids.internalArray, 0)
ids.clear()
}
}
Expand Down Expand Up @@ -691,7 +689,7 @@ class GLES20Canvas : GLCanvas {
}

private fun uploadBuffer(buffer: Buffer?, elementSize: Int): Int {
gLId!!.glGenBuffers(1, mTempIntArray, 0)
gLId.glGenBuffers(1, mTempIntArray, 0)
checkError()
val bufferId = mTempIntArray[0]
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferId)
Expand Down Expand Up @@ -766,14 +764,6 @@ class GLES20Canvas : GLCanvas {
return assembleProgram(vertexShaderHandle, fragmentShaderHandle, shaderParameters, mTempIntArray)
}

override fun setOnPreDrawTextureListener(l: OnPreDrawTextureListener?) {
onPreDrawTextureListener = l
}

override fun setOnPreDrawShapeListener(l: OnPreDrawShapeListener?) {
onPreDrawShapeListener = l
}

abstract class ShaderParameter(protected val mName: String) {

var handle = 0
Expand All @@ -796,13 +786,21 @@ class GLES20Canvas : GLCanvas {
}

companion object {

const val POSITION_ATTRIBUTE = "aPosition"

const val COLOR_UNIFORM = "uColor"

const val MATRIX_UNIFORM = "uMatrix"

const val TEXTURE_MATRIX_UNIFORM = "uTextureMatrix"

const val TEXTURE_SAMPLER_UNIFORM = "uTextureSampler"

const val ALPHA_UNIFORM = "uAlpha"

const val TEXTURE_COORD_ATTRIBUTE = "aTextureCoordinate"

const val MESH_VERTEX_SHADER = (""
+ "uniform mat4 " + MATRIX_UNIFORM + ";\n"
+ "attribute vec2 " + POSITION_ATTRIBUTE + ";\n"
Expand Down
Loading

0 comments on commit 8402b5c

Please sign in to comment.