summaryrefslogtreecommitdiffstats
path: root/examples/tour/renderer/image.rs
blob: c3ead5c9d749773186dd1cecd46187f243a38a1b (plain) (blame)
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
use super::Renderer;

use ggez::{graphics, nalgebra};
use iced::image;

impl image::Renderer<graphics::Image> for Renderer<'_> {
    fn node(
        &self,
        style: iced::Style,
        image: &graphics::Image,
        width: Option<u16>,
        height: Option<u16>,
        _source: Option<iced::Rectangle<u16>>,
    ) -> iced::Node {
        let aspect_ratio = image.width() as f32 / image.height() as f32;

        let style = match (width, height) {
            (Some(width), Some(height)) => style.width(width).height(height),
            (Some(width), None) => style
                .width(width)
                .height((width as f32 / aspect_ratio).round() as u16),
            (None, Some(height)) => style
                .height(height)
                .width((height as f32 * aspect_ratio).round() as u16),
            (None, None) => style.width(image.width()).height(image.height()),
        };

        iced::Node::new(style)
    }

    fn draw(
        &mut self,
        image: &graphics::Image,
        bounds: iced::Rectangle,
        _source: Option<iced::Rectangle<u16>>,
    ) {
        // We should probably use batches to draw images efficiently and keep
        // draw side-effect free, but this is good enough for the example.
        graphics::draw(
            self.context,
            image,
            graphics::DrawParam::new()
                .dest(nalgebra::Point2::new(bounds.x, bounds.y))
                .scale(nalgebra::Vector2::new(
                    bounds.width / image.width() as f32,
                    bounds.height / image.height() as f32,
                )),
        )
        .expect("Draw image");
    }
}