fun mk2 v = chr(v mod 256)^chr(v div 256 mod 256); fun mk4 v = mk2 (v mod 65536)^mk2 (v div 65536); fun upto n m = if n=m then [n] else n::(upto (n+1) m); fun header w h c = "BM"^mk4 ((pad4 w)*h+size c+54)^mk4 0^ mk4 (size c+54)^mk4 40^mk4 w^mk4 h^ mk2 1^mk2 8^mk4 0^mk4 ((pad4 w)*h)^ mk4 0^mk4 0^mk4 256^mk4 256; fun writebmp (w,h,c,f) s = let val fh = open_out s val waste=output(fh,header w h c) val waste'=output(fh,c) val waste'' = let fun row y = let fun g x = f(x,y) in implode(map g (upto 0 (pad4 w-1))) end in implode(map row (upto 0 (h-1))) end in output(fh,waste'');close_out fh; s end;