Prechádzať zdrojové kódy

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.
Karol Kosek 2 rokov pred
rodič
commit
5478409025
1 zmenil súbory, kde vykonal 26 pridanie a 14 odobranie
  1. 26 14
      Userland/Libraries/LibGfx/Bitmap.cpp

+ 26 - 14
Userland/Libraries/LibGfx/Bitmap.cpp

@@ -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)
 {
     if (scale_factor > 1 && path.starts_with("/res/"sv)) {
-        LexicalPath lexical_path { path };
-        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 fd = TRY(Core::System::open(highdpi_icon_string, O_RDONLY));
-
-        auto bitmap = TRY(try_load_from_fd_and_close(fd, highdpi_icon_string));
-        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");
-        bitmap->m_size.set_width(bitmap->width() / scale_factor);
-        bitmap->m_size.set_height(bitmap->height() / scale_factor);
-        bitmap->m_scale = scale_factor;
-        return bitmap;
+        auto load_scaled_bitmap = [](StringView path, int scale_factor) -> ErrorOr<NonnullRefPtr<Bitmap>> {
+            LexicalPath lexical_path { path };
+            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 fd = TRY(Core::System::open(highdpi_icon_string, O_RDONLY));
+
+            auto bitmap = TRY(try_load_from_fd_and_close(fd, highdpi_icon_string));
+            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");
+            bitmap->m_size.set_width(bitmap->width() / scale_factor);
+            bitmap->m_size.set_height(bitmap->height() / scale_factor);
+            bitmap->m_scale = scale_factor;
+            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));