diff --git a/apng_library/src/androidTest/assets/ball/apngframe01.png b/apng_library/src/androidTest/assets/ball/apngframe01.png new file mode 100644 index 0000000..988c8b7 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe01.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe02.png b/apng_library/src/androidTest/assets/ball/apngframe02.png new file mode 100644 index 0000000..7b1bffd Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe02.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe03.png b/apng_library/src/androidTest/assets/ball/apngframe03.png new file mode 100644 index 0000000..1976343 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe03.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe04.png b/apng_library/src/androidTest/assets/ball/apngframe04.png new file mode 100644 index 0000000..35c61f5 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe04.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe05.png b/apng_library/src/androidTest/assets/ball/apngframe05.png new file mode 100644 index 0000000..270a708 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe05.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe06.png b/apng_library/src/androidTest/assets/ball/apngframe06.png new file mode 100644 index 0000000..39ece9d Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe06.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe07.png b/apng_library/src/androidTest/assets/ball/apngframe07.png new file mode 100644 index 0000000..bfdaccb Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe07.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe08.png b/apng_library/src/androidTest/assets/ball/apngframe08.png new file mode 100644 index 0000000..7008077 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe08.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe09.png b/apng_library/src/androidTest/assets/ball/apngframe09.png new file mode 100644 index 0000000..ff28307 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe09.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe10.png b/apng_library/src/androidTest/assets/ball/apngframe10.png new file mode 100644 index 0000000..d2d3662 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe10.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe11.png b/apng_library/src/androidTest/assets/ball/apngframe11.png new file mode 100644 index 0000000..db0441e Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe11.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe12.png b/apng_library/src/androidTest/assets/ball/apngframe12.png new file mode 100644 index 0000000..6007de7 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe12.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe13.png b/apng_library/src/androidTest/assets/ball/apngframe13.png new file mode 100644 index 0000000..d1828c2 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe13.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe14.png b/apng_library/src/androidTest/assets/ball/apngframe14.png new file mode 100644 index 0000000..88e5d39 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe14.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe15.png b/apng_library/src/androidTest/assets/ball/apngframe15.png new file mode 100644 index 0000000..c41b9b0 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe15.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe16.png b/apng_library/src/androidTest/assets/ball/apngframe16.png new file mode 100644 index 0000000..f011bfd Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe16.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe17.png b/apng_library/src/androidTest/assets/ball/apngframe17.png new file mode 100644 index 0000000..907bc61 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe17.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe18.png b/apng_library/src/androidTest/assets/ball/apngframe18.png new file mode 100644 index 0000000..854afb7 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe18.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe19.png b/apng_library/src/androidTest/assets/ball/apngframe19.png new file mode 100644 index 0000000..cd6075e Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe19.png differ diff --git a/apng_library/src/androidTest/assets/ball/apngframe20.png b/apng_library/src/androidTest/assets/ball/apngframe20.png new file mode 100644 index 0000000..bef4782 Binary files /dev/null and b/apng_library/src/androidTest/assets/ball/apngframe20.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe00.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe00.png new file mode 100644 index 0000000..3832fa3 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe00.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe01.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe01.png new file mode 100644 index 0000000..f502de2 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe01.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe02.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe02.png new file mode 100644 index 0000000..92408f2 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe02.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe03.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe03.png new file mode 100644 index 0000000..cc12355 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe03.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe04.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe04.png new file mode 100644 index 0000000..4048317 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe04.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe05.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe05.png new file mode 100644 index 0000000..c49fcb8 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe05.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe06.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe06.png new file mode 100644 index 0000000..91b8c6c Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe06.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe07.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe07.png new file mode 100644 index 0000000..d0427f6 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe07.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe08.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe08.png new file mode 100644 index 0000000..f6cc4a1 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe08.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe09.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe09.png new file mode 100644 index 0000000..94f9ae9 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe09.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe10.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe10.png new file mode 100644 index 0000000..a184b07 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe10.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe11.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe11.png new file mode 100644 index 0000000..bb49d14 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe11.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe12.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe12.png new file mode 100644 index 0000000..f8ff3a5 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe12.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe13.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe13.png new file mode 100644 index 0000000..57a2c90 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe13.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe14.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe14.png new file mode 100644 index 0000000..55376c1 Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe14.png differ diff --git a/apng_library/src/androidTest/assets/bunny/frame_apngframe15.png b/apng_library/src/androidTest/assets/bunny/frame_apngframe15.png new file mode 100644 index 0000000..a36023e Binary files /dev/null and b/apng_library/src/androidTest/assets/bunny/frame_apngframe15.png differ diff --git a/apng_library/src/androidTest/java/oupson/apng/ApngEncoderInstrumentedTest.kt b/apng_library/src/androidTest/java/oupson/apng/ApngEncoderInstrumentedTest.kt new file mode 100644 index 0000000..26c0483 --- /dev/null +++ b/apng_library/src/androidTest/java/oupson/apng/ApngEncoderInstrumentedTest.kt @@ -0,0 +1,57 @@ +package oupson.apng + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import androidx.test.platform.app.InstrumentationRegistry +import junit.framework.TestCase.assertTrue +import org.junit.Test +import oupson.apng.encoder.ApngEncoder + + +class ApngEncoderInstrumentedTest { + @Test + fun testDiff() { // TODO BLEND / DISPOSE OP + val context = InstrumentationRegistry.getInstrumentation().context + + val frame1 = getFrame(context, "bunny/frame_apngframe01.png") + val frame2 = getFrame(context, "bunny/frame_apngframe02.png") + + val diff = ApngEncoder.getDiffBitmap(frame1, frame2) + + assertTrue(isSimilar(frame1, frame2, diff)) + } + + private fun isSimilar(buffer : Bitmap, frame : Bitmap, diff : Triple) : Boolean { + val btm = buffer.copy(Bitmap.Config.ARGB_8888, true) + + for (y in 0 until diff.first.height) { + for (x in 0 until diff.first.width) { + val p = diff.first.getPixel(x, y) + if (p != Color.TRANSPARENT) + btm.setPixel(diff.second + x, diff.third + y, p) + } + } + + for (y in 0 until buffer.height) { + for (x in 0 until buffer.width) { + if (frame.getPixel(x, y) != btm.getPixel(x, y)) { + return false + } + } + } + return true + } + + private fun getFrame(context: Context, name: String) : Bitmap { + val inputStream = context.assets.open(name) + + val bitmap = BitmapFactory.decodeStream(inputStream, null, BitmapFactory.Options().apply { + inPreferredConfig = Bitmap.Config.ARGB_8888 + }) + + inputStream.close() + return bitmap!! + } +} \ No newline at end of file diff --git a/apng_library/src/androidTest/java/oupson/apng/ExampleInstrumentedTest.java b/apng_library/src/androidTest/java/oupson/apng/ExampleInstrumentedTest.java deleted file mode 100644 index bf654ea..0000000 --- a/apng_library/src/androidTest/java/oupson/apng/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package oupson.apng; - -import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("oupson.apng.test", appContext.getPackageName()); - } -} diff --git a/apng_library/src/main/java/oupson/apng/encoder/ApngEncoder.kt b/apng_library/src/main/java/oupson/apng/encoder/ApngEncoder.kt index 43fdc53..97b3bd2 100644 --- a/apng_library/src/main/java/oupson/apng/encoder/ApngEncoder.kt +++ b/apng_library/src/main/java/oupson/apng/encoder/ApngEncoder.kt @@ -2,6 +2,7 @@ package oupson.apng.encoder import android.graphics.Bitmap import android.graphics.BitmapFactory +import android.graphics.Color import android.util.Log import oupson.apng.exceptions.InvalidFrameSizeException import oupson.apng.utils.Utils @@ -51,6 +52,51 @@ class ApngEncoder( /** Constants for filter (LAST) */ const val FILTER_LAST = 2 + + /** + * + */ + fun getDiffBitmap(bitmapBuffer : Bitmap, btm : Bitmap) : Triple { // TODO BLEND / DISPOSE OP + if (bitmapBuffer.width < btm.width || bitmapBuffer.height < btm.height) { + TODO("EXCEPTION BAD IMAGE SIZE") + } + + var resultBtm = Bitmap.createBitmap(btm.width, btm.height, Bitmap.Config.ARGB_8888) + + var offsetX = resultBtm.width + 1 + var offsetY = resultBtm.height + 1 + + var lastX = 0 + var lastY = 0 + + for (y in 0 until btm.height) { + for (x in 0 until btm.width) { + if (bitmapBuffer.getPixel(x, y) == btm.getPixel(x, y)) { + resultBtm.setPixel(x, y, Color.TRANSPARENT) + } else { + resultBtm.setPixel(x, y, btm.getPixel(x, y)) + if (x < offsetX) + offsetX = x + if (y < offsetY) + offsetY = y + if (x > lastX) + lastX = x + if (y > lastY) + lastY = y + } + } + } + + lastX++ + lastY++ + + val newWidth = lastX - offsetX + val newHeight = lastY - offsetY + + resultBtm = Bitmap.createBitmap(resultBtm, offsetX, offsetY, newWidth, newHeight) + + return Triple(resultBtm, offsetX, offsetY) + } } /** Current Frame. **/ @@ -95,6 +141,9 @@ class ApngEncoder( // TODO DOC + CODE private var optimise : Boolean = true + // TODO DOC + CODE + private var bitmapBuffer : Bitmap? = null + init { outputStream.write(Utils.pngSignature) writeHeader() @@ -550,4 +599,6 @@ class ApngEncoder( i++ } } + + } \ No newline at end of file diff --git a/apng_library/src/main/java/oupson/apng/utils/ApngAnimatorOptions.kt b/apng_library/src/main/java/oupson/apng/utils/ApngAnimatorOptions.kt index c4567c0..0071f72 100644 --- a/apng_library/src/main/java/oupson/apng/utils/ApngAnimatorOptions.kt +++ b/apng_library/src/main/java/oupson/apng/utils/ApngAnimatorOptions.kt @@ -2,4 +2,5 @@ package oupson.apng.utils import android.widget.ImageView +@Deprecated("Deprecated, Use ApngEncoder and ApngDecoder instead", level = DeprecationLevel.WARNING) class ApngAnimatorOptions(val scaleType: ImageView.ScaleType? = ImageView.ScaleType.FIT_CENTER) \ No newline at end of file