diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart index 1e9e0cf9..5dc0c5ac 100644 --- a/lib/utils/client_manager.dart +++ b/lib/utils/client_manager.dart @@ -7,6 +7,7 @@ import 'package:matrix/encryption/utils/key_verification.dart'; import 'package:matrix/matrix.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:fluffychat/utils/custom_image_resizer.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'famedlysdk_store.dart'; import 'matrix_sdk_extensions.dart/fluffybox_database.dart'; @@ -99,5 +100,6 @@ abstract class ClientManager { AuthenticationTypes.sso }, compute: compute, + customImageResizer: PlatformInfos.isMobile ? customImageResizer : null, ); } diff --git a/lib/utils/custom_image_resizer.dart b/lib/utils/custom_image_resizer.dart new file mode 100644 index 00000000..68119f29 --- /dev/null +++ b/lib/utils/custom_image_resizer.dart @@ -0,0 +1,32 @@ +import 'package:matrix/matrix.dart'; +import 'package:native_imaging/native_imaging.dart' as native; + +Future customImageResizer( + MatrixImageFileResizeArguments arguments) async { + await native.init(); + var nativeImg = await native.Image.loadEncoded(arguments.bytes); + + final width = nativeImg.width; + final height = nativeImg.height; + final max = arguments.maxDimension; + if (width > max || height > max) { + var w = max, h = max; + if (width > height) { + h = max * height ~/ width; + } else { + w = max * width ~/ height; + } + + final scaledImg = nativeImg.resample(w, h, native.Transform.lanczos); + nativeImg.free(); + nativeImg = scaledImg; + } + final jpegBytes = await nativeImg.toJpeg(75); + + return MatrixImageFileResizedResponse( + bytes: jpegBytes, + width: nativeImg.width, + height: nativeImg.height, + blurhash: arguments.calcBlurhash ? nativeImg.toBlurhash(3, 3) : null, + ); +} diff --git a/pubspec.lock b/pubspec.lock index 05f98fe9..6bef89ca 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -983,7 +983,7 @@ packages: name: matrix url: "https://pub.dartlang.org" source: hosted - version: "0.8.16" + version: "0.8.17" matrix_api_lite: dependency: transitive description: @@ -1026,6 +1026,15 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.2" + native_imaging: + dependency: "direct main" + description: + path: "." + ref: HEAD + resolved-ref: "8c6a5afe2c965b79b5959bb4b49c4aad020cb980" + url: "https://gitlab.com/famedly/libraries/native_imaging.git" + source: git + version: "0.1.0" nested: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 776b1d52..347e8edc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -58,8 +58,10 @@ dependencies: keyboard_shortcuts: ^0.1.4 localstorage: ^4.0.0+1 lottie: ^1.2.2 - matrix: ^0.8.16 + matrix: ^0.8.17 matrix_link_text: ^1.0.2 + native_imaging: + git: https://gitlab.com/famedly/libraries/native_imaging.git open_noti_settings: ^0.4.0 package_info_plus: ^1.3.0 path_provider: ^2.0.9