aboutsummaryrefslogtreecommitdiffstats
path: root/vncviewer/Surface_Win32.cxx
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2017-01-02 19:49:52 +0100
committerPierre Ossman <ossman@cendio.se>2017-02-10 17:05:20 +0100
commit3d74d88806d09f3a899be5d8f1df8ec20ed9a14d (patch)
treea2a86607aa8dda47559c5be82fadad9247844193 /vncviewer/Surface_Win32.cxx
parent403ac27d2377df4fed8bf5039125f6d89aaa6955 (diff)
downloadtigervnc-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.cxx19
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;