summaryrefslogtreecommitdiff
path: root/gdk/win32
diff options
context:
space:
mode:
authorTor Lillqvist <tml@src.gnome.org>1999-08-17 17:47:14 +0000
committerTor Lillqvist <tml@src.gnome.org>1999-08-17 17:47:14 +0000
commit70372ba8bd5377d05d475f6d29285a62038ecec9 (patch)
tree3dbc19e560e526afd1455c59d07932f2dba3933c /gdk/win32
parentf29407afe85aa5409631a41785293368d0c5ac03 (diff)
downloadgtk+-70372ba8bd5377d05d475f6d29285a62038ecec9.tar.gz
When blitting inside one window, use ScrollWindowEx, and call
* gdk/win32/gdkdraw.c (gdk_draw_pixmap): When blitting inside one window, use ScrollWindowEx, and call UpdateWindow. This prevents bugs when for instance part of the window was outside the display. Thanks to Philippe Colantoni for finding and fixing this.
Diffstat (limited to 'gdk/win32')
-rw-r--r--gdk/win32/gdkdraw.c21
-rw-r--r--gdk/win32/gdkdrawable-win32.c21
2 files changed, 42 insertions, 0 deletions
diff --git a/gdk/win32/gdkdraw.c b/gdk/win32/gdkdraw.c
index 8cc0c4b7ce..80abf7bcc2 100644
--- a/gdk/win32/gdkdraw.c
+++ b/gdk/win32/gdkdraw.c
@@ -560,9 +560,30 @@ gdk_draw_pixmap (GdkDrawable *drawable,
if ((srcdc = GetDC (src_private->xwindow)) == NULL)
g_warning ("gdk_draw_pixmap: GetDC failed");
+#if 0
if (!BitBlt (hdc, xdest, ydest, width, height,
srcdc, xsrc, ysrc, SRCCOPY))
g_warning ("gdk_draw_pixmap: BitBlt failed");
+#else
+ /* If we are in fact just blitting inside one window,
+ * ScrollWindowEx works better.
+ * Thanks to Philippe Colantoni <colanton@aris.ss.uci.edu>
+ * for noticing and fixing this.
+ */
+ if (drawable_private->xwindow==src_private->xwindow)
+ {
+ if (!ScrollWindowEx (drawable_private->xwindow,-xsrc+xdest, -ysrc+ydest, NULL,
+ NULL, NULL, NULL, SW_INVALIDATE))
+ g_warning ("gdk_draw_pixmap: ScrollWindowEx failed");
+
+ if (!UpdateWindow (drawable_private->xwindow))
+ g_warning ("gdk_draw_pixmap: UpdateWindow failed");
+ }
+ else
+ if (!BitBlt (hdc, xdest, ydest, width, height,
+ srcdc, xsrc, ysrc, SRCCOPY))
+ g_warning ("gdk_draw_pixmap: BitBlt failed");
+#endif
ReleaseDC (src_private->xwindow, srcdc);
}
diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c
index 8cc0c4b7ce..80abf7bcc2 100644
--- a/gdk/win32/gdkdrawable-win32.c
+++ b/gdk/win32/gdkdrawable-win32.c
@@ -560,9 +560,30 @@ gdk_draw_pixmap (GdkDrawable *drawable,
if ((srcdc = GetDC (src_private->xwindow)) == NULL)
g_warning ("gdk_draw_pixmap: GetDC failed");
+#if 0
if (!BitBlt (hdc, xdest, ydest, width, height,
srcdc, xsrc, ysrc, SRCCOPY))
g_warning ("gdk_draw_pixmap: BitBlt failed");
+#else
+ /* If we are in fact just blitting inside one window,
+ * ScrollWindowEx works better.
+ * Thanks to Philippe Colantoni <colanton@aris.ss.uci.edu>
+ * for noticing and fixing this.
+ */
+ if (drawable_private->xwindow==src_private->xwindow)
+ {
+ if (!ScrollWindowEx (drawable_private->xwindow,-xsrc+xdest, -ysrc+ydest, NULL,
+ NULL, NULL, NULL, SW_INVALIDATE))
+ g_warning ("gdk_draw_pixmap: ScrollWindowEx failed");
+
+ if (!UpdateWindow (drawable_private->xwindow))
+ g_warning ("gdk_draw_pixmap: UpdateWindow failed");
+ }
+ else
+ if (!BitBlt (hdc, xdest, ydest, width, height,
+ srcdc, xsrc, ysrc, SRCCOPY))
+ g_warning ("gdk_draw_pixmap: BitBlt failed");
+#endif
ReleaseDC (src_private->xwindow, srcdc);
}