diff --git a/Libraries/LibDraw/GraphicsBitmap.cpp b/Libraries/LibDraw/GraphicsBitmap.cpp index 7941b0a338..736f9702d6 100644 --- a/Libraries/LibDraw/GraphicsBitmap.cpp +++ b/Libraries/LibDraw/GraphicsBitmap.cpp @@ -77,6 +77,16 @@ GraphicsBitmap::GraphicsBitmap(Format format, NonnullRefPtr&& shar ASSERT(format != Format::Indexed8); } +NonnullRefPtr GraphicsBitmap::to_shareable_bitmap() const +{ + if (m_shared_buffer) + return *this; + auto buffer = SharedBuffer::create_with_size(size_in_bytes()); + auto bitmap = GraphicsBitmap::create_with_shared_buffer(m_format, *buffer, m_size); + memcpy(buffer->data(), scanline(0), size_in_bytes()); + return bitmap; +} + GraphicsBitmap::~GraphicsBitmap() { if (m_needs_munmap) { diff --git a/Libraries/LibDraw/GraphicsBitmap.h b/Libraries/LibDraw/GraphicsBitmap.h index 9d09058384..47371ca02f 100644 --- a/Libraries/LibDraw/GraphicsBitmap.h +++ b/Libraries/LibDraw/GraphicsBitmap.h @@ -3,10 +3,10 @@ #include "Color.h" #include "Rect.h" #include "Size.h" -#include #include #include #include +#include #include #include @@ -24,6 +24,9 @@ public: static RefPtr load_from_file(const StringView& path); static RefPtr load_from_file(Format, const StringView& path, const Size&); static NonnullRefPtr create_with_shared_buffer(Format, NonnullRefPtr&&, const Size&); + + NonnullRefPtr to_shareable_bitmap() const; + ~GraphicsBitmap(); RGBA32* scanline(int y); @@ -39,6 +42,9 @@ public: size_t pitch() const { return m_pitch; } int shared_buffer_id() const { return m_shared_buffer ? m_shared_buffer->shared_buffer_id() : -1; } + SharedBuffer* shared_buffer() { return m_shared_buffer.ptr(); } + const SharedBuffer* shared_buffer() const { return m_shared_buffer.ptr(); } + unsigned bpp() const { switch (m_format) { @@ -157,7 +163,7 @@ inline Color GraphicsBitmap::get_pixel(int x, int y) const return get_pixel(x, y); default: ASSERT_NOT_REACHED(); - return { }; + return {}; } }