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);