| 1 | module img |
| 2 | |
| 3 | import gg |
| 4 | import os |
| 5 | import sim |
| 6 | |
| 7 | @[params] |
| 8 | pub struct ImageSettings { |
| 9 | pub: |
| 10 | width int = sim.default_width |
| 11 | height int = sim.default_height |
| 12 | cache_size int = 200 |
| 13 | } |
| 14 | |
| 15 | pub fn new_image_settings(settings ImageSettings) ImageSettings { |
| 16 | return ImageSettings{ |
| 17 | ...settings |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | pub fn image_settings_from_grid(grid sim.GridSettings) ImageSettings { |
| 22 | return ImageSettings{ |
| 23 | width: grid.width |
| 24 | height: grid.height |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | pub fn (s ImageSettings) to_grid_settings() sim.GridSettings { |
| 29 | return sim.GridSettings{ |
| 30 | width: s.width |
| 31 | height: s.height |
| 32 | } |
| 33 | } |
| 34 | |
| 35 | pub struct PPMWriter { |
| 36 | mut: |
| 37 | file os.File |
| 38 | cache []u8 |
| 39 | cache_size int |
| 40 | } |
| 41 | |
| 42 | pub fn ppm_writer_for_fname(fname string, settings ImageSettings) !&PPMWriter { |
| 43 | mut writer := &PPMWriter{ |
| 44 | cache_size: settings.cache_size |
| 45 | cache: []u8{cap: settings.cache_size} |
| 46 | } |
| 47 | writer.start_for_file(fname, settings)! |
| 48 | return writer |
| 49 | } |
| 50 | |
| 51 | pub fn (mut writer PPMWriter) start_for_file(fname string, settings ImageSettings) ! { |
| 52 | writer.file = os.create(fname)! |
| 53 | writer.file.writeln('P6 ${settings.width} ${settings.height} 255')! |
| 54 | } |
| 55 | |
| 56 | pub fn (mut writer PPMWriter) handle_pixel(p gg.Color) ! { |
| 57 | if writer.cache.len >= writer.cache_size { |
| 58 | writer.write()! |
| 59 | writer.flush()! |
| 60 | } |
| 61 | writer.cache << [p.r, p.g, p.b] |
| 62 | } |
| 63 | |
| 64 | pub fn (mut writer PPMWriter) flush() ! { |
| 65 | writer.cache.clear() |
| 66 | } |
| 67 | |
| 68 | pub fn (mut writer PPMWriter) write() ! { |
| 69 | writer.file.write(writer.cache)! |
| 70 | } |
| 71 | |
| 72 | pub fn (mut writer PPMWriter) close() { |
| 73 | writer.file.close() |
| 74 | } |
| 75 | |