chafa_sys/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(improper_ctypes)]
5#![allow(clippy::useless_transmute)]
6#![allow(clippy::approx_constant)]
7#![allow(clippy::too_many_arguments)]
8include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
9
10#[cfg(test)]
11mod tests {
12    use std::ffi::CString;
13
14    #[test]
15    fn usage_example() {
16        const PIX_WIDTH: usize = 3;
17        const PIX_HEIGHT: usize = 3;
18        const N_CHANNELS: usize = 4;
19
20        let pixels: [u8; PIX_WIDTH * PIX_HEIGHT * N_CHANNELS] = [
21            0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00,
22            0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
23            0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
24        ];
25
26        let symbol_map = unsafe {
27            let symbol_map = crate::chafa_symbol_map_new();
28            crate::chafa_symbol_map_add_by_tags(
29                symbol_map,
30                crate::ChafaSymbolTags_CHAFA_SYMBOL_TAG_ALL,
31            );
32            symbol_map
33        };
34
35        let config = unsafe {
36            let config = crate::chafa_canvas_config_new();
37            crate::chafa_canvas_config_set_geometry(config, 23, 12);
38            crate::chafa_canvas_config_set_symbol_map(config, symbol_map);
39            config
40        };
41
42        let canvas = unsafe { crate::chafa_canvas_new(config) };
43
44        unsafe {
45            crate::chafa_canvas_draw_all_pixels(
46                canvas,
47                crate::ChafaPixelType_CHAFA_PIXEL_RGBA8_UNASSOCIATED,
48                pixels.as_ptr(),
49                PIX_WIDTH as i32,
50                PIX_HEIGHT as i32,
51                (PIX_WIDTH * N_CHANNELS) as i32,
52            );
53        }
54
55        let gstring = unsafe { crate::chafa_canvas_build_ansi(canvas) };
56        let ansistr = unsafe { (*gstring).str_ };
57        let ansistr = unsafe { CString::from_raw(ansistr) };
58        let ansistr = ansistr.to_string_lossy();
59
60        println!("{}", ansistr);
61
62        unsafe {
63            // crate::g_string_free(gstring, 1);
64            crate::chafa_canvas_unref(canvas);
65            crate::chafa_canvas_config_unref(config);
66            crate::chafa_symbol_map_unref(symbol_map);
67        }
68
69        assert!(true);
70    }
71
72    #[test]
73    fn frectonz_image() {
74        let img = image::open("frectonz.png").expect("Failed to open image");
75
76        let symbol_map = unsafe {
77            let symbol_map = crate::chafa_symbol_map_new();
78            crate::chafa_symbol_map_add_by_tags(
79                symbol_map,
80                crate::ChafaSymbolTags_CHAFA_SYMBOL_TAG_ALL,
81            );
82            symbol_map
83        };
84
85        let (terminal_size::Width(cols), terminal_size::Height(rows)) =
86            terminal_size::terminal_size().expect("couldn't get term width and height");
87
88        let width_ptr: *mut i32 = &mut (cols as i32);
89        let height_ptr: *mut i32 = &mut (rows as i32);
90
91        unsafe {
92            crate::chafa_calc_canvas_geometry(
93                img.width() as i32,
94                img.height() as i32,
95                width_ptr,
96                height_ptr,
97                0.5,
98                false.into(),
99                false.into(),
100            );
101        }
102
103        let config = unsafe {
104            let config = crate::chafa_canvas_config_new();
105            crate::chafa_canvas_config_set_geometry(config, *width_ptr, *height_ptr);
106            crate::chafa_canvas_config_set_symbol_map(config, symbol_map);
107            config
108        };
109
110        let canvas = unsafe { crate::chafa_canvas_new(config) };
111        let pixels = img.to_rgba8();
112
113        unsafe {
114            crate::chafa_canvas_draw_all_pixels(
115                canvas,
116                crate::ChafaPixelType_CHAFA_PIXEL_RGBA8_UNASSOCIATED,
117                pixels.as_ptr(),
118                img.width() as i32,
119                img.height() as i32,
120                (img.width() * 4) as i32,
121            );
122        }
123
124        let gstring = unsafe { crate::chafa_canvas_build_ansi(canvas) };
125        let ansistr = unsafe { (*gstring).str_ };
126        let ansistr = unsafe { CString::from_raw(ansistr) };
127        let ansistr = ansistr.to_string_lossy();
128
129        println!("{}", ansistr);
130
131        unsafe {
132            // crate::g_string_free(gstring, 1);
133            crate::chafa_canvas_unref(canvas);
134            crate::chafa_canvas_config_unref(config);
135            crate::chafa_symbol_map_unref(symbol_map);
136        }
137
138        assert!(true);
139    }
140}