diff --git a/img.mu b/img.mu index 0f53eb03..879d00d3 100644 --- a/img.mu +++ b/img.mu @@ -16,6 +16,7 @@ fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) var img/esi: (addr image) <- address img-storage load-image img, data-disk render-image screen, img, 0x20/x 0x80/y, 0x100/width, 0x100/height + render-image screen, img, 0x320/x 0x280/y, 0x60/width=96, 0x1c/height=28 } fn load-image self: (addr image), data-disk: (addr disk) { @@ -238,42 +239,78 @@ fn render-image screen: (addr screen), _img: (addr image), xmin: int, ymin: int, fn render-pbm-image screen: (addr screen), _img: (addr image), xmin: int, ymin: int, width: int, height: int { var img/esi: (addr image) <- copy _img - var img-width-a/ecx: (addr int) <- get img, width - var data-ah/eax: (addr handle array byte) <- get img, data - var _data/eax: (addr array byte) <- lookup *data-ah - var data/esi: (addr array byte) <- copy _data - var y/edx: int <- copy ymin - var i/edi: int <- copy 0 - var max/eax: int <- length data + # yratio = height/img->height + var img-height-a/eax: (addr int) <- get img, height + var img-height/xmm0: float <- convert *img-height-a + var yratio/xmm1: float <- convert height + yratio <- divide img-height + # xratio = width/img->width + var img-width-a/eax: (addr int) <- get img, width + var img-width/ebx: int <- copy *img-width-a + var img-width-f/xmm0: float <- convert img-width + var xratio/xmm2: float <- convert width + xratio <- divide img-width-f + # esi = img->data + var img-data-ah/eax: (addr handle array byte) <- get img, data + var _img-data/eax: (addr array byte) <- lookup *img-data-ah + var img-data/esi: (addr array byte) <- copy _img-data + var len/edi: int <- length img-data + # + var one/eax: int <- copy 1 + var one-f/xmm3: float <- convert one + var width-f/xmm4: float <- convert width + var height-f/xmm5: float <- convert height + var zero/eax: int <- copy 0 + var zero-f/xmm0: float <- convert zero + var y/xmm6: float <- copy zero-f + set-cursor-position 0/screen, 0x20/x 0x20/y { - compare i, max - break-if->= - var x/ebx: int <- copy xmin - var img-x/eax: int <- copy 0 + compare y, height-f + break-if-float>= + var imgy-f/xmm5: float <- copy y + imgy-f <- divide yratio + var imgy/edx: int <- truncate imgy-f + var x/xmm7: float <- copy zero-f { - compare img-x, *img-width-a - break-if->= + compare x, width-f + break-if-float>= + var imgx-f/xmm5: float <- copy x + imgx-f <- divide xratio + var imgx/ecx: int <- truncate imgx-f + var idx/eax: int <- copy imgy { - var src-a/eax: (addr byte) <- index data, i - var src/eax: byte <- copy-byte *src-a - var src-int/eax: int <- copy src - compare src-int, 0/black - { - break-if-= - pixel screen, x, y, 0xf/white - } - compare src-int, 0/black - { - break-if-!= - pixel screen, x, y, 0/black - } + compare idx, 0 + break-if-<= + idx <- decrement + idx <- multiply img-width } - x <- increment - i <- increment - img-x <- increment + idx <- add imgx + # error info in case we rounded wrong and 'index' will fail bounds-check + compare idx, len + { + break-if-< + set-cursor-position 0/screen, 0x20/x 0x20/y + draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, imgx, 3/fg 0/bg + draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, imgy, 4/fg 0/bg + draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, idx, 5/fg 0/bg + } + var src/eax: (addr byte) <- index img-data, idx + var color/eax: byte <- copy-byte *src + var color-int/eax: int <- copy color + { + compare color-int, 0/black + break-if-= + color-int <- copy 0xf/white + } + var screenx/ecx: int <- convert x + screenx <- add xmin + var screeny/edx: int <- convert y + screeny <- add ymin + pixel screen, screenx, screeny, color-int + x <- add one-f loop } - y <- increment + y <- add one-f loop } }