support unused screen-cells in fake screens

We'll need this when rendering 16-bit glyphs. They'll occupy two
8x16 display units on screen, but the grapheme is a single unit as far
as fake screens are concerned.
This commit is contained in:
Kartik K. Agaram 2021-08-28 22:01:26 -07:00
parent 2c51a46455
commit 3640f1dfe9
2 changed files with 31 additions and 0 deletions

View File

@ -28,6 +28,7 @@ type screen-cell {
data: grapheme
color: int
background-color: int
unused?: boolean
}
fn initialize-screen _screen: (addr screen), width: int, height: int, pixel-graphics?: boolean {
@ -424,6 +425,24 @@ fn clear-rect-on-real-screen xmin: int, ymin: int, xmax: int, ymax: int, backgro
}
}
fn screen-cell-unused-at? _screen: (addr screen), x: int, y: int -> _/eax: boolean {
var screen/esi: (addr screen) <- copy _screen
var index/ecx: int <- screen-cell-index screen, x, y
var result/eax: boolean <- screen-cell-unused-at-index? screen, index
return result
}
fn screen-cell-unused-at-index? _screen: (addr screen), _index: int -> _/eax: boolean {
var screen/esi: (addr screen) <- copy _screen
var data-ah/eax: (addr handle array screen-cell) <- get screen, data
var data/eax: (addr array screen-cell) <- lookup *data-ah
var index/ecx: int <- copy _index
var offset/ecx: (offset screen-cell) <- compute-offset data, index
var cell/eax: (addr screen-cell) <- index data, offset
var src/eax: (addr boolean) <- get cell, unused?
return *src
}
fn screen-grapheme-at _screen: (addr screen), x: int, y: int -> _/eax: grapheme {
var screen/esi: (addr screen) <- copy _screen
var index/ecx: int <- screen-cell-index screen, x, y

View File

@ -21,6 +21,9 @@ fn check-screen-row-from _screen: (addr screen), x: int, y: int, expected: (addr
compare done?, 0
break-if-!=
{
var unused?/eax: boolean <- screen-cell-unused-at-index? screen, index
compare unused?, 0/false
break-if-!=
var _g/eax: grapheme <- screen-grapheme-at-index screen, index
var g/ebx: grapheme <- copy _g
var expected-grapheme/eax: grapheme <- read-grapheme e-addr
@ -86,6 +89,9 @@ fn check-screen-row-in-color-from _screen: (addr screen), fg: int, y: int, x: in
compare done?, 0
break-if-!=
{
var unused?/eax: boolean <- screen-cell-unused-at-index? screen, index
compare unused?, 0/false
break-if-!=
var _g/eax: grapheme <- screen-grapheme-at-index screen, index
var g/ebx: grapheme <- copy _g
var _expected-grapheme/eax: grapheme <- read-grapheme e-addr
@ -179,6 +185,9 @@ fn check-screen-row-in-background-color-from _screen: (addr screen), bg: int, y:
compare done?, 0
break-if-!=
{
var unused?/eax: boolean <- screen-cell-unused-at-index? screen, index
compare unused?, 0/false
break-if-!=
var _g/eax: grapheme <- screen-grapheme-at-index screen, index
var g/ebx: grapheme <- copy _g
var _expected-grapheme/eax: grapheme <- read-grapheme e-addr
@ -277,6 +286,9 @@ fn check-background-color-in-screen-row-from _screen: (addr screen), bg: int, y:
compare done?, 0
break-if-!=
{
var unused?/eax: boolean <- screen-cell-unused-at-index? screen, index
compare unused?, 0/false
break-if-!=
var _expected-bit/eax: grapheme <- read-grapheme e-addr
var expected-bit/edi: grapheme <- copy _expected-bit
$check-background-color-in-screen-row-from:compare-cells: {