Video

Trait Video 

Source
pub trait Video {
    type VideoFrame: VideoFrame;
    type Contention: MemoryContention;

    const PIXEL_DENSITY: u32 = 1u32;

    // Required methods
    fn border_color(&self) -> BorderColor;
    fn set_border_color(&mut self, border: BorderColor);
    fn render_video_frame<'a, B: PixelBuffer<'a>, P: Palette<Pixel = B::Pixel>>(
        &mut self,
        buffer: &'a mut [u8],
        pitch: usize,
        border_size: BorderSize,
    );
    fn current_video_ts(&self) -> VideoTs;
    fn set_video_ts(&mut self, vts: VideoTs);
    fn current_video_clock(
        &self,
    ) -> VFrameTsCounter<Self::VideoFrame, Self::Contention>;
    fn flash_state(&self) -> bool;

    // Provided methods
    fn render_size_pixels(border_size: BorderSize) -> (u32, u32) { ... }
    fn pixel_density() -> u32 { ... }
    fn visible_screen_bank(&self) -> usize { ... }
}
Expand description

An interface for rendering Spectrum’s pixel data to frame buffers.

Provided Associated Constants§

Source

const PIXEL_DENSITY: u32 = 1u32

The horizontal pixel density.

This is: 1 for chipsets that can render only low-resolution modes, and 2 for chipsets that are capable of displaying high-resolution screen modes.

Required Associated Types§

Source

type VideoFrame: VideoFrame

The type implementing VideoFrame, that is being used by the chipset emulator.

Source

type Contention: MemoryContention

The type implementing MemoryContention, that is being used by the chipset emulator.

Required Methods§

Source

fn border_color(&self) -> BorderColor

Returns the current border color.

Source

fn set_border_color(&mut self, border: BorderColor)

Force sets the border area to the given color.

Source

fn render_video_frame<'a, B: PixelBuffer<'a>, P: Palette<Pixel = B::Pixel>>( &mut self, buffer: &'a mut [u8], pitch: usize, border_size: BorderSize, )

Renders last emulated frame’s video data into the provided pixel buffer.

  • pitch is the number of bytes in a single row of pixel data, including padding between lines.
  • border_size determines the size of the border rendered around the INK and PAPER area.

Note that different BorderSizes will result in different sizes of the rendered buffer area.

To predetermine the size of the rendered buffer area use Video::render_size_pixels. To get the size of the video screen in low-resolution pixels only, call VideoFrame::screen_size_pixels e.g. for an aspect ratio calculation.

  • PixelBuffer implementation is used to write pixels into the buffer.
  • Palette implementation is used to create colors from the Spectrum colors.

NOTE: Currently this is a one-time action (per frame), as internal data will be drained during the rendering. Calling it twice will succeed but the image rendered the second time will be most probably incorrect due to the missing data.

Source

fn current_video_ts(&self) -> VideoTs

Returns the current value of the video T-state counter.

Source

fn set_video_ts(&mut self, vts: VideoTs)

Modifies the current value of the video T-state counter.

Source

fn current_video_clock( &self, ) -> VFrameTsCounter<Self::VideoFrame, Self::Contention>

Returns the current value of the video T-state clock.

Source

fn flash_state(&self) -> bool

Returns the temporary video flash attribute state.

Provided Methods§

Source

fn render_size_pixels(border_size: BorderSize) -> (u32, u32)

Returns rendered screen pixel size (horizontal, vertical), including the border area, measured in pixels depending on Video::PIXEL_DENSITY.

The size depends on the given border_size.

Source

fn pixel_density() -> u32

Returns the horizontal pixel density.

Source

fn visible_screen_bank(&self) -> usize

Returns the screen bank index of the currently visible screen.

The screen banks are different from memory banks. E.g. Spectrum 128k returns 0 for the screen bank which resides in a memory bank 5 and 1 for the screen bank which resides in a memory bank 7. For 16k/48k Spectrum, this method always returns 0.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§