From 70372ba8bd5377d05d475f6d29285a62038ecec9 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Tue, 17 Aug 1999 17:47:14 +0000 Subject: [PATCH] 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. --- ChangeLog | 7 +++++++ ChangeLog.pre-2-0 | 7 +++++++ ChangeLog.pre-2-10 | 7 +++++++ ChangeLog.pre-2-2 | 7 +++++++ ChangeLog.pre-2-4 | 7 +++++++ ChangeLog.pre-2-6 | 7 +++++++ ChangeLog.pre-2-8 | 7 +++++++ gdk/win32/gdkdraw.c | 21 +++++++++++++++++++++ gdk/win32/gdkdrawable-win32.c | 21 +++++++++++++++++++++ 9 files changed, 91 insertions(+) diff --git a/ChangeLog b/ChangeLog index eeac15447..34d8d34fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +1999-08-17 Tor Lillqvist + + * 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. + 1999-08-16 Tor Lillqvist * gdk/win32/gdkdraw.c (gdk_draw_arc): Fix start and end radial diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index eeac15447..34d8d34fe 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,10 @@ +1999-08-17 Tor Lillqvist + + * 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. + 1999-08-16 Tor Lillqvist * gdk/win32/gdkdraw.c (gdk_draw_arc): Fix start and end radial diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index eeac15447..34d8d34fe 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,10 @@ +1999-08-17 Tor Lillqvist + + * 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. + 1999-08-16 Tor Lillqvist * gdk/win32/gdkdraw.c (gdk_draw_arc): Fix start and end radial diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index eeac15447..34d8d34fe 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,10 @@ +1999-08-17 Tor Lillqvist + + * 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. + 1999-08-16 Tor Lillqvist * gdk/win32/gdkdraw.c (gdk_draw_arc): Fix start and end radial diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index eeac15447..34d8d34fe 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,10 @@ +1999-08-17 Tor Lillqvist + + * 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. + 1999-08-16 Tor Lillqvist * gdk/win32/gdkdraw.c (gdk_draw_arc): Fix start and end radial diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index eeac15447..34d8d34fe 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,10 @@ +1999-08-17 Tor Lillqvist + + * 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. + 1999-08-16 Tor Lillqvist * gdk/win32/gdkdraw.c (gdk_draw_arc): Fix start and end radial diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index eeac15447..34d8d34fe 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,10 @@ +1999-08-17 Tor Lillqvist + + * 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. + 1999-08-16 Tor Lillqvist * gdk/win32/gdkdraw.c (gdk_draw_arc): Fix start and end radial diff --git a/gdk/win32/gdkdraw.c b/gdk/win32/gdkdraw.c index 8cc0c4b7c..80abf7bcc 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 + * 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 8cc0c4b7c..80abf7bcc 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 + * 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); } -- 2.43.2