diff --git a/Libraries/LibGfx/Bitmap.cpp b/Libraries/LibGfx/Bitmap.cpp index 5756451c3fa..57cf9dcf901 100644 --- a/Libraries/LibGfx/Bitmap.cpp +++ b/Libraries/LibGfx/Bitmap.cpp @@ -98,6 +98,19 @@ RefPtr Bitmap::create_purgeable(BitmapFormat format, const IntSize& size return adopt(*new Bitmap(format, size, Purgeable::Yes, backing_store.value())); } +RefPtr Bitmap::create_shareable(BitmapFormat format, const IntSize& size) +{ + if (size_would_overflow(format, size)) + return nullptr; + + const auto pitch = minimum_pitch(size.width(), format); + const auto data_size = size_in_bytes(pitch, size.height()); + auto shared_buffer = SharedBuffer::create_with_size(data_size); + if (!shared_buffer) + return nullptr; + return adopt(*new Bitmap(format, shared_buffer.release_nonnull(), size, Vector())); +} + Bitmap::Bitmap(BitmapFormat format, const IntSize& size, Purgeable purgeable, const BackingStore& backing_store) : m_size(size) , m_data(backing_store.data) diff --git a/Libraries/LibGfx/Bitmap.h b/Libraries/LibGfx/Bitmap.h index ee9a9887345..4d0b236f577 100644 --- a/Libraries/LibGfx/Bitmap.h +++ b/Libraries/LibGfx/Bitmap.h @@ -89,6 +89,7 @@ enum RotationDirection { class Bitmap : public RefCounted { public: static RefPtr create(BitmapFormat, const IntSize&); + static RefPtr create_shareable(BitmapFormat, const IntSize&); static RefPtr create_purgeable(BitmapFormat, const IntSize&); static RefPtr create_wrapper(BitmapFormat, const IntSize&, size_t pitch, void*); static RefPtr load_from_file(const StringView& path);