diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index 444cdf88d79edb48cefa1f3b30573acdb381e45a..aebe65b22100ae3f2cf51ac65acae5c48c1e3239 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -1473,6 +1473,11 @@ bitmap_movetext_screen(int x, int y, int tox, int toy, int direction, int height int step; int32_t screeny; + int pheight = height * vstat.charheight; + int ptoy = (toy - 1) * vstat.charheight; + int py = (y - 1) * vstat.charheight; + int ptox = (tox - 1) * vstat.charwidth; + int px = (x - 1) * vstat.charwidth; pthread_mutex_lock(&screenlock); if (width == vstat.cols && (height > vstat.rows / 2) && toy == 1) { screena.toprow += (y - toy) * vstat.charheight; @@ -1486,6 +1491,7 @@ bitmap_movetext_screen(int x, int y, int tox, int toy, int direction, int height if (screena.toprow < 0) screena.toprow += screena.screenheight; + int yoff = toy - y; height = vstat.rows - height; toy = vstat.rows - (height - 1); // Fill the bits with impossible data so they're redrawn @@ -1494,22 +1500,34 @@ bitmap_movetext_screen(int x, int y, int tox, int toy, int direction, int height memset(&bitmap_drawn[bdoff], 0x04, sizeof(*bitmap_drawn) * vstat.cols); bdoff = vmem_next_row_offset(vstat.vmem, bdoff); } - pthread_mutex_unlock(&screenlock); - return; + if (vstat.charheight * vstat.rows == screena.screenheight) { + pthread_mutex_unlock(&screenlock); + return; + } + // Move stuff below the bottom row of text back + pheight = screena.screenheight - (vstat.charheight * vstat.rows); + ptoy = screena.screenheight - pheight; + py = ptoy + (yoff * vstat.charheight); + if (py < 0) + py += screena.screenheight; + if (py >= screena.screenheight) + py -= screena.screenheight; } int maxpos = screena.screenwidth * screena.screenheight; if (direction == -1) { - ssourcepos = ((y + height - 1) * vstat.charheight - 1) * vstat.scrnwidth + (x - 1) * vstat.charwidth; - sdestoffset = ((((toy + height - 1) * vstat.charheight - 1) * vstat.scrnwidth + (tox - 1) * vstat.charwidth) - ssourcepos); + ssourcepos = (py + pheight - 1) * vstat.scrnwidth + px; + sdestoffset = ((ptoy + pheight - 1) * vstat.scrnwidth + ptox) - ssourcepos; } else { - ssourcepos=(y - 1) * vstat.scrnwidth * vstat.charheight + (x - 1) * vstat.charwidth; - sdestoffset=(((toy - 1) * vstat.scrnwidth * vstat.charheight + (tox - 1) * vstat.charwidth) - ssourcepos); + ssourcepos = py * vstat.scrnwidth + px; + sdestoffset = (ptoy * vstat.scrnwidth + ptox) - ssourcepos; } ssourcepos += screena.toprow * screena.screenwidth; + if (ssourcepos >= maxpos) + ssourcepos -= maxpos; step = direction * vstat.scrnwidth; - for(screeny=0; screeny < height*vstat.charheight; screeny++) { + for(screeny=0; screeny < pheight; screeny++) { if (ssourcepos >= maxpos) ssourcepos -= maxpos; if (ssourcepos < 0) @@ -1830,11 +1848,11 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ bool yupdated = false; int off; for (y = sy; y <= ey; y++) { + charx = charsx; pos = pixels->width*(y-sy+y_off)+x_off; if (!yupdated) { off = vmem_cell_offset(vstat.vmem, charx, chary); } - charx = charsx; if (mask == NULL) { for (x = sx; x <= ex; x++) { if (!yupdated) { @@ -1930,6 +1948,7 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ } cpy++; if (cpy >= vstat.charheight) { + chary++; cpy = 0; yupdated = false; xupdated = false;