RosettaCodeData/Task/Bitmap-Write-a-PPM-file/Oz/bitmap-write-a-ppm-file.oz

40 lines
797 B
Text
Raw Permalink Normal View History

2023-07-01 11:58:00 -04:00
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)}
2026-04-30 12:34:36 -04:00
{F write(vs:[R G B])}
2023-07-01 11:58:00 -04:00
end
fun {ToBytes C}
2026-04-30 12:34:36 -04:00
[C div 0x100 C mod 0x100]
2023-07-01 11:58:00 -04:00
end
proc {WriteColor16 color(R G B)}
2026-04-30 12:34:36 -04:00
{F write(vs:{Flatten {Map [R G B] ToBytes}})}
2023-07-01 11:58:00 -04:00
end
MaxCol = {Bitmap.maxValue B}
MaxVal#Writer = if MaxCol =< 0xff then 0xff#WriteColor8
2026-04-30 12:34:36 -04:00
else 0xffff#WriteColor16
end
2023-07-01 11:58:00 -04:00
Header = "P6\n"#W#" "#H#" "#MaxVal#"\n"
in
try
2026-04-30 12:34:36 -04:00
{F write(vs:Header)}
{Bitmap.forAllPixels B Writer}
2023-07-01 11:58:00 -04:00
finally
2026-04-30 12:34:36 -04:00
{F close}
2023-07-01 11:58:00 -04:00
end
end
end