feat: Pass through a custom image
resize function to the client This allows the use of the native imaging package in a more easy way.
This commit is contained in:
		
							parent
							
								
									a915cdacc8
								
							
						
					
					
						commit
						445252b3a5
					
				|  | @ -104,6 +104,9 @@ class Client extends MatrixApi { | ||||||
| 
 | 
 | ||||||
|   final Duration sendTimelineEventTimeout; |   final Duration sendTimelineEventTimeout; | ||||||
| 
 | 
 | ||||||
|  |   MatrixImageFileResizedResponse? Function(MatrixImageFileResizeArguments)? | ||||||
|  |       customImageResizer; | ||||||
|  | 
 | ||||||
|   /// Create a client |   /// Create a client | ||||||
|   /// [clientName] = unique identifier of this client |   /// [clientName] = unique identifier of this client | ||||||
|   /// [databaseBuilder]: A function that creates the database instance, that will be used. |   /// [databaseBuilder]: A function that creates the database instance, that will be used. | ||||||
|  | @ -141,6 +144,8 @@ class Client extends MatrixApi { | ||||||
|   /// code in background. |   /// code in background. | ||||||
|   /// Set [timelineEventTimeout] to the preferred time the Client should retry |   /// Set [timelineEventTimeout] to the preferred time the Client should retry | ||||||
|   /// sending events on connection problems or to `Duration.zero` to disable it. |   /// sending events on connection problems or to `Duration.zero` to disable it. | ||||||
|  |   /// Set [customImageResizer] to your own implementation for a more advanced | ||||||
|  |   /// and faster image resizing experience. | ||||||
|   Client( |   Client( | ||||||
|     this.clientName, { |     this.clientName, { | ||||||
|     this.databaseBuilder, |     this.databaseBuilder, | ||||||
|  | @ -164,6 +169,7 @@ class Client extends MatrixApi { | ||||||
|     Level? logLevel, |     Level? logLevel, | ||||||
|     Filter? syncFilter, |     Filter? syncFilter, | ||||||
|     this.sendTimelineEventTimeout = const Duration(minutes: 1), |     this.sendTimelineEventTimeout = const Duration(minutes: 1), | ||||||
|  |     this.customImageResizer, | ||||||
|     @deprecated bool? debug, |     @deprecated bool? debug, | ||||||
|   })  : syncFilter = syncFilter ?? |   })  : syncFilter = syncFilter ?? | ||||||
|             Filter( |             Filter( | ||||||
|  |  | ||||||
|  | @ -743,13 +743,16 @@ class Room { | ||||||
|               .unsigned![fileSendingStatusKey] = |               .unsigned![fileSendingStatusKey] = | ||||||
|           FileSendingStatus.generatingThumbnail.name; |           FileSendingStatus.generatingThumbnail.name; | ||||||
|       await _handleFakeSync(syncUpdate); |       await _handleFakeSync(syncUpdate); | ||||||
|       thumbnail ??= |       thumbnail ??= await file.generateThumbnail( | ||||||
|           await file.generateThumbnail(compute: client.runInBackground); |         compute: client.runInBackground, | ||||||
|  |         customImageResizer: client.customImageResizer, | ||||||
|  |       ); | ||||||
|       if (shrinkImageMaxDimension != null) { |       if (shrinkImageMaxDimension != null) { | ||||||
|         file = await MatrixImageFile.shrink( |         file = await MatrixImageFile.shrink( | ||||||
|           bytes: file.bytes, |           bytes: file.bytes, | ||||||
|           name: file.name, |           name: file.name, | ||||||
|           maxDimension: shrinkImageMaxDimension, |           maxDimension: shrinkImageMaxDimension, | ||||||
|  |           customImageResizer: client.customImageResizer, | ||||||
|         ); |         ); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -105,14 +105,17 @@ class MatrixImageFile extends MatrixFile { | ||||||
|       required String name, |       required String name, | ||||||
|       int maxDimension = 1600, |       int maxDimension = 1600, | ||||||
|       String? mimeType, |       String? mimeType, | ||||||
|  |       MatrixImageFileResizedResponse? Function(MatrixImageFileResizeArguments)? | ||||||
|  |           customImageResizer, | ||||||
|       Future<T> Function<T, U>(FutureOr<T> Function(U arg) function, U arg)? |       Future<T> Function<T, U>(FutureOr<T> Function(U arg) function, U arg)? | ||||||
|           compute}) async { |           compute}) async { | ||||||
|     final arguments = _ResizeArguments( |     final arguments = MatrixImageFileResizeArguments( | ||||||
|       bytes: bytes, |       bytes: bytes, | ||||||
|       maxDimension: maxDimension, |       maxDimension: maxDimension, | ||||||
|       fileName: name, |       fileName: name, | ||||||
|       calcBlurhash: true, |       calcBlurhash: true, | ||||||
|     ); |     ); | ||||||
|  |     customImageResizer ??= _resize; | ||||||
|     final resizedData = compute != null |     final resizedData = compute != null | ||||||
|         ? await compute(_resize, arguments) |         ? await compute(_resize, arguments) | ||||||
|         : _resize(arguments); |         : _resize(arguments); | ||||||
|  | @ -154,6 +157,8 @@ class MatrixImageFile extends MatrixFile { | ||||||
|   /// computes a thumbnail for the image |   /// computes a thumbnail for the image | ||||||
|   Future<MatrixImageFile?> generateThumbnail( |   Future<MatrixImageFile?> generateThumbnail( | ||||||
|       {int dimension = Client.defaultThumbnailSize, |       {int dimension = Client.defaultThumbnailSize, | ||||||
|  |       MatrixImageFileResizedResponse? Function(MatrixImageFileResizeArguments)? | ||||||
|  |           customImageResizer, | ||||||
|       Future<T> Function<T, U>(FutureOr<T> Function(U arg) function, U arg)? |       Future<T> Function<T, U>(FutureOr<T> Function(U arg) function, U arg)? | ||||||
|           compute}) async { |           compute}) async { | ||||||
|     final thumbnailFile = await shrink( |     final thumbnailFile = await shrink( | ||||||
|  | @ -162,6 +167,7 @@ class MatrixImageFile extends MatrixFile { | ||||||
|       mimeType: mimeType, |       mimeType: mimeType, | ||||||
|       compute: compute, |       compute: compute, | ||||||
|       maxDimension: dimension, |       maxDimension: dimension, | ||||||
|  |       customImageResizer: customImageResizer, | ||||||
|     ); |     ); | ||||||
|     // the thumbnail should rather return null than the unshrinked image |     // the thumbnail should rather return null than the unshrinked image | ||||||
|     if ((thumbnailFile.width ?? 0) > dimension || |     if ((thumbnailFile.width ?? 0) > dimension || | ||||||
|  | @ -171,11 +177,11 @@ class MatrixImageFile extends MatrixFile { | ||||||
|     return thumbnailFile; |     return thumbnailFile; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static _ResizedResponse? _calcMetadata(Uint8List bytes) { |   static MatrixImageFileResizedResponse? _calcMetadata(Uint8List bytes) { | ||||||
|     final image = decodeImage(bytes); |     final image = decodeImage(bytes); | ||||||
|     if (image == null) return null; |     if (image == null) return null; | ||||||
| 
 | 
 | ||||||
|     return _ResizedResponse( |     return MatrixImageFileResizedResponse( | ||||||
|       bytes: bytes, |       bytes: bytes, | ||||||
|       width: image.width, |       width: image.width, | ||||||
|       height: image.height, |       height: image.height, | ||||||
|  | @ -187,7 +193,8 @@ class MatrixImageFile extends MatrixFile { | ||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   static _ResizedResponse? _resize(_ResizeArguments arguments) { |   static MatrixImageFileResizedResponse? _resize( | ||||||
|  |       MatrixImageFileResizeArguments arguments) { | ||||||
|     final image = decodeImage(arguments.bytes); |     final image = decodeImage(arguments.bytes); | ||||||
| 
 | 
 | ||||||
|     final resized = copyResize(image!, |     final resized = copyResize(image!, | ||||||
|  | @ -197,7 +204,7 @@ class MatrixImageFile extends MatrixFile { | ||||||
|     final encoded = encodeNamedImage(resized, arguments.fileName); |     final encoded = encodeNamedImage(resized, arguments.fileName); | ||||||
|     if (encoded == null) return null; |     if (encoded == null) return null; | ||||||
|     final bytes = Uint8List.fromList(encoded); |     final bytes = Uint8List.fromList(encoded); | ||||||
|     return _ResizedResponse( |     return MatrixImageFileResizedResponse( | ||||||
|       bytes: bytes, |       bytes: bytes, | ||||||
|       width: resized.width, |       width: resized.width, | ||||||
|       height: resized.height, |       height: resized.height, | ||||||
|  | @ -212,13 +219,13 @@ class MatrixImageFile extends MatrixFile { | ||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class _ResizedResponse { | class MatrixImageFileResizedResponse { | ||||||
|   final Uint8List bytes; |   final Uint8List bytes; | ||||||
|   final int width; |   final int width; | ||||||
|   final int height; |   final int height; | ||||||
|   final String? blurhash; |   final String? blurhash; | ||||||
| 
 | 
 | ||||||
|   const _ResizedResponse({ |   const MatrixImageFileResizedResponse({ | ||||||
|     required this.bytes, |     required this.bytes, | ||||||
|     required this.width, |     required this.width, | ||||||
|     required this.height, |     required this.height, | ||||||
|  | @ -226,13 +233,13 @@ class _ResizedResponse { | ||||||
|   }); |   }); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class _ResizeArguments { | class MatrixImageFileResizeArguments { | ||||||
|   final Uint8List bytes; |   final Uint8List bytes; | ||||||
|   final int maxDimension; |   final int maxDimension; | ||||||
|   final String fileName; |   final String fileName; | ||||||
|   final bool calcBlurhash; |   final bool calcBlurhash; | ||||||
| 
 | 
 | ||||||
|   const _ResizeArguments({ |   const MatrixImageFileResizeArguments({ | ||||||
|     required this.bytes, |     required this.bytes, | ||||||
|     required this.maxDimension, |     required this.maxDimension, | ||||||
|     required this.fileName, |     required this.fileName, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue