diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-06-15 10:33:18 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-06-15 10:33:18 -0700 |
commit | c2c6f4c7ab40356f1138a3f4d8f06464373ad50b (patch) | |
tree | 9369a4da0497b7eb70470d4e30ec65e9a611c793 /shell | |
parent | b9fea696871aece599c4ec25ec01ee0c2c00513b (diff) | |
download | mu-c2c6f4c7ab40356f1138a3f4d8f06464373ad50b.tar.gz |
flickerlessly render fake screens in environment
Font rendering now happens off the real screen, which provides the effect of double-buffering. Apps can now also use convert-graphemes-to-pixels for more traditional double-buffering.
Diffstat (limited to 'shell')
-rw-r--r-- | shell/evaluate.mu | 2 | ||||
-rw-r--r-- | shell/sandbox.mu | 42 |
2 files changed, 10 insertions, 34 deletions
diff --git a/shell/evaluate.mu b/shell/evaluate.mu index 70cd544d..e976e279 100644 --- a/shell/evaluate.mu +++ b/shell/evaluate.mu @@ -34,7 +34,7 @@ fn evaluate _in-ah: (addr handle cell), _out-ah: (addr handle cell), env-h: (han var screen-obj/eax: (addr screen) <- lookup *screen-obj-ah compare screen-obj, 0 break-if-= - var y/ecx: int <- render-screen 0/screen, screen-obj, 0x58/xmin, 2/ymin + render-screen 0/screen, screen-obj, 0x58/xmin, 2/ymin var key/eax: byte <- read-key 0/keyboard compare key, 0 break-if-= diff --git a/shell/sandbox.mu b/shell/sandbox.mu index 1b6cd61e..a6b3453c 100644 --- a/shell/sandbox.mu +++ b/shell/sandbox.mu @@ -124,7 +124,7 @@ fn render-sandbox screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: var dummy/eax: int <- draw-stream-rightward screen, value, x2, xmax, y, 7/fg=grey, 0xc5/bg=blue-bg } y <- add 2 # padding - y <- maybe-render-screen screen, self, xmin, y + maybe-render-screen screen, self, xmin, y } fn render-sandbox-menu screen: (addr screen), _self: (addr sandbox) { @@ -195,20 +195,20 @@ fn maybe-render-empty-screen screen: (addr screen), _self: (addr sandbox), xmin: return y } -fn maybe-render-screen screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: int -> _/ecx: int { +fn maybe-render-screen screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: int { var self/esi: (addr sandbox) <- copy _self var screen-obj-cell-ah/eax: (addr handle cell) <- get self, screen-var var screen-obj-cell/eax: (addr cell) <- lookup *screen-obj-cell-ah compare screen-obj-cell, 0 { break-if-!= - return ymin + return } var screen-obj-cell-type/ecx: (addr int) <- get screen-obj-cell, type compare *screen-obj-cell-type, 5/screen { break-if-= - return ymin # silently give up on rendering the screen + return # silently give up on rendering the screen } var screen-obj-ah/eax: (addr handle screen) <- get screen-obj-cell, screen-data var _screen-obj/eax: (addr screen) <- lookup *screen-obj-ah @@ -217,15 +217,14 @@ fn maybe-render-screen screen: (addr screen), _self: (addr sandbox), xmin: int, var screen-empty?/eax: boolean <- fake-screen-empty? screen-obj compare screen-empty?, 0/false break-if-= - return ymin + return } var x/eax: int <- draw-text-rightward screen, "screen: ", xmin, 0x99/xmax, ymin, 0x17/fg, 0xc5/bg=blue-bg x <- copy xmin x <- add 2 var y/ecx: int <- copy ymin y <- increment - y <- render-screen screen, screen-obj, x, y - return y + render-screen screen, screen-obj, x, y } fn render-empty-screen screen: (addr screen), _target-screen: (addr screen), xmin: int, ymin: int -> _/ecx: int { @@ -255,32 +254,10 @@ fn render-empty-screen screen: (addr screen), _target-screen: (addr screen), xmi return screen-y } -fn render-screen screen: (addr screen), _target-screen: (addr screen), xmin: int, ymin: int -> _/ecx: int { +fn render-screen screen: (addr screen), _target-screen: (addr screen), xmin: int, ymin: int { var target-screen/esi: (addr screen) <- copy _target-screen - var screen-y/edi: int <- copy ymin - # text data - { - var height/edx: (addr int) <- get target-screen, height - var y/ecx: int <- copy 0 - { - compare y, *height - break-if->= - set-cursor-position screen, xmin, screen-y - var width/edx: (addr int) <- get target-screen, width - var x/ebx: int <- copy 0 - { - compare x, *width - break-if->= - print-screen-cell-of-fake-screen screen, target-screen, x, y - move-cursor-right screen - x <- increment - loop - } - y <- increment - screen-y <- increment - loop - } - } + convert-graphemes-to-pixels target-screen # might overwrite existing pixel data with graphemes + # overlapping the two is not supported # pixel data { # screen top left pixels x y width height @@ -331,7 +308,6 @@ fn render-screen screen: (addr screen), _target-screen: (addr screen), xmin: int loop } } - return screen-y } fn has-keyboard? _self: (addr sandbox) -> _/eax: boolean { |