diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2020-02-29 22:04:02 +0100 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2020-03-07 19:22:47 +0100 |
commit | 01b3f327df2dc30d847bd335ccce12eaec2dfd39 (patch) | |
tree | b78689ed59c6a5b4438e9f6f8e21d395c78061e1 /plugingui/window.cc | |
parent | a65278c7bc9c0dbca8a74db09fd0aebf1c26ef28 (diff) |
Move pixel buffer render code from Window to PixelBuffer for easier testing/benchmarking.
Diffstat (limited to 'plugingui/window.cc')
-rw-r--r-- | plugingui/window.cc | 136 |
1 files changed, 3 insertions, 133 deletions
diff --git a/plugingui/window.cc b/plugingui/window.cc index acde008..5e0ad31 100644 --- a/plugingui/window.cc +++ b/plugingui/window.cc @@ -250,144 +250,14 @@ bool Window::updateBuffer() return false; } - bool has_dirty_rect{false}; - Rect dirty_rect; - auto pixel_buffers = getPixelBuffers(); - for(auto& pixel_buffer : pixel_buffers) - { - if(pixel_buffer->dirty) - { - auto x1 = (std::size_t)pixel_buffer->x; - auto x2 = (std::size_t)(pixel_buffer->x + pixel_buffer->width); - auto y1 = (std::size_t)pixel_buffer->y; - auto y2 = (std::size_t)(pixel_buffer->y + pixel_buffer->height); - - pixel_buffer->dirty = false; - if(!has_dirty_rect) - { - // Insert this area: - dirty_rect = {x1, y1, x2, y2}; - has_dirty_rect = true; - } - else - { - // Expand existing area: - auto x1_0 = dirty_rect.x1; - auto y1_0 = dirty_rect.y1; - auto x2_0 = dirty_rect.x2; - auto y2_0 = dirty_rect.y2; - dirty_rect = { - (x1_0 < x1) ? x1_0 : x1, - (y1_0 < y1) ? y1_0 : y1, - (x2_0 > x2) ? x2_0 : x2, - (y2_0 > y2) ? y2_0 : y2 - }; - } - } - - if(pixel_buffer->has_last) - { - auto x1 = (std::size_t)pixel_buffer->last_x; - auto x2 = (std::size_t)(pixel_buffer->last_x + pixel_buffer->last_width); - auto y1 = (std::size_t)pixel_buffer->last_y; - auto y2 = (std::size_t)(pixel_buffer->last_y + pixel_buffer->last_height); - - pixel_buffer->has_last = false; - if(!has_dirty_rect) - { - // Insert this area: - dirty_rect = {x1, y1, x2, y2}; - has_dirty_rect = true; - } - else - { - // Expand existing area: - auto x1_0 = dirty_rect.x1; - auto y1_0 = dirty_rect.y1; - auto x2_0 = dirty_rect.x2; - auto y2_0 = dirty_rect.y2; - dirty_rect = { - (x1_0 < x1) ? x1_0 : x1, - (y1_0 < y1) ? y1_0 : y1, - (x2_0 > x2) ? x2_0 : x2, - (y2_0 > y2) ? y2_0 : y2 - }; - } - } - } - - if(!has_dirty_rect) - { - return false; - } - for(auto& pixel_buffer : pixel_buffers) - { - if(!pixel_buffer->visible) - { - continue; - } - - int update_width = pixel_buffer->width; - int update_height = pixel_buffer->height; - - // Skip buffer if not inside window. - if(((int)wpixbuf.width < pixel_buffer->x) || - ((int)wpixbuf.height < pixel_buffer->y)) - { - continue; - } - - if(update_width > ((int)wpixbuf.width - pixel_buffer->x)) - { - update_width = ((int)wpixbuf.width - pixel_buffer->x); - } - - if(update_height > ((int)wpixbuf.height - pixel_buffer->y)) - { - update_height = ((int)wpixbuf.height - pixel_buffer->y); - } - - auto from_x = (int)dirty_rect.x1 - pixel_buffer->x; - from_x = std::max(0, from_x); - auto from_y = (int)dirty_rect.y1 - pixel_buffer->y; - from_y = std::max(0, from_y); - - auto to_x = (int)dirty_rect.x2 - pixel_buffer->x; - to_x = std::min(to_x, (int)update_width); - auto to_y = (int)dirty_rect.y2 - pixel_buffer->y; - to_y = std::min(to_y, (int)update_height); - - if(to_x < from_x) - { - continue; - } - - for(int y = from_y; y < to_y; y++) - { - wpixbuf.writeLine(pixel_buffer->x + from_x, - pixel_buffer->y + y, - pixel_buffer->getLine(from_x, y), - to_x - from_x); - } - } + auto dirty_rect = wpixbuf.updateBuffer(pixel_buffers); - dirty_rect.x2 = std::min(wpixbuf.width, dirty_rect.x2); - dirty_rect.y2 = std::min(wpixbuf.height, dirty_rect.y2); - - // Make sure we don't try to paint a rect backwards. - if(dirty_rect.x1 > dirty_rect.x2) + if(!dirty_rect.empty()) { - std::swap(dirty_rect.x1, dirty_rect.x2); + native->redraw(dirty_rect); } - - if(dirty_rect.y1 > dirty_rect.y2) - { - std::swap(dirty_rect.y1, dirty_rect.y2); - } - - native->redraw(dirty_rect); needs_redraw = false; return true; |