Break the tie in favour of smaller bitmaps at 1.5x factor

Prefer to use 1x bitmap to 2x one at 150% scaling, as it seems better to
use smaller (but still readable) bitmaps than overlarge ones in this
case.
This commit is contained in:
Vadim Zeitlin
2022-06-01 19:15:36 +01:00
parent 0b0e95296a
commit 30fb836136
2 changed files with 7 additions and 6 deletions

View File

@@ -721,10 +721,11 @@ wxBitmapBundleImpl::DoGetPreferredSize(double scaleTarget,
// Decide whether we should use this one or the previous smaller one
// depending on which of them is closer to the target size, breaking
// the tie in favour of the bigger size.
// the tie in favour of the smaller size as it's arguably better to use
// slightly smaller bitmaps than too big ones.
const double scaleLast = availableScales[i - 1];
scaleBest = scaleThis - scaleTarget <= scaleTarget - scaleLast
scaleBest = scaleThis - scaleTarget < scaleTarget - scaleLast
? scaleThis
: scaleLast;
break;
@@ -740,7 +741,7 @@ wxBitmapBundleImpl::DoGetPreferredSize(double scaleTarget,
// But check how far is it from the requested scale: if it's more than
// 1.5 times larger, we should still scale it, notably to ensure that
// bitmaps of standard size are scaled when 2x DPI scaling is used.
if ( scaleTarget >= 1.5*scaleMax )
if ( scaleTarget > 1.5*scaleMax )
{
// However scaling by non-integer scales doesn't work well at all, so
// round it to the closest integer in this case.

View File

@@ -69,10 +69,10 @@ TEST_CASE("BitmapBundle::GetPreferredSize", "[bmpbundle]")
CHECK( b.GetPreferredBitmapSizeAtScale(1 ) == normal );
CHECK( b.GetPreferredBitmapSizeAtScale(1.25) == normal );
CHECK( b.GetPreferredBitmapSizeAtScale(1.4 ) == normal );
CHECK( b.GetPreferredBitmapSizeAtScale(1.5 ) == normal );
// Once it becomes too big, we're going to need to scale, but we should be
// scaling by an integer factor.
CHECK( b.GetPreferredBitmapSizeAtScale(1.5 ) == bigger );
CHECK( b.GetPreferredBitmapSizeAtScale(1.75) == bigger );
CHECK( b.GetPreferredBitmapSizeAtScale(2 ) == bigger );
CHECK( b.GetPreferredBitmapSizeAtScale(2.25) == bigger );
@@ -88,14 +88,14 @@ TEST_CASE("BitmapBundle::GetPreferredSize", "[bmpbundle]")
CHECK( b.GetPreferredBitmapSizeAtScale(1 ) == normal );
CHECK( b.GetPreferredBitmapSizeAtScale(1.25) == normal );
CHECK( b.GetPreferredBitmapSizeAtScale(1.4 ) == normal );
CHECK( b.GetPreferredBitmapSizeAtScale(1.5 ) == bigger );
CHECK( b.GetPreferredBitmapSizeAtScale(1.5 ) == normal );
CHECK( b.GetPreferredBitmapSizeAtScale(1.75) == bigger );
CHECK( b.GetPreferredBitmapSizeAtScale(2 ) == bigger );
CHECK( b.GetPreferredBitmapSizeAtScale(2.5 ) == bigger );
CHECK( b.GetPreferredBitmapSizeAtScale(3 ) == bigger );
// This scale is too big to use any of the existing bitmaps, so they will
// be scaled, but use integer factors.
CHECK( b.GetPreferredBitmapSizeAtScale(3 ) == triple );
CHECK( b.GetPreferredBitmapSizeAtScale(3.33) == triple );
}