From b5e1240a8a53b99be29492b6f0136f6f4d71d9a0 Mon Sep 17 00:00:00 2001 From: tron Date: Sat, 13 Nov 2004 16:10:25 +0000 Subject: (svn r564) Simplify scroll logic and correct one erroneous use of memcpy() --- gfx.c | 41 +++++++++++++++-------------------------- 1 file changed, 15 insertions(+), 26 deletions(-) (limited to 'gfx.c') diff --git a/gfx.c b/gfx.c index aa208b7fc..449f5aa1a 100644 --- a/gfx.c +++ b/gfx.c @@ -44,9 +44,9 @@ void GfxScroll(int left, int top, int width, int height, int xo, int yo) { p = _screen.pitch; - if (yo > 0 || (yo == 0 && xo > 0)) { + if (yo > 0) { // Calculate pointers - dst = _screen.dst_ptr + (top+height-1) * p + (left+width-1); + dst = _screen.dst_ptr + (top + height - 1) * p + left; src = dst - yo * p; // Decrease height and increase top @@ -56,31 +56,21 @@ void GfxScroll(int left, int top, int width, int height, int xo, int yo) { // Adjust left & width if (xo >= 0) { + dst += xo; left += xo; - src -= xo; width -= xo; } else { - dst += xo; + src -= xo; width += xo; } - // Offset pointers to fit into the memmove call - dst += -width + 1; - src += -width + 1; - ht = height; - - do { - memmove(dst, src, width); + for (ht = height; ht > 0; --ht) { + memcpy(dst, src, width); src -= p; dst -= p; - } while (--ht); - - - // This part of the screen is now dirty. - _video_driver->make_dirty(left, top, width, height); - + } } else { - // Calculate pointers to mem. + // Calculate pointers dst = _screen.dst_ptr + top * p + left; src = dst - yo * p; @@ -98,17 +88,16 @@ void GfxScroll(int left, int top, int width, int height, int xo, int yo) { width += xo; } - ht = height; - - do { - memcpy(dst, src, width); + // the y-displacement may be 0 therefore we have to use memmove, + // because source and destination may overlap + for (ht = height; ht > 0; --ht) { + memmove(dst, src, width); src += p; dst += p; - } while (--ht); - - // This part of the screen is now dirty. - _video_driver->make_dirty(left, top, width, height); + } } + // This part of the screen is now dirty. + _video_driver->make_dirty(left, top, width, height); } -- cgit v1.2.3-54-g00ecf