diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt index 80a158fab..63fe82405 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/decoder/MultiTrackImageGlideModule.kt @@ -19,7 +19,6 @@ import com.bumptech.glide.module.LibraryGlideModule import com.bumptech.glide.signature.ObjectKey import deckers.thibault.aves.metadata.MultiTrackMedia - @GlideModule class MultiTrackImageGlideModule : LibraryGlideModule() { override fun registerComponents(context: Context, glide: Glide, registry: Registry) { 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 eb2e8bcd4..6416286b2 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 @@ -137,6 +137,8 @@ object MimeTypes { // extensions + // among other refs: + // - https://android.googlesource.com/platform/external/mime-support/+/refs/heads/master/mime.types fun extensionFor(mimeType: String): String? = when (mimeType) { ARW -> ".arw" AVI, AVI_VND -> ".avi" diff --git a/lib/ref/mime_types.dart b/lib/ref/mime_types.dart index b81428f18..591d99414 100644 --- a/lib/ref/mime_types.dart +++ b/lib/ref/mime_types.dart @@ -44,7 +44,8 @@ class MimeTypes { static const aviVnd = 'video/vnd.avi'; static const mkv = 'video/x-matroska'; static const mov = 'video/quicktime'; - static const mp2t = 'video/mp2t'; // .m2ts + static const mp2t = 'video/mp2t'; // .m2ts, .ts + static const mp2ts = 'video/mp2ts'; // .ts (prefer `mp2t` when possible) static const mp4 = 'video/mp4'; static const ogv = 'video/ogg'; static const webm = 'video/webm'; @@ -67,7 +68,7 @@ class MimeTypes { static const Set _knownOpaqueImages = {heic, heif, jpeg}; - static const Set _knownVideos = {avi, aviVnd, mkv, mov, mp2t, mp4, ogv, webm}; + static const Set _knownVideos = {avi, aviVnd, mkv, mov, mp2t, mp2ts, mp4, ogv, webm}; static final Set knownMediaTypes = {..._knownOpaqueImages, ...alphaImages, ...rawImages, ...undecodableImages, ..._knownVideos}; diff --git a/lib/widgets/common/magnifier/controller/controller.dart b/lib/widgets/common/magnifier/controller/controller.dart index 27513bb9a..607c210ef 100644 --- a/lib/widgets/common/magnifier/controller/controller.dart +++ b/lib/widgets/common/magnifier/controller/controller.dart @@ -54,7 +54,6 @@ class MagnifierController { bool get isZooming => scaleState.state == ScaleState.zoomedIn || scaleState.state == ScaleState.zoomedOut; - /// Closes streams and removes eventual listeners. void dispose() { _stateStreamController.close(); _scaleBoundariesStreamController.close(); @@ -83,19 +82,19 @@ class MagnifierController { previousScaleState = _currentScaleState; _currentScaleState = ScaleStateChange(state: newValue, source: source, childFocalPoint: childFocalPoint); - _scaleStateChangeStreamController.sink.add(scaleState); + _scaleStateChangeStreamController.add(scaleState); } void _setState(MagnifierState state) { if (_currentState == state) return; _currentState = state; - _stateStreamController.sink.add(state); + _stateStreamController.add(state); } void setScaleBoundaries(ScaleBoundaries scaleBoundaries) { if (_scaleBoundaries == scaleBoundaries) return; _scaleBoundaries = scaleBoundaries; - _scaleBoundariesStreamController.sink.add(scaleBoundaries); + _scaleBoundariesStreamController.add(scaleBoundaries); if (!isZooming) { update( @@ -108,7 +107,7 @@ class MagnifierController { void _setScaleState(ScaleStateChange scaleState) { if (_currentScaleState == scaleState) return; _currentScaleState = scaleState; - _scaleStateChangeStreamController.sink.add(_currentScaleState); + _scaleStateChangeStreamController.add(_currentScaleState); } double? getScaleForScaleState(ScaleState scaleState) { diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart index 09884366d..8cee96098 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/crs.dart @@ -8,11 +8,13 @@ class XmpCrsNamespace extends XmpNamespace { static final cgbcPattern = RegExp(ns + r':CircularGradientBasedCorrections\[(\d+)\]/(.*)'); static final gbcPattern = RegExp(ns + r':GradientBasedCorrections\[(\d+)\]/(.*)'); static final pbcPattern = RegExp(ns + r':PaintBasedCorrections\[(\d+)\]/(.*)'); + static final retouchAreasPattern = RegExp(ns + r':RetouchAreas\[(\d+)\]/(.*)'); static final lookPattern = RegExp(ns + r':Look/(.*)'); final cgbc = >{}; final gbc = >{}; final pbc = >{}; + final retouchAreas = >{}; final look = {}; XmpCrsNamespace(Map rawProps) : super(ns, rawProps); @@ -23,6 +25,7 @@ class XmpCrsNamespace extends XmpNamespace { var hasIndexedStructs = extractIndexedStruct(prop, cgbcPattern, cgbc); hasIndexedStructs |= extractIndexedStruct(prop, gbcPattern, gbc); hasIndexedStructs |= extractIndexedStruct(prop, pbcPattern, pbc); + hasIndexedStructs |= extractIndexedStruct(prop, retouchAreasPattern, retouchAreas); return hasStructs || hasIndexedStructs; } @@ -48,5 +51,10 @@ class XmpCrsNamespace extends XmpNamespace { title: 'Paint Based Corrections', structByIndex: pbc, ), + if (retouchAreas.isNotEmpty) + XmpStructArrayCard( + title: 'Retouch Areas', + structByIndex: retouchAreas, + ), ]; } diff --git a/lib/widgets/viewer/printer.dart b/lib/widgets/viewer/printer.dart index 46a0dff56..9db7aec24 100644 --- a/lib/widgets/viewer/printer.dart +++ b/lib/widgets/viewer/printer.dart @@ -60,7 +60,7 @@ class EntryPrinter with FeedbackMixin { for (var page = 0; page < pageCount; page++) { final pageEntry = multiPageInfo.getPageEntryByIndex(page); _addPdfPage(await _buildPageImage(pageEntry)); - streamController.sink.add(pageEntry); + streamController.add(pageEntry); } await streamController.close(); }