Skip to main content

cotis_raylib/
cotis.rs

1//! Cotis context trait implementations for [`crate::renderer::RaylibRender`].
2//!
3//! Bridges Cotis's window/frame/render context traits and text measurement to raylib:
4//!
5//! - `CotisWindowContext` (`cotis_utils::traits`) — screen dimensions from raylib.
6//! - `CotisFrameContext` — frame delta time.
7//! - `CotisRenderContext` — provided automatically via blanket impl when window and frame contexts are implemented.
8//! - `RendererTextMeasuringProvider` — layout text sizing via [`crate::functions_raylib::raylib_measure_text_inner`].
9
10use crate::raylib_images::Texture2DHolder;
11use crate::renderer::RaylibRender;
12use cotis_utils::math::Dimensions;
13use cotis_utils::traits::{CotisFrameContext, CotisWindowContext};
14use raylib::texture::Texture2D;
15use std::ops::Deref;
16use std::sync::Arc;
17
18impl CotisWindowContext for RaylibRender {
19    fn window_dimensions(&self) -> Dimensions {
20        let rl = self.lock_handle();
21        (rl.get_screen_width() as f32, rl.get_screen_height() as f32).into()
22    }
23}
24
25impl CotisFrameContext for RaylibRender {
26    fn get_delta_time(&self) -> f32 {
27        self.delta_time()
28    }
29}
30
31mod traits {
32    use crate::functions_raylib::raylib_measure_text_inner;
33    use crate::renderer::RaylibRender;
34    use cotis_defaults::element_configs::text_config::TextConfig;
35    use cotis_utils::text::{RendererTextMeasuringProvider, TextMeasurer};
36
37    impl RendererTextMeasuringProvider<TextConfig> for RaylibRender {
38        fn provide_measurer(&mut self) -> Box<TextMeasurer<'_, TextConfig>> {
39            let fonts = self.fonts();
40            Box::new(move |str, config| raylib_measure_text_inner(str, config, fonts.clone()))
41        }
42    }
43
44    #[cfg(feature = "test-render")]
45    use crate::test_render::RayTestRender;
46
47    #[cfg(feature = "test-render")]
48    impl RendererTextMeasuringProvider<TextConfig> for RayTestRender {
49        fn provide_measurer(&mut self) -> Box<TextMeasurer<'_, TextConfig>> {
50            let fonts = self.get_render().fonts();
51            Box::new(move |str, config| raylib_measure_text_inner(str, config, fonts.clone()))
52        }
53    }
54}
55
56impl Texture2DHolder for Arc<Texture2D> {
57    fn texture(&self) -> &Texture2D {
58        self.deref()
59    }
60}