Improve lobby sleeve icon downscaling#10952
Open
MostCromulent wants to merge 3 commits into
Open
Conversation
The lobby panel drew the full 360x500 sleeve source straight into a 58x80 label, a ~6x single-pass reduction that looked aliased and rough. Route the three icon-set sites through a helper that pre-scales once via the cached area-averaging resize() at 2x the label size, leaving HiDPI headroom. The scaled image is cached per sleeve, so the heavy downscale runs once rather than on every repaint. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tool4ever
requested changes
Jun 11, 2026
tool4ever
left a comment
Contributor
There was a problem hiding this comment.
This seems wrong since FLabel already has some own logic for it:
maybe the current iconScaleFactor would be a better approach?
FLabel's background-icon paint path is the correct place for this fix — it's where the scaling happens — but it was never adapted for large icons: it draws the full-resolution source straight to the label in a single bicubic pass, which aliases when the source is far larger than the draw size (e.g. a 360x500 card-back sleeve in a ~58x80 lobby label). The previous fix sidestepped that at the call site by pre-scaling the sleeve before handing it to the label; drop that bespoke workaround and fix the path itself. When a background icon's source exceeds 3x its draw size, pre-scale it once with area-averaging (cached, grow-only so resizing can't re-trigger it) and let the existing bicubic finish. The sleeves are currently the only icons this affects — every other background icon has a source at or near its draw size and stays on the original path unchanged. iconScaleFactor is not an alternative: it only changes the size the icon is drawn at, not the interpolation, so it can't address aliasing. The background path draws at device resolution, so the fix belongs there. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…by-sleeve-quality # Conflicts: # forge-gui-desktop/src/main/java/forge/toolbox/FLabel.java
Contributor
Author
|
Tested a few different approaches using FLabel; it seems none of the existing paths are adapted for a downscale of this size and all resulted in same aliasing problem. I thought most elegant solution was to just incorporate logic into the FLabel background icon painter so that where you have a very large downscale it applies the area-averaging. AI audited the call sites and currently the sleeves are the only case that hits this threshold. This should fix issue for any future cases though. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Minor polish for #10929
The lobby panel drew the full 360x500 sleeve source straight into a 58x80 label, a ~6x single-pass reduction that looked aliased and rough. Instead, scale via area-averaging resize() at 2x the label size. This looks much smoother at small icon size and avoids aliasing.
The scaled image is cached so the downscale runs once rather than on every repaint.
🤖 Generated with Claude Code