use std::sync::Arc;
use inset_embedder::{Offset, Size, VideoFrameReader};
use inset_foundation::App;
use crate::box_::{BoxConstraints, RenderBox, RenderBoxData};
use crate::layer::{ErasedLayer, VideoLayer};
use crate::object::{RenderHandle, RenderObject, RenderObjectData};
use crate::painting_context::PaintingContext;
pub struct RenderVideoFrameView {
render_object: RenderObjectData,
render_box: RenderBoxData,
reader: Arc<dyn VideoFrameReader>,
}
impl RenderVideoFrameView {
pub fn new(
app: &mut App,
reader: Arc<dyn VideoFrameReader>,
) -> RenderHandle<RenderVideoFrameView> {
RenderHandle::new_box(
app,
RenderVideoFrameView {
render_object: RenderObjectData::new(),
render_box: RenderBoxData::new(),
reader,
},
)
}
pub fn reader(self: RenderHandle<Self>, app: &App) -> &Arc<dyn VideoFrameReader> {
&self.get(app).reader
}
pub fn set_reader(self: RenderHandle<Self>, app: &mut App, reader: Arc<dyn VideoFrameReader>) {
if Arc::ptr_eq(&self.get(app).reader, &reader) {
return;
}
self.get_mut(app).reader = reader;
self.mark_needs_paint(app);
}
}
impl RenderObject for RenderVideoFrameView {
crate::render_object_accessors!();
fn always_needs_compositing(self: RenderHandle<Self>, _app: &App) -> bool {
true
}
fn perform_layout(self: RenderHandle<Self>, app: &mut App) {
let size = self.constraints(app).biggest();
self.set_size(app, size);
}
fn paint(
self: RenderHandle<Self>,
app: &mut App,
context: &mut PaintingContext,
offset: Offset,
) {
let reader = Arc::clone(&self.get(app).reader);
let layer = VideoLayer::new(app, reader, offset & self.size(app));
context.add_layer(app, layer.as_layer());
}
}
impl RenderBox for RenderVideoFrameView {
crate::render_box_accessors!();
fn compute_dry_layout(
self: RenderHandle<Self>,
_app: &mut App,
constraints: BoxConstraints,
) -> Size {
constraints.biggest()
}
fn hit_test_self(self: RenderHandle<Self>, _app: &App, _position: Offset) -> bool {
true
}
}