Skip to content
Snippets Groups Projects
Commit 9986c9a0 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Properly handle 91-column EGA mode.

There's six pixels at the bottom that aren't part of text, and three
pixels on the right.

Don't touch the vmem when those pixels are updated... vmem can't
update them.

Should fix assertion in Abdul's Armor in RIP mode reported by DigitalMan
on IRC.
parent 33b125ea
No related branches found
No related tags found
No related merge requests found
Pipeline #7867 passed
...@@ -1773,14 +1773,16 @@ int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour) ...@@ -1773,14 +1773,16 @@ int bitmap_setpixel(uint32_t x, uint32_t y, uint32_t colour)
do_rwlock_unlock(&vstatlock); do_rwlock_unlock(&vstatlock);
return 0; return 0;
} }
int off = vmem_cell_offset(vstat.vmem, xchar, ychar); if (xchar < vstat.cols && ychar < vstat.rows) {
if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { int off = vmem_cell_offset(vstat.vmem, xchar, ychar);
pthread_mutex_unlock(&screenlock); if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) {
bitmap_draw_from_vmem(xchar + 1, ychar + 1, xchar + 1, ychar + 1); pthread_mutex_unlock(&screenlock);
pthread_mutex_lock(&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 (x < screena.screenwidth && y < screena.screenheight) {
if (screena.rect->data[pixel_offset(&screena, x, y)] != colour) { if (screena.rect->data[pixel_offset(&screena, x, y)] != colour) {
screena.update_pixels = 1; screena.update_pixels = 1;
...@@ -1847,35 +1849,42 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_ ...@@ -1847,35 +1849,42 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_
bool xupdated = false; bool xupdated = false;
bool yupdated = false; bool yupdated = false;
int off; int off;
int crows = vstat.rows * vstat.charheight;
int ccols = vstat.cols * vstat.charwidth;
for (y = sy; y <= ey; y++) { for (y = sy; y <= ey; y++) {
charx = charsx;
pos = pixels->width*(y-sy+y_off)+x_off; 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); off = vmem_cell_offset(vstat.vmem, charx, chary);
} }
if (mask == NULL) { if (mask == NULL) {
for (x = sx; x <= ex; x++) { for (x = sx; x <= ex; x++) {
if (!yupdated) { if (x >= ccols)
if (!xupdated) { in_text_area = false;
if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { if (in_text_area) {
pthread_mutex_unlock(&screenlock); if (!yupdated) {
bitmap_draw_from_vmem(charx + 1, chary + 1, charx + 1, chary + 1); if (!xupdated) {
pthread_mutex_lock(&screenlock); 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) {
if (++cpx >= vstat.charwidth) { cpx = 0;
cpx = 0; charx++;
charx++; xupdated = false;
xupdated = false; off = vmem_next_offset(vstat.vmem, off);
off = vmem_next_offset(vstat.vmem, off); }
} }
if (screena.rect->data[pixel_offset(&screena, x, y)] != pixels->pixels[pos]) { if (screena.rect->data[pixel_offset(&screena, x, y)] != pixels->pixels[pos]) {
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_ ...@@ -1899,27 +1908,31 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_
else { else {
mpos = mask->width * (y - sy + my_off) + mx_off; mpos = mask->width * (y - sy + my_off) + mx_off;
for (x = sx; x <= ex; x++) { for (x = sx; x <= ex; x++) {
if (!yupdated) { if (x >= ccols)
if (!xupdated) { in_text_area = false;
if (!same_cell(&bitmap_drawn[off], &vstat.vmem->vmem[off])) { if (in_text_area) {
pthread_mutex_unlock(&screenlock); if (!yupdated) {
bitmap_draw_from_vmem(charx + 1, chary + 1, charx + 1, chary + 1); if (!xupdated) {
pthread_mutex_lock(&screenlock); 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) {
if (++cpx >= vstat.charwidth) { cpx = 0;
cpx = 0; charx++;
charx++; xupdated = false;
xupdated = false; off = vmem_next_offset(vstat.vmem, off);
off = vmem_next_offset(vstat.vmem, off); }
} }
mask_byte = mpos / 8; mask_byte = mpos / 8;
mask_bit = 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_ ...@@ -1946,15 +1959,17 @@ int bitmap_setpixels(uint32_t sx, uint32_t sy, uint32_t ex, uint32_t ey, uint32_
mpos++; mpos++;
} }
} }
cpy++; if (y < crows) {
if (cpy >= vstat.charheight) { cpy++;
chary++; if (cpy >= vstat.charheight) {
cpy = 0; chary++;
yupdated = false; cpy = 0;
xupdated = false; yupdated = false;
xupdated = false;
}
else
yupdated = true;
} }
else
yupdated = true;
} }
pthread_mutex_unlock(&screenlock); pthread_mutex_unlock(&screenlock);
do_rwlock_unlock(&vstatlock); do_rwlock_unlock(&vstatlock);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment