mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 18:57:34 +00:00
LibGfx: Fallback to a default scaled bitmap if the upscaled one failed
This makes cursors in a 2x Display Scale without a special upscaled version (such as a Hand cursor) display the 1x version instead.
This commit is contained in:
parent
406dff16d1
commit
5478409025
1 changed files with 24 additions and 12 deletions
|
@ -105,20 +105,32 @@ ErrorOr<NonnullRefPtr<Bitmap>> Bitmap::try_create_wrapper(BitmapFormat format, I
|
||||||
ErrorOr<NonnullRefPtr<Bitmap>> Bitmap::try_load_from_file(StringView path, int scale_factor)
|
ErrorOr<NonnullRefPtr<Bitmap>> Bitmap::try_load_from_file(StringView path, int scale_factor)
|
||||||
{
|
{
|
||||||
if (scale_factor > 1 && path.starts_with("/res/"sv)) {
|
if (scale_factor > 1 && path.starts_with("/res/"sv)) {
|
||||||
LexicalPath lexical_path { path };
|
auto load_scaled_bitmap = [](StringView path, int scale_factor) -> ErrorOr<NonnullRefPtr<Bitmap>> {
|
||||||
StringBuilder highdpi_icon_path;
|
LexicalPath lexical_path { path };
|
||||||
TRY(highdpi_icon_path.try_appendff("{}/{}-{}x.{}", lexical_path.dirname(), lexical_path.title(), scale_factor, lexical_path.extension()));
|
StringBuilder highdpi_icon_path;
|
||||||
|
TRY(highdpi_icon_path.try_appendff("{}/{}-{}x.{}", lexical_path.dirname(), lexical_path.title(), scale_factor, lexical_path.extension()));
|
||||||
|
|
||||||
auto highdpi_icon_string = highdpi_icon_path.string_view();
|
auto highdpi_icon_string = highdpi_icon_path.string_view();
|
||||||
auto fd = TRY(Core::System::open(highdpi_icon_string, O_RDONLY));
|
auto fd = TRY(Core::System::open(highdpi_icon_string, O_RDONLY));
|
||||||
|
|
||||||
auto bitmap = TRY(try_load_from_fd_and_close(fd, highdpi_icon_string));
|
auto bitmap = TRY(try_load_from_fd_and_close(fd, highdpi_icon_string));
|
||||||
if (bitmap->width() % scale_factor != 0 || bitmap->height() % scale_factor != 0)
|
if (bitmap->width() % scale_factor != 0 || bitmap->height() % scale_factor != 0)
|
||||||
return Error::from_string_literal("Bitmap::try_load_from_file: HighDPI image size should be divisible by scale factor");
|
return Error::from_string_literal("Bitmap::try_load_from_file: HighDPI image size should be divisible by scale factor");
|
||||||
bitmap->m_size.set_width(bitmap->width() / scale_factor);
|
bitmap->m_size.set_width(bitmap->width() / scale_factor);
|
||||||
bitmap->m_size.set_height(bitmap->height() / scale_factor);
|
bitmap->m_size.set_height(bitmap->height() / scale_factor);
|
||||||
bitmap->m_scale = scale_factor;
|
bitmap->m_scale = scale_factor;
|
||||||
return bitmap;
|
return bitmap;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto scaled_bitmap_or_error = load_scaled_bitmap(path, scale_factor);
|
||||||
|
if (!scaled_bitmap_or_error.is_error())
|
||||||
|
return scaled_bitmap_or_error.release_value();
|
||||||
|
|
||||||
|
auto error = scaled_bitmap_or_error.release_error();
|
||||||
|
if (!(error.is_syscall() && error.code() == ENOENT)) {
|
||||||
|
dbgln("Couldn't load scaled bitmap: {}", error);
|
||||||
|
dbgln("Trying base scale instead.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto fd = TRY(Core::System::open(path, O_RDONLY));
|
auto fd = TRY(Core::System::open(path, O_RDONLY));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue