From 169e021cc3658b62130415318977479ce7e8148a Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 13 Jul 2021 17:05:28 -0700 Subject: scaling the palette working on third attempt See commits b4e997adb8 and 2777479a94. This seems like a good sign that dithering is now extremely precise. --- img.mu | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'img.mu') diff --git a/img.mu b/img.mu index 0d58fb0d..4f244220 100644 --- a/img.mu +++ b/img.mu @@ -17,6 +17,7 @@ type image { # 1: portable bitmap (P1) - pixels 0 or 1 # 2: portable greymap (P2) - pixels 1-byte greyscale values # 3: portable pixmap (P3) - pixels 3-byte rgb values + max: int width: int height: int data: (handle array byte) @@ -253,8 +254,10 @@ fn initialize-image-from-pgm _self: (addr image), in: (addr stream byte) { break-if-= draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0/screen, "levels of grey is not 255; continuing and hoping for the best", 0x2b/fg 0/bg } + var dest/edi: (addr int) <- get self, max + copy-to *dest, tmp # save width, height - var dest/edi: (addr int) <- get self, width + dest <- get self, width copy-to *dest, width dest <- get self, height copy-to *dest, height @@ -444,6 +447,12 @@ fn dither-pgm-unordered _src: (addr image), _dest: (addr image) { var dest-height-a/ecx: (addr int) <- get dest, height copy-to *dest-height-a, tmp } + # compute scaling factor 255/max + var target-scale/eax: int <- copy 0xff + var scale-f/xmm7: float <- convert target-scale + var src-max-a/eax: (addr int) <- get src, max + var tmp-f/xmm0: float <- convert *src-max-a + scale-f <- divide tmp-f # transform 'data' var capacity/ebx: int <- copy src-width capacity <- multiply src-height @@ -467,10 +476,15 @@ fn dither-pgm-unordered _src: (addr image), _dest: (addr image) { compare x, src-width break-if->= var initial-color/eax: byte <- _read-pgm-buffer src-data, x, y, src-width + # . scale to 255 levels + var initial-color-int/eax: int <- copy initial-color + var initial-color-f/xmm0: float <- convert initial-color-int + initial-color-f <- multiply scale-f + initial-color-int <- convert initial-color-f var error/esi: int <- _read-dithering-error errors, x, y, src-width # error += (initial-color << 16) { - var tmp/eax: int <- copy initial-color + var tmp/eax: int <- copy initial-color-int tmp <- shift-left 0x10 # we have 32 bits; we'll use 16 bits for the fraction and leave 8 for unanticipated overflow error <- add tmp } -- cgit 1.4.1-2-gfad0