(* readbmp reads a BMP bitmap file *) fun get2(s,i)=ordof(s,i)+256*ordof(s,i+1); fun get4(s,i)=get2(s,i)+256*256*get2(s,i+2); fun pad4 x = ~4*(~x div 4) fun ttt 0= 1|ttt 1= 2|ttt 2= 4|ttt 3=8|ttt 4=16 | ttt 5=32|ttt 6=64|ttt 7=128|ttt 8=256; fun bits(b,s,n)=chr((ord b div ttt(s*n)) mod (ttt n)) fun readbmp s = let val fh = open_in s val header = input(fh,54) val bitspp = get2(header,28) val colTab = input(fh,get4(header,10) - 54) val bitMap = input(fh,get4(header,34)) val w = get4(header,18) val h = get4(header,22) val dy = pad4((bitspp * w) div 8) fun outrange(x,y)=x<0 orelse y<0 orelse x>=w orelse y>=h val r = 8 div bitspp fun col(x,y) = if outrange(x,y) then "\000" else bits(substring(bitMap,dy*y+(x div r),1),r-1-(x mod r),bitspp) in (w,h,colTab,col) end;