ferroui_base/platform/surfaces/
i_framebuffer_platform_surface.rs1use super::{IPlatformRenderSurface, IPlatformRenderSurfaceRenderTarget};
2use crate::platform::{ILockedFramebuffer, RenderTargetSceneInfo};
3use std::rc::Rc;
4
5pub trait IFramebufferPlatformSurface: IPlatformRenderSurface {
7 fn create_framebuffer_render_target(&self) -> Rc<dyn IFramebufferRenderTarget>;
9}
10
11#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
13pub struct FramebufferLockProperties {
14 pub previous_frame_is_retained: bool,
17}
18
19pub trait IFramebufferRenderTarget: IPlatformRenderSurfaceRenderTarget {
21 fn lock(&self, scene_info: &RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties);
25
26 fn retains_frame_contents(&self) -> bool {
28 false
29 }
30
31 fn dispose(&self);
33}
34
35type LockFramebuffer = dyn Fn(&RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties);
36
37pub struct FuncFramebufferRenderTarget {
39 lock_framebuffer: Box<LockFramebuffer>,
40 retains_frame_contents: bool,
41}
42
43impl FuncFramebufferRenderTarget {
44 pub fn new(lock_framebuffer: impl Fn() -> Rc<dyn ILockedFramebuffer> + 'static) -> Self {
46 Self {
47 lock_framebuffer: Box::new(move |_| (lock_framebuffer(), FramebufferLockProperties::default())),
48 retains_frame_contents: false,
49 }
50 }
51
52 pub fn with_scene_info(
55 lock_framebuffer: impl Fn(&RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties)
56 + 'static,
57 retains_frame_contents: bool,
58 ) -> Self {
59 Self { lock_framebuffer: Box::new(lock_framebuffer), retains_frame_contents }
60 }
61}
62
63impl IPlatformRenderSurfaceRenderTarget for FuncFramebufferRenderTarget {}
64
65impl IFramebufferRenderTarget for FuncFramebufferRenderTarget {
66 fn lock(&self, scene_info: &RenderTargetSceneInfo) -> (Rc<dyn ILockedFramebuffer>, FramebufferLockProperties) {
67 (self.lock_framebuffer)(scene_info)
68 }
69
70 fn retains_frame_contents(&self) -> bool {
71 self.retains_frame_contents
72 }
73
74 fn dispose(&self) {}
75}