Struct LiveImageSource
pub struct LiveImageSource { /* private fields */ }Expand description
A raster that producer threads rewrite and any number of windows show.
The first Send type in Teksilo that feeds the renderer: Send + Sync,
Clone is an Arc clone, and equality is identity. Producers write
through a LiveImageWriter; widgets show it with LiveImage, or with
Canvas::draw_live_image in a widget of
one’s own.
It holds one frame, latest wins. A commit that lands before a window has
shown the one before is merged into what that window uploads next, so a
producer faster than the display costs one upload per displayed frame.
Pixels never pass through paint() or an event: each window’s renderer
pulls what it lacks from the source, under its lock.
Implementations§
§impl LiveImageSource
impl LiveImageSource
pub const MAX_DIMENSION: u32 = 16_384
pub const MAX_DIMENSION: u32 = 16_384
The largest side a source accepts. Each renderer also checks its device’s own limit, and draws nothing for a larger source.
pub const MAX_BYTES: usize
pub const MAX_BYTES: usize
The largest frame a source accepts: 1 GiB, MAX_DIMENSION² × 4, so
only a side can be too large. A renderer uploads a frame larger than
its staging budget over several frames, showing the previous picture
until the new one is complete.
pub fn new(format: LivePixelFormat) -> LiveImageSource
pub fn new(format: LivePixelFormat) -> LiveImageSource
A source with no label, no size hint and no writer: Disconnected.
pub fn builder(format: LivePixelFormat) -> LiveImageSourceBuilder
pub fn writer(&self) -> LiveImageWriter
pub fn writer(&self) -> LiveImageWriter
Join the current writer session. The first writer of a session moves
Disconnected to Waiting. Use it for threads that cooperate on one
stream; a stream that restarts takes
writer_exclusive.
§Panics
When this thread holds a write transaction on the source.
pub fn writer_exclusive(&self) -> LiveImageWriter
pub fn writer_exclusive(&self) -> LiveImageWriter
Start a new writer session: revoke every existing writer, free the
pixels, set Waiting, and return the session’s first writer. A
revoked writer’s calls return [LiveImageError::Revoked] without
touching anything, so a task left over from an old stream cannot
write into the new one. Waits for an open transaction to end.
§Panics
When this thread holds a write transaction on the source.
pub fn set_size_hint(
&self,
width: u32,
height: u32,
) -> Result<(), LiveImageError>
pub fn set_size_hint( &self, width: u32, height: u32, ) -> Result<(), LiveImageError>
The size layout uses while no buffer exists, shared by every clone.
§Panics
When this thread holds a write transaction on the source.
pub fn id(&self) -> LiveImageId
pub fn id(&self) -> LiveImageId
Process-unique; keys each renderer’s texture cache.
pub fn format(&self) -> LivePixelFormat
pub fn status(&self) -> LiveImageStatus
pub fn status(&self) -> LiveImageStatus
Lock-free.
pub fn size(&self) -> Option<(u32, u32)>
pub fn size(&self) -> Option<(u32, u32)>
The buffer’s size, else the size hint. Lock-free, and may be ahead of what widgets laid out.
pub fn generation(&self) -> u64
pub fn generation(&self) -> u64
Lock-free and monotonic: +1 per commit that published.
pub fn displayed_generation(&self) -> u64
pub fn displayed_generation(&self) -> u64
The highest generation a window has presented. A producer that wants
backpressure compares it with generation.
pub fn is_observed(&self) -> bool
pub fn is_observed(&self) -> bool
Whether at least one widget showing the source was in its window’s last render, whatever the status: a placeholder counts.
pub fn is_displayed(&self) -> bool
pub fn is_displayed(&self) -> bool
Whether at least one widget drew the source unpaused in its window’s
last render, in a window not known to be hidden. A producer can
throttle while it is false. Takes the consumer-list lock briefly.
On Wayland a minimised window still counts: its compositor stops its
frames, but no window state says so.
pub fn stats(&self) -> LiveImageSourceStats
pub fn stats(&self) -> LiveImageSourceStats
Counters read from atomics; never takes a lock.
pub fn ptr_eq(&self, other: &LiveImageSource) -> bool
pub fn ptr_eq(&self, other: &LiveImageSource) -> bool
Whether self and other are the same source.
Trait Implementations§
§impl Clone for LiveImageSource
impl Clone for LiveImageSource
§fn clone(&self) -> LiveImageSource
fn clone(&self) -> LiveImageSource
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more§impl Debug for LiveImageSource
impl Debug for LiveImageSource
impl Eq for LiveImageSource
§impl Hash for LiveImageSource
impl Hash for LiveImageSource
Auto Trait Implementations§
impl !RefUnwindSafe for LiveImageSource
impl !UnwindSafe for LiveImageSource
impl Freeze for LiveImageSource
impl Send for LiveImageSource
impl Sync for LiveImageSource
impl Unpin for LiveImageSource
impl UnsafeUnpin for LiveImageSource
Blanket Implementations§
§impl<T> AnyEq for T
impl<T> AnyEq for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more