diff options
| author | Bent Bisballe Nyeng <deva@aasimon.org> | 2017-02-17 11:40:42 +0100 | 
|---|---|---|
| committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2017-02-17 12:20:41 +0100 | 
| commit | baed7f32c7608532012a90804629b54e2d8c6f81 (patch) | |
| tree | c218982608661185c7d4da0194de701c115d60c8 /plugingui | |
| parent | 35730491ef90528be367b5c59261ec82984b50e0 (diff) | |
Partial rendering for win32 backend.
Diffstat (limited to 'plugingui')
| -rw-r--r-- | plugingui/nativewindow_win32.cc | 39 | 
1 files changed, 27 insertions, 12 deletions
| diff --git a/plugingui/nativewindow_win32.cc b/plugingui/nativewindow_win32.cc index dce14cc..75d523d 100644 --- a/plugingui/nativewindow_win32.cc +++ b/plugingui/nativewindow_win32.cc @@ -27,6 +27,7 @@  #include "nativewindow_win32.h"  #include <cstring> +#include <algorithm>  #include "window.h" @@ -222,11 +223,14 @@ LRESULT CALLBACK NativeWindowWin32::dialogProc(HWND hwnd, UINT msg,  	case WM_PAINT:  		{ +			RECT rect; +			GetUpdateRect(hwnd, &rect, FALSE); +  			auto repaintEvent = std::make_shared<RepaintEvent>(); -			repaintEvent->x = 0; -			repaintEvent->y = 0; -			repaintEvent->width = 100; -			repaintEvent->height = 100; +			repaintEvent->x = rect.left; +			repaintEvent->y = rect.top; +			repaintEvent->width = rect.right - rect.left; +			repaintEvent->height = rect.bottom - rect.top;  			native->event_queue.push_back(repaintEvent);  			// Move to window.h (in class) @@ -256,22 +260,27 @@ LRESULT CALLBACK NativeWindowWin32::dialogProc(HWND hwnd, UINT msg,  				DeleteDC(hDC);  			} +			int from_x = rect.left; +			int to_x = std::min(rect.right, (long)px.width); +			int from_y = rect.top; +			int to_y = std::min(rect.bottom, (long)px.height);  			{ // Copy PixelBuffer to framebuffer -				int i, j, k; -				for(k = 0, i = 0; i < (int)px.height; ++i) +				int idx = 0; +				for(int y = from_y; y < to_y; ++y)  				{ -					for(j = 0; j < (int)px.width; ++j, ++k) +					for(int x = from_x; x < to_x; ++x)  					{ -						*(framebuf + k) = RGB(px.buf[(j + i * px.width) * 3 + 2], -						                      px.buf[(j + i * px.width) * 3 + 1], -						                      px.buf[(j + i * px.width) * 3 + 0]); +						*(framebuf + idx) = RGB(px.buf[(x + y * px.width) * 3 + 2], +						                        px.buf[(x + y * px.width) * 3 + 1], +						                        px.buf[(x + y * px.width) * 3 + 0]); +						++idx;  					}  				}  			}  			PAINTSTRUCT ps;  			HDC hdc = BeginPaint(native->m_hwnd, &ps); -			BitBlt(hdc, 0, 0, px.width, px.height, pDC, 0, 0, SRCCOPY); +			BitBlt(hdc, from_x, from_y, to_x, to_y, pDC, from_x, from_y, SRCCOPY);  			EndPaint(native->m_hwnd, &ps);  			{ // Destroy bitmap (move to window.cc) @@ -389,7 +398,13 @@ void NativeWindowWin32::redraw(const Rect& dirty_rect)  	// Send WM_PAINT message. Buffer transfering is handled in MessageHandler.  	if(parent_window == nullptr)  	{ -		RECT rect = {dirty_rect.x1, dirty_rect.y1, dirty_rect.x2, dirty_rect.y2 }; +		RECT rect = +			{ +				(long)dirty_rect.x1, +				(long)dirty_rect.y1, +				(long)dirty_rect.x2, +				(long)dirty_rect.y2 +			};  		RedrawWindow(m_hwnd, &rect, nullptr, RDW_INVALIDATE);  		UpdateWindow(m_hwnd);  	} | 
