Working on exceptions

Content description of fabs
This commit is contained in:
Oupson 2020-12-06 23:32:39 +01:00
parent 34c1eede2a
commit 4e807e8b06
8 changed files with 33 additions and 15 deletions

View File

@ -222,16 +222,12 @@ class ApngEncoder(
disposeOp: Utils.Companion.DisposeOp = Utils.Companion.DisposeOp.APNG_DISPOSE_OP_NONE disposeOp: Utils.Companion.DisposeOp = Utils.Companion.DisposeOp.APNG_DISPOSE_OP_NONE
) { ) {
if (currentFrame == 0) { if (currentFrame == 0) {
if (btm.width != width) if (btm.width != width || btm.height != height)
throw InvalidFrameSizeException("Width of first frame must be equal to width of APNG. (${btm.width} != $width)") throw InvalidFrameSizeException(btm.width, btm.height, width, height, currentFrame == 0)
if (btm.height != height)
throw InvalidFrameSizeException("Height of first frame must be equal to height of APNG. (${btm.height} != $height)")
} }
if (btm.width > width) if (btm.width > width || btm.height > height)
throw InvalidFrameSizeException("Frame width must be inferior or equal at the animation width") throw InvalidFrameSizeException(btm.width, btm.height, width, height, currentFrame == 0)
else if (btm.height > height)
throw InvalidFrameSizeException("Frame height must be inferior or equal at the animation height")
if (firstFrameInAnim || currentFrame != 0) if (firstFrameInAnim || currentFrame != 0)
writeFCTL(btm, delay, disposeOp, blendOp, xOffsets, yOffsets) writeFCTL(btm, delay, disposeOp, blendOp, xOffsets, yOffsets)
@ -373,8 +369,9 @@ class ApngEncoder(
* to conserve memory, this method grabs as many rows as will * to conserve memory, this method grabs as many rows as will
* fit into 32K bytes, or the whole image; whichever is less. * fit into 32K bytes, or the whole image; whichever is less.
* *
* @param image The frame to encode
* *
* @return true if no errors; false if error grabbing pixels * @return [Boolean] true if no errors; false if error grabbing pixels
*/ */
private fun writeImageData(image: Bitmap): Boolean { private fun writeImageData(image: Bitmap): Boolean {
var rowsLeft = height // number of rows remaining to write var rowsLeft = height // number of rows remaining to write

View File

@ -4,6 +4,27 @@ class NoFrameException : Exception()
class NotPngException : Exception() class NotPngException : Exception()
class NotApngException : Exception() class NotApngException : Exception()
class BadCRCException : Exception() class BadCRCException : Exception()
// TODO BETTER MESSAGES
class BadApngException(override val message: String? = null) : Exception() class BadApngException(override val message: String? = null) : Exception()
class InvalidFrameSizeException(override val message: String?) : Exception() class InvalidFrameSizeException(animationWidth : Int, animationHeight : Int, frameWidth : Int, frameHeight : Int, isFirstFrame : Boolean) : Exception() {
override val message: String = when {
animationWidth != frameWidth && isFirstFrame -> {
"Width of first frame must be equal to width of APNG ($animationWidth != $frameWidth)."
}
frameHeight != frameHeight && isFirstFrame -> {
"Height of first frame must be equal to height of APNG ($animationHeight != $frameHeight)."
}
frameWidth > animationWidth -> {
"Frame width must be inferior or equal at the animation width ($animationWidth < $frameWidth)."
}
frameHeight > animationHeight -> {
"Frame height must be inferior or equal at the animation height ($animationHeight < $frameHeight)."
}
else -> {
"Unknown problem"
}
}
}

View File

@ -9,7 +9,6 @@ import java.util.zip.DeflaterOutputStream
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
// TODO FIND A BETTER SOLUTION
/** /**
* Taken from http://catcode.com/pngencoder/com/keypoint/PngEncoder.java * Taken from http://catcode.com/pngencoder/com/keypoint/PngEncoder.java
*/ */

View File

@ -24,11 +24,10 @@ class Utils {
* @param byteArray APNG * @param byteArray APNG
* @return True if is an APNG * @return True if is an APNG
*/ */
// TODO OPTIMISE @Deprecated("Will be removed with ApngAnimator and APNGDisassembler")
fun isApng(byteArray: ByteArray): Boolean { fun isApng(byteArray: ByteArray): Boolean {
if (!isPng(byteArray)) return false if (!isPng(byteArray)) return false
try { try {
val acTL = byteArrayOf(0x61, 0x63, 0x54, 0x4c)
for (i in 8 until byteArray.size) { for (i in 8 until byteArray.size) {
val it = byteArray.copyOfRange(i, i + 4) val it = byteArray.copyOfRange(i, i + 4)
// if byteArray contain acTL // if byteArray contain acTL

View File

@ -18,6 +18,7 @@
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
app:tint="#fff" app:tint="#fff"
android:contentDescription="@string/add_frame"
app:backgroundTint="@color/secondary" app:backgroundTint="@color/secondary"
app:layout_anchor="@id/creatorBottomAppBar" app:layout_anchor="@id/creatorBottomAppBar"
app:layout_anchorGravity="bottom|right|end" app:layout_anchorGravity="bottom|right|end"

View File

@ -23,6 +23,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/ic_create_white_24dp" android:src="@drawable/ic_create_white_24dp"
android:text="@string/create" android:text="@string/create"
android:contentDescription="@string/create_animation"
app:tint="@android:color/white" app:tint="@android:color/white"
app:backgroundTint="@color/secondary" app:backgroundTint="@color/secondary"
app:layout_anchor="@id/bottomAppBar" app:layout_anchor="@id/bottomAppBar"

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>

View File

@ -17,6 +17,8 @@
<string name="done">Done</string> <string name="done">Done</string>
<string name="clear">Clear</string> <string name="clear">Clear</string>
<string name="menu_first_frame_in_anim">First frame in animation</string> <string name="menu_first_frame_in_anim">First frame in animation</string>
<string name="add_frame">Add a frame to the animation</string>
<string name="create_animation">Create an animation</string>
<string name="open">open</string> <string name="open">open</string>
<string name="close">close</string> <string name="close">close</string>