LibGUI: Add copy_rect API
This allows moving parts of window around
This commit is contained in:
parent
88abbd90dc
commit
3ca0ef1583
|
@ -211,6 +211,27 @@ namespace LibGUI
|
|||
set_pixel(x, dst_y + fill_y_off + i, fill_color);
|
||||
}
|
||||
|
||||
void Window::copy_rect(int32_t dst_x, int32_t dst_y, int32_t src_x, int32_t src_y, uint32_t width, uint32_t height, uint32_t fill_color)
|
||||
{
|
||||
fill_rect(dst_x, dst_y, width, height, fill_color);
|
||||
|
||||
if (!clamp_to_framebuffer(dst_x, dst_y, width, height))
|
||||
return;
|
||||
if (!clamp_to_framebuffer(src_x, src_y, width, height))
|
||||
return;
|
||||
|
||||
const bool copy_dir = dst_y < src_y;
|
||||
for (uint32_t i = 0; i < height; i++)
|
||||
{
|
||||
const uint32_t y_off = copy_dir ? i : height - i - 1;
|
||||
memmove(
|
||||
&m_framebuffer[(dst_y + y_off) * this->width()],
|
||||
&m_framebuffer[(src_y + y_off) * this->width()],
|
||||
width * 4
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
bool Window::clamp_to_framebuffer(int32_t& signed_x, int32_t& signed_y, uint32_t& width, uint32_t& height) const
|
||||
{
|
||||
int32_t min_x = BAN::Math::max<int32_t>(signed_x, 0);
|
||||
|
|
|
@ -59,6 +59,10 @@ namespace LibGUI
|
|||
// fill_color is used when copying data outside of window bounds
|
||||
void copy_horizontal_slice(int32_t dst_y, int32_t src_y, uint32_t amount, uint32_t fill_color);
|
||||
|
||||
// copy rect (src_x, src_y, width, height) to (dst_x, dst_y, width, height)
|
||||
// fill_color is used when copying data outside of window bounds
|
||||
void copy_rect(int32_t dst_x, int32_t dst_y, int32_t src_x, int32_t src_y, uint32_t width, uint32_t height, uint32_t fill_color);
|
||||
|
||||
void invalidate(int32_t x, int32_t y, uint32_t width, uint32_t height);
|
||||
void invalidate() { return invalidate(0, 0, width(), height()); }
|
||||
|
||||
|
|
Loading…
Reference in New Issue