forked from Bananymous/banan-os
LibGUI: cleanup Window::shift_vertical and add copy_horizontal_slice
This commit is contained in:
parent
11a4e4faa2
commit
82e6a3582d
|
@ -135,14 +135,53 @@ namespace LibGUI
|
||||||
draw_character(text[i], font, tl_x + (int32_t)(i * font.width()), tl_y, color);
|
draw_character(text[i], font, tl_x + (int32_t)(i * font.width()), tl_y, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::shift_vertical(int32_t amount)
|
void Window::shift_vertical(int32_t amount, uint32_t fill_color)
|
||||||
{
|
{
|
||||||
uint32_t amount_abs = BAN::Math::abs(amount);
|
const uint32_t amount_abs = BAN::Math::abs(amount);
|
||||||
if (amount_abs == 0 || amount_abs >= height())
|
if (amount_abs == 0 || amount_abs >= height())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
uint32_t* dst = (amount > 0) ? m_framebuffer.data() + width() * amount_abs : m_framebuffer.data();
|
uint32_t* dst = (amount > 0) ? m_framebuffer.data() + width() * amount_abs : m_framebuffer.data();
|
||||||
uint32_t* src = (amount < 0) ? m_framebuffer.data() + width() * amount_abs : m_framebuffer.data();
|
uint32_t* src = (amount < 0) ? m_framebuffer.data() + width() * amount_abs : m_framebuffer.data();
|
||||||
memmove(dst, src, width() * (height() - amount_abs) * 4);
|
memmove(dst, src, width() * (height() - amount_abs) * 4);
|
||||||
|
|
||||||
|
const uint32_t y_lo = (amount < 0) ? height() - amount_abs : 0;
|
||||||
|
const uint32_t y_hi = (amount < 0) ? height() : amount_abs;
|
||||||
|
for (uint32_t y = y_lo; y < y_hi; y++)
|
||||||
|
for (uint32_t x = 0; x < width(); x++)
|
||||||
|
set_pixel(x, y, fill_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::copy_horizontal_slice(int32_t dst_y, int32_t src_y, uint32_t uamount, uint32_t fill_color)
|
||||||
|
{
|
||||||
|
int32_t amount = uamount;
|
||||||
|
if (dst_y < 0)
|
||||||
|
{
|
||||||
|
amount -= -dst_y;
|
||||||
|
src_y += -dst_y;
|
||||||
|
dst_y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
amount = BAN::Math::min<int32_t>(amount, height() - dst_y);
|
||||||
|
if (amount <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const uint32_t copy_src_y = BAN::Math::clamp<int32_t>(src_y, 0, height());
|
||||||
|
const int32_t copy_amount = BAN::Math::clamp<int32_t>(src_y + amount, 0, height()) - copy_src_y;
|
||||||
|
if (copy_amount > 0)
|
||||||
|
{
|
||||||
|
memmove(
|
||||||
|
&m_framebuffer[width() * (dst_y + (copy_src_y - src_y))],
|
||||||
|
&m_framebuffer[width() * copy_src_y],
|
||||||
|
copy_amount * width() * 4
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint32_t fill_y_off = (src_y < copy_src_y) ? 0 : copy_amount;
|
||||||
|
const uint32_t fill_amount = amount - copy_amount;
|
||||||
|
for (uint32_t i = 0; i < fill_amount; i++)
|
||||||
|
for (uint32_t x = 0; x < width(); x++)
|
||||||
|
set_pixel(x, dst_y + fill_y_off + i, fill_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Window::clamp_to_framebuffer(int32_t& signed_x, int32_t& signed_y, uint32_t& width, uint32_t& height) const
|
bool Window::clamp_to_framebuffer(int32_t& signed_x, int32_t& signed_y, uint32_t& width, uint32_t& height) const
|
||||||
|
|
|
@ -125,7 +125,13 @@ namespace LibGUI
|
||||||
void draw_character(uint32_t codepoint, const LibFont::Font& font, int32_t x, int32_t y, uint32_t color);
|
void draw_character(uint32_t codepoint, const LibFont::Font& font, int32_t x, int32_t y, uint32_t color);
|
||||||
void draw_text(BAN::StringView text, const LibFont::Font& font, int32_t x, int32_t y, uint32_t color);
|
void draw_text(BAN::StringView text, const LibFont::Font& font, int32_t x, int32_t y, uint32_t color);
|
||||||
|
|
||||||
void shift_vertical(int32_t amount);
|
// shift whole vertically by amount pixels, sign determines the direction
|
||||||
|
// fill_color is used to fill "new" data
|
||||||
|
void shift_vertical(int32_t amount, uint32_t fill_color);
|
||||||
|
|
||||||
|
// copy horizontal slice [src_y, src_y + amount[ to [dst_y, dst_y + amount[
|
||||||
|
// 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);
|
||||||
|
|
||||||
bool invalidate(int32_t x, int32_t y, uint32_t width, uint32_t height);
|
bool invalidate(int32_t x, int32_t y, uint32_t width, uint32_t height);
|
||||||
bool invalidate() { return invalidate(0, 0, width(), height()); }
|
bool invalidate() { return invalidate(0, 0, width(), height()); }
|
||||||
|
|
|
@ -239,8 +239,7 @@ bool Terminal::read_shell()
|
||||||
{
|
{
|
||||||
const uint32_t scroll = m_cursor.y + newline_count - rows() + 1;
|
const uint32_t scroll = m_cursor.y + newline_count - rows() + 1;
|
||||||
m_cursor.y -= scroll;
|
m_cursor.y -= scroll;
|
||||||
m_window->shift_vertical(-scroll * (int32_t)m_font.height());
|
m_window->shift_vertical(-scroll * (int32_t)m_font.height(), m_bg_color);
|
||||||
m_window->fill_rect(0, m_window->height() - scroll * m_font.height(), m_window->width(), scroll * m_font.height(), m_bg_color);
|
|
||||||
should_invalidate = { 0, 0, m_window->width(), m_window->height() };
|
should_invalidate = { 0, 0, m_window->width(), m_window->height() };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,8 +521,7 @@ Rectangle Terminal::putchar(uint8_t ch)
|
||||||
{
|
{
|
||||||
const uint32_t scroll = m_cursor.y - rows() + 1;
|
const uint32_t scroll = m_cursor.y - rows() + 1;
|
||||||
m_cursor.y -= scroll;
|
m_cursor.y -= scroll;
|
||||||
m_window->shift_vertical(-scroll * (int32_t)m_font.height());
|
m_window->shift_vertical(-scroll * (int32_t)m_font.height(), m_bg_color);
|
||||||
m_window->fill_rect(0, m_window->height() - scroll * m_font.height(), m_window->width(), scroll * m_font.height(), m_bg_color);
|
|
||||||
should_invalidate = { 0, 0, m_window->width(), m_window->height() };
|
should_invalidate = { 0, 0, m_window->width(), m_window->height() };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue