40 lines
777 B
Plaintext
40 lines
777 B
Plaintext
functor
|
|
import
|
|
Bitmap
|
|
Open
|
|
export
|
|
%% Read
|
|
Write
|
|
define
|
|
%% Omitted: Read
|
|
|
|
proc {Write B=bitmap(array2d(width:W height:H ...)) Filename}
|
|
F = {New Open.file init(name:Filename flags:[write create truncate binary])}
|
|
|
|
proc {WriteColor8 color(R G B)}
|
|
{F write(vs:[R G B])}
|
|
end
|
|
|
|
fun {ToBytes C}
|
|
[C div 0x100 C mod 0x100]
|
|
end
|
|
|
|
proc {WriteColor16 color(R G B)}
|
|
{F write(vs:{Flatten {Map [R G B] ToBytes}})}
|
|
end
|
|
|
|
MaxCol = {Bitmap.maxValue B}
|
|
MaxVal#Writer = if MaxCol =< 0xff then 0xff#WriteColor8
|
|
else 0xffff#WriteColor16
|
|
end
|
|
Header = "P6\n"#W#" "#H#" "#MaxVal#"\n"
|
|
in
|
|
try
|
|
{F write(vs:Header)}
|
|
{Bitmap.forAllPixels B Writer}
|
|
finally
|
|
{F close}
|
|
end
|
|
end
|
|
end
|