diff options
author | Pierre Ossman <ossman@cendio.se> | 2017-01-02 19:49:52 +0100 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2017-02-10 17:05:20 +0100 |
commit | 3d74d88806d09f3a899be5d8f1df8ec20ed9a14d (patch) | |
tree | a2a86607aa8dda47559c5be82fadad9247844193 /vncviewer/Surface_Win32.cxx | |
parent | 403ac27d2377df4fed8bf5039125f6d89aaa6955 (diff) | |
download | tigervnc-3d74d88806d09f3a899be5d8f1df8ec20ed9a14d.tar.gz tigervnc-3d74d88806d09f3a899be5d8f1df8ec20ed9a14d.zip |
Render on a temporary surface when needed
Some platforms draw directly to the screen, which means that updates
will flicker if we draw multiple layers. Prevent this by first
composing the update on a hidden surface.
Diffstat (limited to 'vncviewer/Surface_Win32.cxx')
-rw-r--r-- | vncviewer/Surface_Win32.cxx | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/vncviewer/Surface_Win32.cxx b/vncviewer/Surface_Win32.cxx index 5a9a6546..5eea2d1d 100644 --- a/vncviewer/Surface_Win32.cxx +++ b/vncviewer/Surface_Win32.cxx @@ -70,6 +70,25 @@ void Surface::draw(int src_x, int src_y, int x, int y, int w, int h) DeleteDC(dc); } +void Surface::draw(Surface* dst, int src_x, int src_y, int x, int y, int w, int h) +{ + HDC origdc, dstdc; + + dstdc = CreateCompatibleDC(NULL); + if (!dstdc) + throw rdr::SystemException("CreateCompatibleDC", GetLastError()); + + if (!SelectObject(dstdc, dst->bitmap)) + throw rdr::SystemException("SelectObject", GetLastError()); + + origdc = fl_gc; + fl_gc = dstdc; + draw(src_x, src_y, x, y, w, h); + fl_gc = origdc; + + DeleteDC(dstdc); +} + void Surface::alloc() { BITMAPINFOHEADER bih; |