From 1e4abf1d4c711217c54859d7374ab81625e2c7ca Mon Sep 17 00:00:00 2001 From: Bruce Evans Date: Fri, 19 Apr 2019 20:29:49 +0000 Subject: [PATCH] Fix copying of overlapping bitmaps. The cases of copying within the screen bitmap and within a single MEMBUF were broken when first source line is before the first destination line and the sub-bitmaps overlap. The fix just copies horizontal lines in reverse order when the first source line is before the first destination line. This switches directions unnecessarily in some cases, but the switch is about as fast as doing a precise detection of overlaps. When the first lines are the same, there can be undetected overlap in the horizontal direction. The old code already handles this mostly accidentally by using bcopy() for MEMBUFs and by copying through a temporary buffer for the screen bitmap although the latter is sub-optimal in direct modes. --- lib/libvgl/bitmap.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/libvgl/bitmap.c b/lib/libvgl/bitmap.c index c5af0c645259..76e206ac56c0 100644 --- a/lib/libvgl/bitmap.c +++ b/lib/libvgl/bitmap.c @@ -269,7 +269,7 @@ int __VGLBitmapCopy(VGLBitmap *src, int srcx, int srcy, VGLBitmap *dst, int dstx, int dsty, int width, int hight) { - int srcline, dstline; + int srcline, dstline, yend, yextra, ystep; if (srcx>src->VXsize || srcy>src->VYsize || dstx>dst->VXsize || dsty>dst->VYsize) @@ -296,8 +296,17 @@ __VGLBitmapCopy(VGLBitmap *src, int srcx, int srcy, hight=dst->VYsize-dsty; if (width < 0 || hight < 0) return -1; + yend = srcy + hight; + yextra = 0; + ystep = 1; + if (src->Bitmap == dst->Bitmap && srcy < dsty) { + yend = srcy; + yextra = hight - 1; + ystep = -1; + } if (src->Type == MEMBUF) { - for (srcline=srcy, dstline=dsty; srclineBitmap+(srcline*src->VXsize+srcx)*dst->PixelBytes); } @@ -319,7 +328,8 @@ __VGLBitmapCopy(VGLBitmap *src, int srcx, int srcy, } else { p = buffer; } - for (srcline=srcy, dstline=dsty; srcline