Struct SoftwareRenderer
pub struct SoftwareRenderer { /* private fields */ }
software-renderer
only.Expand description
A Renderer that do the rendering in software
The renderer can remember what items needs to be redrawn from the previous iteration.
There are two kind of possible rendering
- Using
render()
to render the window in a buffer - Using
render_by_line()
to render the window line by line. This is only useful if the device does not have enough memory to render the whole window in one single buffer
Implementations§
§impl SoftwareRenderer
impl SoftwareRenderer
pub fn new() -> SoftwareRenderer
pub fn new() -> SoftwareRenderer
Create a new Renderer
pub fn new_with_repaint_buffer_type(
repaint_buffer_type: RepaintBufferType,
) -> SoftwareRenderer
pub fn new_with_repaint_buffer_type( repaint_buffer_type: RepaintBufferType, ) -> SoftwareRenderer
Create a new SoftwareRenderer.
The repaint_buffer_type
parameter specify what kind of buffer are passed to Self::render
pub fn set_repaint_buffer_type(&self, repaint_buffer_type: RepaintBufferType)
pub fn set_repaint_buffer_type(&self, repaint_buffer_type: RepaintBufferType)
Change the what kind of buffer is being passed to Self::render
This may clear the internal caches
pub fn repaint_buffer_type(&self) -> RepaintBufferType
pub fn repaint_buffer_type(&self) -> RepaintBufferType
Returns the kind of buffer that must be passed to Self::render
pub fn set_rendering_rotation(&self, rotation: RenderingRotation)
pub fn set_rendering_rotation(&self, rotation: RenderingRotation)
Set how the window need to be rotated in the buffer.
This is typically used to implement screen rotation in software
pub fn rendering_rotation(&self) -> RenderingRotation
pub fn rendering_rotation(&self) -> RenderingRotation
Return the current rotation. See Self::set_rendering_rotation()
pub fn render(
&self,
buffer: &mut [impl TargetPixel],
pixel_stride: usize,
) -> PhysicalRegion
pub fn render( &self, buffer: &mut [impl TargetPixel], pixel_stride: usize, ) -> PhysicalRegion
Render the window to the given frame buffer.
The renderer uses a cache internally and will only render the part of the window
which are dirty. The extra_draw_region
is an extra region which will also
be rendered. (eg: the previous dirty region in case of double buffering)
This function returns the region that was rendered.
The pixel_stride is the size (in pixels) between two lines in the buffer.
It is equal width
if the screen is not rotated, and height
if the screen is rotated by 90°.
The buffer needs to be big enough to contain the window, so its size must be at least
pixel_stride * height
, or pixel_stride * width
if the screen is rotated by 90°.
Returns the physical dirty region for this frame, excluding the extra_draw_region, in the window frame of reference. It is affected by the screen rotation.
pub fn render_by_line(
&self,
line_buffer: impl LineBufferProvider,
) -> PhysicalRegion
pub fn render_by_line( &self, line_buffer: impl LineBufferProvider, ) -> PhysicalRegion
Render the window, line by line, into the line buffer provided by the LineBufferProvider
.
The renderer uses a cache internally and will only render the part of the window
which are dirty, depending on the dirty tracking policy set in SoftwareRenderer::new
This function returns the physical region that was rendered considering the rotation.
The LineBufferProvider::process_line()
function will be called for each line and should
provide a buffer to draw into.
As an example, let’s imagine we want to render into a plain buffer.
(You wouldn’t normally use render_by_line
for that because the Self::render
would
then be more efficient)
struct FrameBuffer<'a>{ frame_buffer: &'a mut [Rgb565Pixel], stride: usize }
impl<'a> LineBufferProvider for FrameBuffer<'a> {
type TargetPixel = Rgb565Pixel;
fn process_line(
&mut self,
line: usize,
range: core::ops::Range<usize>,
render_fn: impl FnOnce(&mut [Self::TargetPixel]),
) {
let line_begin = line * self.stride;
render_fn(&mut self.frame_buffer[line_begin..][range]);
// The line has been rendered and there could be code here to
// send the pixel to the display
}
}
renderer.render_by_line(FrameBuffer{ frame_buffer: the_frame_buffer, stride: display_width });
Trait Implementations§
§impl Default for SoftwareRenderer
impl Default for SoftwareRenderer
§fn default() -> SoftwareRenderer
fn default() -> SoftwareRenderer
Auto Trait Implementations§
impl !Freeze for SoftwareRenderer
impl !RefUnwindSafe for SoftwareRenderer
impl !Send for SoftwareRenderer
impl !Sync for SoftwareRenderer
impl Unpin for SoftwareRenderer
impl !UnwindSafe for SoftwareRenderer
Blanket Implementations§
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<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> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> 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§impl<T> NoneValue for Twhere
T: Default,
impl<T> NoneValue for Twhere
T: Default,
type NoneType = T
§fn null_value() -> T
fn null_value() -> T
§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian()
.