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
use crate::{Color, Size, Viewport};
use iced_native::mouse;

use core::ffi::c_void;

/// A basic OpenGL compositor.
///
/// A compositor is responsible for initializing a renderer and managing window
/// surfaces.
///
/// For now, this compositor only deals with a single global surface
/// for drawing. However, the trait will most likely change in the near future
/// to handle multiple surfaces at once.
///
/// If you implement an OpenGL renderer, you can implement this trait to ease
/// integration with existing windowing shells, like `iced_glutin`.
pub trait GLCompositor: Sized {
    /// The renderer of the [`Compositor`].
    ///
    /// This should point to your renderer type, which could be a type alias
    /// of the [`Renderer`] provided in this crate with with a specific
    /// [`Backend`].
    ///
    /// [`Compositor`]: trait.Compositor.html
    /// [`Renderer`]: ../struct.Renderer.html
    /// [`Backend`]: ../backend/trait.Backend.html
    type Renderer: iced_native::Renderer;

    /// The settings of the [`Compositor`].
    ///
    /// It's up to you to decide the configuration supported by your renderer!
    type Settings: Default;

    /// Creates a new [`Compositor`] and [`Renderer`] with the given
    /// [`Settings`] and an OpenGL address loader function.
    ///
    /// [`Compositor`]: trait.Compositor.html
    /// [`Renderer`]: #associatedtype.Renderer
    /// [`Backend`]: ../backend/trait.Backend.html
    #[allow(unsafe_code)]
    unsafe fn new(
        settings: Self::Settings,
        loader_function: impl FnMut(&str) -> *const c_void,
    ) -> (Self, Self::Renderer);

    /// Returns the amount of samples that should be used when configuring
    /// an OpenGL context for this [`Compositor`].
    ///
    /// [`Compositor`]: trait.Compositor.html
    fn sample_count(settings: &Self::Settings) -> u32;

    /// Resizes the viewport of the [`Compositor`].
    ///
    /// [`Compositor`]: trait.Compositor.html
    fn resize_viewport(&mut self, physical_size: Size<u32>);

    /// Draws the provided output with the given [`Renderer`].
    ///
    /// [`Compositor`]: trait.Compositor.html
    fn draw<T: AsRef<str>>(
        &mut self,
        renderer: &mut Self::Renderer,
        viewport: &Viewport,
        background_color: Color,
        output: &<Self::Renderer as iced_native::Renderer>::Output,
        overlay: &[T],
    ) -> mouse::Interaction;
}