Skip to main content

loam_app/
capture_types.rs

1use std::path::PathBuf;
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq)]
4pub struct CaptureUnavailable;
5
6impl std::fmt::Display for CaptureUnavailable {
7    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8        f.write_str("capture is unavailable on this host")
9    }
10}
11
12impl std::error::Error for CaptureUnavailable {}
13
14#[derive(Copy, Clone, Debug, PartialEq, Eq)]
15pub enum CaptureStage {
16    Pre,
17    Post,
18    /// Two files per frame; PNG only.
19    Both,
20}
21
22#[derive(Copy, Clone, Debug, PartialEq, Eq)]
23pub enum CaptureFormat {
24    Png,
25    Gif,
26    /// Buffered in memory until stop.
27    Apng,
28}
29
30/// NeuQuant (Dekker, 1994) picks 256 colors; the mode controls what it trains on.
31#[derive(Copy, Clone, Debug, PartialEq, Eq, Default)]
32pub enum PaletteMode {
33    #[default]
34    Local,
35    Global,
36}
37
38#[derive(Debug)]
39pub enum CaptureRequest {
40    OneShot {
41        stage: CaptureStage,
42        dir: Option<PathBuf>,
43        name: Option<String>,
44    },
45    StartSequence {
46        format: CaptureFormat,
47        stage: CaptureStage,
48        dir: Option<PathBuf>,
49        name: Option<String>,
50        /// `None` = every render frame; GIF and APNG fall back to 30 fps.
51        fps: Option<u16>,
52        /// Output width, aspect preserved; `None` = native. PNG ignores it.
53        scale: Option<u32>,
54        /// GIF only.
55        palette: PaletteMode,
56    },
57    Stop,
58    Toggle {
59        format: CaptureFormat,
60        stage: CaptureStage,
61        dir: Option<PathBuf>,
62        name: Option<String>,
63        fps: Option<u16>,
64        scale: Option<u32>,
65        palette: PaletteMode,
66    },
67}