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::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::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}