From ae5c2f795e7db1d0c442a0a9485a8976d237d7b8 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Wed, 20 Dec 2023 20:17:12 +0100 Subject: [PATCH] MPF: mpf dependent image decoding in viewer --- .../aves/channel/streams/ImageByteStreamHandler.kt | 2 +- .../thibault/aves/decoder/MultiPageImageGlideModule.kt | 2 ++ .../aves/metadata/metadataextractor/mpf/MpEntry.kt | 2 ++ .../main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt | 7 ++++--- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt index e767ad064..54fc04f9d 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/ImageByteStreamHandler.kt @@ -99,7 +99,7 @@ class ImageByteStreamHandler(private val context: Context, private val arguments if (isVideo(mimeType)) { streamVideoByGlide(uri, mimeType, sizeBytes) - } else if (!canDecodeWithFlutter(mimeType, rotationDegrees, isFlipped)) { + } else if (!canDecodeWithFlutter(mimeType, pageId, rotationDegrees, isFlipped)) { // decode exotic format on platform side, then encode it in portable format for Flutter streamImageByGlide(uri, pageId, mimeType, sizeBytes, rotationDegrees, isFlipped) } else { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiPageImageGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiPageImageGlideModule.kt index 353b99112..c068834c1 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiPageImageGlideModule.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiPageImageGlideModule.kt @@ -29,6 +29,8 @@ class MultiPageImageGlideModule : LibraryGlideModule() { } class MultiPageImage(val context: Context, val uri: Uri, val mimeType: String, val pageId: Int?) { + override fun toString(): String = "MultiPageImage#${hashCode()}{uri=$uri, mimeType=$mimeType, pageId=$pageId}" + companion object { fun isSupported(mimeType: String) = MimeTypes.isHeic(mimeType) || mimeType == MimeTypes.JPEG } diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt index 3e81171f3..dc777dbd2 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/metadata/metadataextractor/mpf/MpEntry.kt @@ -12,6 +12,8 @@ class MpEntry(val flags: Int, val format: Int, val type: Int, val size: Long, va else -> false } + override fun toString(): String = "MpEntry#${hashCode()}{flags=$flags, format=$format, type=$type, size=$size, dataOffset=$dataOffset, dep1=$dep1, dep2=$dep2}" + companion object { const val FLAG_REPRESENTATIVE = 1 shl 2 const val FLAG_DEPENDENT_CHILD = 1 shl 3 diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt index 31d0e9986..d68d851b1 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/utils/MimeTypes.kt @@ -82,9 +82,10 @@ object MimeTypes { else -> false } - // as of Flutter v1.22.0, with additional custom handling for SVG - fun canDecodeWithFlutter(mimeType: String, rotationDegrees: Int?, isFlipped: Boolean?) = when (mimeType) { - JPEG, GIF, WEBP, BMP, WBMP, ICO, SVG -> true + // as of Flutter v3.16.4, with additional custom handling for SVG + fun canDecodeWithFlutter(mimeType: String, pageId: Int?, rotationDegrees: Int?, isFlipped: Boolean?) = when (mimeType) { + GIF, WEBP, BMP, WBMP, ICO, SVG -> true + JPEG -> (pageId ?: 0) == 0 PNG -> (rotationDegrees ?: 0) == 0 && !(isFlipped ?: false) else -> false }