diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-07-10 19:56:32 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-07-10 19:56:32 -0700 |
commit | b28a31315ebdfa1e781e9d58b5aee9c8a9260d66 (patch) | |
tree | 7fb74188a13632bc7b6a39291ab70d69fc56d386 | |
parent | 3420f10f183f0707ab9b3797f65a7748d840a659 (diff) | |
download | mu-b28a31315ebdfa1e781e9d58b5aee9c8a9260d66.tar.gz |
increase precision for dithering computations
Now we get a perfect checkerboard pattern.
-rw-r--r-- | img.mu | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/img.mu b/img.mu index fa98fd6d..eab6a04a 100644 --- a/img.mu +++ b/img.mu @@ -407,10 +407,12 @@ fn _unordered-monochrome-dither src: (addr array byte), width: int, height: int, var error/ebx: int <- _read-buffer buf, x, y, width $_unordered-monochrome-dither:update-error: { var curr/eax: byte <- _read-byte-buffer src, x, y, width - error <- add curr + var curr-int/eax: int <- copy curr + curr-int <- shift-left 0x10 # we have 32 bits; we'll use 16 bits for the fraction and leave 8 for unanticipated overflow + error <- add curr-int #? psd "e", error, 5/fg, x, y #? draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, error, 7/fg 0/bg - compare error, 0x80 + compare error, 0x800000 { break-if->= #? psd "p", 0, 0x14/fg, x, y @@ -419,7 +421,7 @@ fn _unordered-monochrome-dither src: (addr array byte), width: int, height: int, } #? psd "p", 1, 0xf/fg, x, y _write-byte-buffer dest, x, y, width, 1/white - error <- subtract 0xff + error <- subtract 0xff0000 } _diffuse-monochrome-dithering-errors buf, x, y, width, height, error #? { @@ -491,6 +493,9 @@ fn psd s: (addr array byte), d: int, fg: int, x: int, y: int { # one of pure black or white pixels. # # https://tannerhelland.com/2012/12/28/dithering-eleven-algorithms-source-code.html +# +# Error is currently a fixed-point number with 16-bit fraction. But +# interestingly this function doesn't care about that. fn _diffuse-monochrome-dithering-errors buf: (addr array int), x: int, y: int, width: int, height: int, error: int { { compare error, 0 |