v2 / examples / pendulum-simulation / modules / sim / img / ppm.v
74 lines · 62 sloc · 1.44 KB · bbb61ab3687afe512a1fa12492c876d011626107
Raw
1module img
2
3import gg
4import os
5import sim
6
7@[params]
8pub struct ImageSettings {
9pub:
10 width int = sim.default_width
11 height int = sim.default_height
12 cache_size int = 200
13}
14
15pub fn new_image_settings(settings ImageSettings) ImageSettings {
16 return ImageSettings{
17 ...settings
18 }
19}
20
21pub fn image_settings_from_grid(grid sim.GridSettings) ImageSettings {
22 return ImageSettings{
23 width: grid.width
24 height: grid.height
25 }
26}
27
28pub fn (s ImageSettings) to_grid_settings() sim.GridSettings {
29 return sim.GridSettings{
30 width: s.width
31 height: s.height
32 }
33}
34
35pub struct PPMWriter {
36mut:
37 file os.File
38 cache []u8
39 cache_size int
40}
41
42pub 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
51pub 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
56pub 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
64pub fn (mut writer PPMWriter) flush() ! {
65 writer.cache.clear()
66}
67
68pub fn (mut writer PPMWriter) write() ! {
69 writer.file.write(writer.cache)!
70}
71
72pub fn (mut writer PPMWriter) close() {
73 writer.file.close()
74}
75