gradients/
gradients.rs

1#![allow(clippy::many_single_char_names)]
2
3use fltk::{draw::*, enums::*, prelude::*, *};
4
5fn create_vertical_gradient_frame(
6    x: i32,
7    y: i32,
8    w: i32,
9    h: i32,
10    col1: Color,
11    col2: Color,
12) -> frame::Frame {
13    let mut frame = frame::Frame::new(x, y, w, h, "Vertical");
14    frame.draw(move |f| {
15        let imax = f.h();
16        let d = if imax > 0 { imax } else { 1 };
17        for i in 0..=imax {
18            let w = 1.0 - i as f32 / d as f32;
19            set_draw_color(Color::inactive(&Color::color_average(col1, col2, w)));
20            draw_hline(f.x(), f.y() + i, f.x() + f.w());
21        }
22        set_draw_color(Color::Black);
23        set_font(Font::Helvetica, app::font_size());
24        draw_text_boxed(&f.label().unwrap(), f.x(), f.y(), f.w(), f.h(), f.align());
25    });
26    frame
27}
28
29fn create_horizontal_gradient_frame(
30    x: i32,
31    y: i32,
32    w: i32,
33    h: i32,
34    col1: Color,
35    col2: Color,
36) -> frame::Frame {
37    let mut frame = frame::Frame::new(x, y, w, h, "Horizontal");
38    frame.draw(move |f| {
39        let imax = f.w();
40        let d = if imax > 0 { imax } else { 1 };
41        for i in 0..=imax {
42            let w = 1.0 - i as f32 / d as f32;
43            set_draw_color(Color::inactive(&Color::color_average(col1, col2, w)));
44            draw_vline(f.x() + i, f.y(), f.y() + f.h());
45        }
46        set_draw_color(Color::Black);
47        set_font(Font::Helvetica, app::font_size());
48        draw_text_boxed(&f.label().unwrap(), f.x(), f.y(), f.w(), f.h(), f.align());
49    });
50    frame
51}
52
53fn create_horizontal_svg_gradient_frame(
54    x: i32,
55    y: i32,
56    w: i32,
57    h: i32,
58    col1: Color,
59    col2: Color,
60) -> frame::Frame {
61    let mut frame = frame::Frame::new(x, y, w, h, "Svg");
62    frame.draw(move |f| {
63        let (r1, g1, b1) = Color::inactive(&col1).to_rgb();
64        let (r2, g2, b2) = Color::inactive(&col2).to_rgb();
65        let svg = format!(
66            "<svg viewBox='0 0 {} {}'>
67        <defs>
68        <linearGradient id='grad1' x1='0%' y1='0%' x2='0%' y2='100%'>
69        <stop offset='0%' style='stop-color:rgb({},{},{});stop-opacity:1' />
70        <stop offset='100%' style='stop-color:rgb({},{},{});stop-opacity:1' />
71        </linearGradient>
72        </defs>
73        <rect width='100%' height='100%' fill='url(#grad1)' />
74        </svg>",
75            f.w(),
76            f.h() + 1,
77            r1,
78            g1,
79            b1,
80            r2,
81            g2,
82            b2
83        );
84        let mut image = image::SvgImage::from_data(&svg).unwrap();
85        image.draw(f.x(), f.y(), f.w(), f.h());
86        set_draw_color(Color::Black);
87        set_font(Font::Helvetica, app::font_size());
88        draw_text_boxed(&f.label().unwrap(), f.x(), f.y(), f.w(), f.h(), f.align());
89    });
90    frame
91}
92
93fn main() {
94    let a = app::App::default();
95    let mut win = window::Window::default().with_size(300, 300);
96    create_vertical_gradient_frame(0, 0, 100, 100, Color::Red, Color::Cyan);
97    create_horizontal_gradient_frame(100, 0, 100, 100, Color::Red, Color::Cyan);
98    create_horizontal_svg_gradient_frame(200, 0, 100, 100, Color::Red, Color::Cyan);
99    win.end();
100    win.draw(|w| {
101        // vertical gradient
102        let imax = w.w();
103        let d = if imax > 0 { imax } else { 1 };
104        for i in 0..=imax {
105            let v = 1.0 - i as f32 / d as f32;
106            set_draw_color(Color::color_average(Color::Red, Color::Blue, v));
107            draw_vline(i, 0, w.h());
108        }
109        w.draw_children();
110    });
111    win.make_resizable(true);
112    win.show();
113    a.run().unwrap();
114}