diff --git a/CHANGELOG.md b/CHANGELOG.md
index f93cdfced..35e66284d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,7 @@ All notable changes to this project will be documented in this file.
- storage volume setup despite faulty volume on Android <11
- storage volume setup when launched right after device boot
- tiling PNG images
+- widget image sizing in some cases
## [v1.6.11] - 2022-07-26
diff --git a/lib/model/settings/enums/widget_shape.dart b/lib/model/settings/enums/widget_shape.dart
index a0975a797..19374bfed 100644
--- a/lib/model/settings/enums/widget_shape.dart
+++ b/lib/model/settings/enums/widget_shape.dart
@@ -1,3 +1,4 @@
+import 'package:aves/model/entry.dart';
import 'package:aves/model/settings/enums/enums.dart';
import 'package:flutter/material.dart';
@@ -32,13 +33,29 @@ extension ExtraWidgetShape on WidgetShape {
}
}
- Size size(Size widgetSize) {
+ double extentPx(Size widgetSizePx, AvesEntry entry) {
switch (this) {
case WidgetShape.rrect:
- return widgetSize;
+ final entryRatio = entry.displayAspectRatio;
+ final widgetRatio = widgetSizePx.width / widgetSizePx.height;
+ if (entryRatio > 1) {
+ // landscape entry, must return thumbnail height as extent
+ if (widgetRatio > entryRatio) {
+ return widgetSizePx.width / entryRatio;
+ } else {
+ return widgetSizePx.height;
+ }
+ } else {
+ // portrait entry, must return thumbnail width as extent
+ if (widgetRatio > entryRatio) {
+ return widgetSizePx.width;
+ } else {
+ return widgetSizePx.height * entryRatio;
+ }
+ }
case WidgetShape.circle:
case WidgetShape.heart:
- return Size.square(widgetSize.shortestSide);
+ return widgetSizePx.shortestSide;
}
}
}
diff --git a/lib/widgets/home_widget.dart b/lib/widgets/home_widget.dart
index 2d8625112..95256f867 100644
--- a/lib/widgets/home_widget.dart
+++ b/lib/widgets/home_widget.dart
@@ -33,7 +33,13 @@ class HomeWidgetPainter {
ui.ImageByteFormat format = ui.ImageByteFormat.rawRgba,
}) async {
final widgetSizePx = Size(widthPx.toDouble(), heightPx.toDouble());
- final entryImage = await _getEntryImage(entry, shape.size(widgetSizePx));
+ late final ui.Image? entryImage;
+ if (entry != null) {
+ final extent = shape.extentPx(widgetSizePx, entry!) / devicePixelRatio;
+ entryImage = await _getEntryImage(entry, extent);
+ } else {
+ entryImage = null;
+ }
final recorder = ui.PictureRecorder();
final rect = Rect.fromLTWH(0, 0, widgetSizePx.width, widgetSizePx.height);
@@ -63,10 +69,10 @@ class HomeWidgetPainter {
..strokeCap = StrokeCap.round);
}
- FutureOr _getEntryImage(AvesEntry? entry, Size sizePx) async {
+ FutureOr _getEntryImage(AvesEntry? entry, double extent) async {
if (entry == null) return null;
- final provider = entry.getThumbnail(extent: sizePx.longestSide / devicePixelRatio);
+ final provider = entry.getThumbnail(extent: extent);
final imageInfoCompleter = Completer();
final imageStream = provider.resolve(ImageConfiguration.empty);