diff --git a/src/conio/bitmap_con.c b/src/conio/bitmap_con.c index aebe65b22100ae3f2cf51ac65acae5c48c1e3239..61cf7cea2e63f4a094794d295b8e69c7459db9c5 100644 --- a/src/conio/bitmap_con.c +++ b/src/conio/bitmap_con.c @@ -1773,14 +1773,16 @@ int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour) do_rwlock_unlock(&vstatlock); return 0; } - int off = vmem_cell_offset(vstat.vmem, xchar, ychar); - if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { - pthread_mutex_unlock(&screenlock); - bitmap_draw_from_vmem(xchar + 1, ychar + 1, xchar + 1, ychar + 1); - pthread_mutex_lock(&screenlock); + if (xchar < vstat.cols && ychar < vstat.rows) { + int off = vmem_cell_offset(vstat.vmem, xchar, ychar); + if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { + pthread_mutex_unlock(&screenlock); + bitmap_draw_from_vmem(xchar + 1, ychar + 1, xchar + 1, ychar + 1); + pthread_mutex_lock(&screenlock); + } + vstat.vmem->vmem[off].bg |= 0x04000000; + bitmap_drawn[off].bg |= 0x04000000; } - vstat.vmem->vmem[off].bg |= 0x04000000; - bitmap_drawn[off].bg |= 0x04000000; if (x < screena.screenwidth && y < screena.screenheight) { if (screena.rect->data[pixel_offset(&screena, x, y)] != colour) { screena.update_pixels = 1; @@ -1847,35 +1849,42 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ bool xupdated = false; bool yupdated = false; int off; + int crows = vstat.rows * vstat.charheight; + int ccols = vstat.cols * vstat.charwidth; for (y = sy; y <= ey; y++) { - charx = charsx; pos = pixels->width*(y-sy+y_off)+x_off; - if (!yupdated) { + bool in_text_area = y < crows; + if (in_text_area && !yupdated) { + charx = charsx; off = vmem_cell_offset(vstat.vmem, charx, chary); } if (mask == NULL) { for (x = sx; x <= ex; x++) { - if (!yupdated) { - if (!xupdated) { - if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { - pthread_mutex_unlock(&screenlock); - bitmap_draw_from_vmem(charx + 1, chary + 1, charx + 1, chary + 1); - pthread_mutex_lock(&screenlock); + if (x >= ccols) + in_text_area = false; + if (in_text_area) { + if (!yupdated) { + if (!xupdated) { + if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { + pthread_mutex_unlock(&screenlock); + bitmap_draw_from_vmem(charx + 1, chary + 1, charx + 1, chary + 1); + pthread_mutex_lock(&screenlock); + } + if (vstat.vmem && vstat.vmem->vmem) { + vstat.vmem->vmem[off].bg |= 0x04000000; + } + if (bitmap_drawn) { + bitmap_drawn[off].bg |= 0x04000000; + } + xupdated = true; } - if (vstat.vmem && vstat.vmem->vmem) { - vstat.vmem->vmem[off].bg |= 0x04000000; - } - if (bitmap_drawn) { - bitmap_drawn[off].bg |= 0x04000000; - } - xupdated = true; } - } - if (++cpx >= vstat.charwidth) { - cpx = 0; - charx++; - xupdated = false; - off = vmem_next_offset(vstat.vmem, off); + if (++cpx >= vstat.charwidth) { + cpx = 0; + charx++; + xupdated = false; + off = vmem_next_offset(vstat.vmem, off); + } } if (screena.rect->data[pixel_offset(&screena, x, y)] != pixels->pixels[pos]) { screena.rect->data[pixel_offset(&screena, x, y)] = pixels->pixels[pos]; @@ -1899,27 +1908,31 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ else { mpos = mask->width * (y - sy + my_off) + mx_off; for (x = sx; x <= ex; x++) { - if (!yupdated) { - if (!xupdated) { - if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { - pthread_mutex_unlock(&screenlock); - bitmap_draw_from_vmem(charx + 1, chary + 1, charx + 1, chary + 1); - pthread_mutex_lock(&screenlock); + if (x >= ccols) + in_text_area = false; + if (in_text_area) { + if (!yupdated) { + if (!xupdated) { + if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { + pthread_mutex_unlock(&screenlock); + bitmap_draw_from_vmem(charx + 1, chary + 1, charx + 1, chary + 1); + pthread_mutex_lock(&screenlock); + } + if (vstat.vmem && vstat.vmem->vmem) { + vstat.vmem->vmem[off].bg |= 0x04000000; + } + if (bitmap_drawn) { + bitmap_drawn[off].bg |= 0x04000000; + } + xupdated = true; } - if (vstat.vmem && vstat.vmem->vmem) { - vstat.vmem->vmem[off].bg |= 0x04000000; - } - if (bitmap_drawn) { - bitmap_drawn[off].bg |= 0x04000000; - } - xupdated = true; } - } - if (++cpx >= vstat.charwidth) { - cpx = 0; - charx++; - xupdated = false; - off = vmem_next_offset(vstat.vmem, off); + if (++cpx >= vstat.charwidth) { + cpx = 0; + charx++; + xupdated = false; + off = vmem_next_offset(vstat.vmem, off); + } } mask_byte = mpos / 8; mask_bit = mpos % 8; @@ -1946,15 +1959,17 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ mpos++; } } - cpy++; - if (cpy >= vstat.charheight) { - chary++; - cpy = 0; - yupdated = false; - xupdated = false; + if (y < crows) { + cpy++; + if (cpy >= vstat.charheight) { + chary++; + cpy = 0; + yupdated = false; + xupdated = false; + } + else + yupdated = true; } - else - yupdated = true; } pthread_mutex_unlock(&screenlock); do_rwlock_unlock(&vstatlock);