From f23f99d51b03b9cb2154b93d3c84269a2eb285b7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 6 Nov 2021 11:23:37 +0100 Subject: [PATCH] LibGfx: Use ErrorOr for Bitmap::try_create_with_anonymous_buffer() --- Userland/Libraries/LibGUI/Window.cpp | 6 +++--- Userland/Libraries/LibGfx/Bitmap.cpp | 16 ++++++++++------ Userland/Libraries/LibGfx/Bitmap.h | 2 +- Userland/Libraries/LibGfx/ShareableBitmap.cpp | 6 +++--- .../Services/WindowServer/ClientConnection.cpp | 7 +++++-- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index 67138b90ab..b94c51189a 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -869,13 +869,13 @@ OwnPtr Window::create_backing_store(const Gfx::IntSize& size } // FIXME: Plumb scale factor here eventually. - auto bitmap = Gfx::Bitmap::try_create_with_anonymous_buffer(format, buffer_or_error.release_value(), size, 1, {}); - if (!bitmap) { + auto bitmap_or_error = Gfx::Bitmap::try_create_with_anonymous_buffer(format, buffer_or_error.release_value(), size, 1, {}); + if (bitmap_or_error.is_error()) { VERIFY(size.width() <= INT16_MAX); VERIFY(size.height() <= INT16_MAX); return {}; } - return make(bitmap.release_nonnull()); + return make(bitmap_or_error.release_value()); } void Window::set_modal(bool modal) diff --git a/Userland/Libraries/LibGfx/Bitmap.cpp b/Userland/Libraries/LibGfx/Bitmap.cpp index b9677248f6..62ca400730 100644 --- a/Userland/Libraries/LibGfx/Bitmap.cpp +++ b/Userland/Libraries/LibGfx/Bitmap.cpp @@ -84,7 +84,10 @@ RefPtr Bitmap::try_create_shareable(BitmapFormat format, const IntSize& auto buffer_or_error = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(data_size, PAGE_SIZE)); if (buffer_or_error.is_error()) return nullptr; - return Bitmap::try_create_with_anonymous_buffer(format, buffer_or_error.release_value(), size, scale_factor, {}); + auto bitmap_or_error = Bitmap::try_create_with_anonymous_buffer(format, buffer_or_error.release_value(), size, scale_factor, {}); + if (bitmap_or_error.is_error()) + return nullptr; + return bitmap_or_error.release_value(); } Bitmap::Bitmap(BitmapFormat format, const IntSize& size, int scale_factor, const BackingStore& backing_store) @@ -221,12 +224,12 @@ static bool check_size(const IntSize& size, int scale_factor, BitmapFormat forma return true; } -RefPtr Bitmap::try_create_with_anonymous_buffer(BitmapFormat format, Core::AnonymousBuffer buffer, const IntSize& size, int scale_factor, const Vector& palette) +ErrorOr> Bitmap::try_create_with_anonymous_buffer(BitmapFormat format, Core::AnonymousBuffer buffer, const IntSize& size, int scale_factor, const Vector& palette) { if (size_would_overflow(format, size, scale_factor)) - return nullptr; + return Error::from_string_literal("Gfx::Bitmap::try_create_with_anonymous_buffer size overflow"); - return adopt_ref(*new Bitmap(format, move(buffer), size, scale_factor, palette)); + return adopt_nonnull_ref_or_enomem(new (nothrow) Bitmap(format, move(buffer), size, scale_factor, palette)); } /// Read a bitmap as described by: @@ -528,9 +531,10 @@ RefPtr Bitmap::to_bitmap_backed_by_anonymous_buffer() const auto buffer_or_error = Core::AnonymousBuffer::create_with_size(round_up_to_power_of_two(size_in_bytes(), PAGE_SIZE)); if (buffer_or_error.is_error()) return nullptr; - auto bitmap = Bitmap::try_create_with_anonymous_buffer(m_format, buffer_or_error.release_value(), size(), scale(), palette_to_vector()); - if (!bitmap) + auto bitmap_or_error = Bitmap::try_create_with_anonymous_buffer(m_format, buffer_or_error.release_value(), size(), scale(), palette_to_vector()); + if (bitmap_or_error.is_error()) return nullptr; + auto bitmap = bitmap_or_error.release_value(); memcpy(bitmap->scanline(0), scanline(0), size_in_bytes()); return bitmap; } diff --git a/Userland/Libraries/LibGfx/Bitmap.h b/Userland/Libraries/LibGfx/Bitmap.h index 3463cde71d..cc18f1b981 100644 --- a/Userland/Libraries/LibGfx/Bitmap.h +++ b/Userland/Libraries/LibGfx/Bitmap.h @@ -95,7 +95,7 @@ public: [[nodiscard]] static RefPtr try_create_wrapper(BitmapFormat, const IntSize&, int intrinsic_scale, size_t pitch, void*); [[nodiscard]] static RefPtr try_load_from_file(String const& path, int scale_factor = 1); [[nodiscard]] static RefPtr try_load_from_fd_and_close(int fd, String const& path, int scale_factor = 1); - [[nodiscard]] static RefPtr try_create_with_anonymous_buffer(BitmapFormat, Core::AnonymousBuffer, const IntSize&, int intrinsic_scale, const Vector& palette); + [[nodiscard]] static ErrorOr> try_create_with_anonymous_buffer(BitmapFormat, Core::AnonymousBuffer, IntSize const&, int intrinsic_scale, Vector const& palette); [[nodiscard]] static RefPtr try_create_from_serialized_byte_buffer(ByteBuffer&& buffer); static bool is_path_a_supported_image_format(const StringView& path) diff --git a/Userland/Libraries/LibGfx/ShareableBitmap.cpp b/Userland/Libraries/LibGfx/ShareableBitmap.cpp index 35358227a7..1b598dec53 100644 --- a/Userland/Libraries/LibGfx/ShareableBitmap.cpp +++ b/Userland/Libraries/LibGfx/ShareableBitmap.cpp @@ -76,10 +76,10 @@ bool decode(Decoder& decoder, Gfx::ShareableBitmap& shareable_bitmap) auto buffer_or_error = Core::AnonymousBuffer::create_from_anon_fd(anon_file.take_fd(), Gfx::Bitmap::size_in_bytes(Gfx::Bitmap::minimum_pitch(size.width(), bitmap_format), size.height())); if (buffer_or_error.is_error()) return false; - auto bitmap = Gfx::Bitmap::try_create_with_anonymous_buffer(bitmap_format, buffer_or_error.release_value(), size, scale, palette); - if (!bitmap) + auto bitmap_or_error = Gfx::Bitmap::try_create_with_anonymous_buffer(bitmap_format, buffer_or_error.release_value(), size, scale, palette); + if (bitmap_or_error.is_error()) return false; - shareable_bitmap = Gfx::ShareableBitmap { bitmap.release_nonnull(), Gfx::ShareableBitmap::ConstructWithKnownGoodBitmap }; + shareable_bitmap = Gfx::ShareableBitmap { bitmap_or_error.release_value(), Gfx::ShareableBitmap::ConstructWithKnownGoodBitmap }; return true; } diff --git a/Userland/Services/WindowServer/ClientConnection.cpp b/Userland/Services/WindowServer/ClientConnection.cpp index 74d902a723..9c17d1012c 100644 --- a/Userland/Services/WindowServer/ClientConnection.cpp +++ b/Userland/Services/WindowServer/ClientConnection.cpp @@ -640,13 +640,16 @@ void ClientConnection::set_window_backing_store(i32 window_id, [[maybe_unused]] did_misbehave("SetWindowBackingStore: Failed to create anonymous buffer for window backing store"); return; } - auto backing_store = Gfx::Bitmap::try_create_with_anonymous_buffer( + auto backing_store_or_error = Gfx::Bitmap::try_create_with_anonymous_buffer( has_alpha_channel ? Gfx::BitmapFormat::BGRA8888 : Gfx::BitmapFormat::BGRx8888, buffer_or_error.release_value(), size, 1, {}); - window.set_backing_store(move(backing_store), serial); + if (backing_store_or_error.is_error()) { + did_misbehave(""); + } + window.set_backing_store(backing_store_or_error.release_value(), serial); } if (flush_immediately)