forked from slint-ui/slint
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.rs
115 lines (98 loc) · 3.42 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright © SixtyFPS GmbH <[email protected]>
// SPDX-License-Identifier: MIT
use slint::SharedString;
use std::rc::Rc;
slint::include_modules!();
#[cfg(target_arch = "wasm32")]
use wasm_bindgen::prelude::*;
struct Filter {
name: SharedString,
apply_function: fn(&image::RgbaImage) -> image::RgbaImage,
}
struct Filters(Vec<Filter>);
impl slint::Model for Filters {
type Data = SharedString;
fn row_count(&self) -> usize {
self.0.len()
}
fn row_data(&self, row: usize) -> Option<Self::Data> {
self.0.get(row).map(|x| x.name.clone())
}
fn model_tracker(&self) -> &dyn slint::ModelTracker {
&()
}
}
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(start))]
pub fn main() {
// This provides better error messages in debug mode.
// It's disabled in release mode so it doesn't bloat up the file size.
#[cfg(all(debug_assertions, target_arch = "wasm32"))]
console_error_panic_hook::set_once();
let main_window = MainWindow::new().unwrap();
#[cfg(target_arch = "wasm32")]
let source_image =
image::load_from_memory(include_bytes!("../assets/cat.jpg")).unwrap().into_rgba8();
#[cfg(not(target_arch = "wasm32"))]
let source_image = {
let mut cat_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"));
cat_path.push("../assets/cat.jpg");
image::open(&cat_path).expect("Error loading cat image").into_rgba8()
};
main_window.set_original_image(slint::Image::from_rgba8(
slint::SharedPixelBuffer::clone_from_slice(
source_image.as_raw(),
source_image.width(),
source_image.height(),
),
));
let filters = Filters(vec![
Filter {
name: "Blur".into(),
apply_function: |image: &image::RgbaImage| image::imageops::blur(image, 4.),
},
Filter {
name: "Brighten".into(),
apply_function: |image: &image::RgbaImage| {
image::imageops::colorops::brighten(image, 30)
},
},
Filter {
name: "Darken".into(),
apply_function: |image: &image::RgbaImage| {
image::imageops::colorops::brighten(image, -30)
},
},
Filter {
name: "Increase Contrast".into(),
apply_function: |image: &image::RgbaImage| {
image::imageops::colorops::contrast(image, 30.)
},
},
Filter {
name: "Decrease Contrast".into(),
apply_function: |image: &image::RgbaImage| {
image::imageops::colorops::contrast(image, -30.)
},
},
Filter {
name: "Invert".into(),
apply_function: |image: &image::RgbaImage| {
let mut inverted = image.clone();
image::imageops::colorops::invert(&mut inverted);
inverted
},
},
]);
let filters = Rc::new(filters);
main_window.set_filters(slint::ModelRc::from(filters.clone()));
main_window.on_filter_image(move |filter_index| {
let filter_fn = filters.0[filter_index as usize].apply_function;
let filtered_image = filter_fn(&source_image);
slint::Image::from_rgba8(slint::SharedPixelBuffer::clone_from_slice(
filtered_image.as_raw(),
filtered_image.width(),
filtered_image.height(),
))
});
main_window.run().unwrap();
}