The next version of Softbuffer. @madsmtm is envisioning the end result is something like:
pub struct Context<D> { ... }
impl<D: HasDisplayHandle> Context<D> {
pub fn new(display: D) -> Result<Self, CreationError> { ... }
pub fn supported_pixel_formats(&self) -> &[PixelFormat] { ... }
pub fn supported_scale_modes(&self) -> &[ScaleMode] { ... }
pub fn supported_filter_modes(&self) -> &[FilterMode] { ... }
}
pub struct Surface<D, W> { ... }
impl<D: HasDisplayHandle, W: HasWindowHandle> Surface<D, W> {
pub fn new(context: &Context<D>, window: W) -> Result<Self, CreationError> { ... }
pub fn window(&self) -> &W { ... }
pub fn width(&self) -> u32 { ... }
pub fn height(&self) -> u32 { ... }
pub fn pixel_format(&self) -> PixelFormat { ... }
pub fn configure(&mut self, width: u32, height: u32, pixel_format: PixelFormat) -> Result<(), ConfigureError> { ... }
pub fn resize(&mut self, width: u32, height: u32) -> Result<(), ConfigureError> {
self.configure(width, height, self.pixel_format())
}
pub fn alpha_mode(&self) -> AlphaMode { ... }
pub fn set_alpha_mode(&mut self, alpha_mode: AlphaMode) { ... }
// Only necessary when surface size != window size
pub fn scale_mode(&self) -> ScaleMode { ... }
pub fn set_scale_mode(&mut self, scale_mode: ScaleMode) { ... }
pub fn filter_mode(&self) -> FilterMode { ... }
pub fn set_scale_mode(&mut self, filter_mode: FilterMode) { ... }
pub fn present_mode(&self) -> PresentMode { ... }
pub fn set_present_mode(&mut self, present_mode: PresentMode) { ... }
pub fn next_buffer(&mut self) -> Result<Buffer<'_>, NextBufferError> { ... }
}
pub enum PixelFormat {
Rgba8,
Bgra8,
Bgra4,
A2bgr10,
Bgra16f,
Bgra32f,
// + a bunch more similar to https://docs.rs/wgpu/latest/wgpu/enum.TextureFormat.html
}
pub enum AlphaMode {
#[default]
Opaque,
PreMultiplied,
PostMultiplied,
}
pub enum PresentMode {
#[default]
Fifo,
Immediate,
Mailbox,
// Unclear if this is the desired naming?
}
pub enum ScaleMode {
#[default]
Stretch,
Letterbox,
Crop,
}
/// Anti-aliasing.
pub enum FilterMode {
Nearest,
#[default]
Linear,
Trilinear,
}
struct Buffer<'a> {
width: u32,
height: u32,
byte_stride: u32,
pixel_format: PixelFormat,
age: u8,
data: &'a mut [u8],
platform: PlatformSpecificData<'a>,
}
impl Buffer<'_> {
pub fn width(&self) -> u32 { self.width }
pub fn height(&self) -> u32 { self.height }
pub fn byte_stride(&self) -> u32 { self.byte_stride }
pub fn pixel_format(&self) -> PixelFormat { self.pixel_format }
pub fn age(&self) -> u8 { self.age }
pub fn data(&mut self) -> &mut [u8] { self.data }
// Each row is `byte_stride` wide.
pub fn rows(&mut self) -> impl Iterator<Item = &mut [u8]> { ... }
// Probably .data_u16 / .data_u32 / .data_f16 / .data_f32 too.
pub fn present(self) -> Result<(), PresentError> { ... }
pub fn present_with_damage(self, damage: &[Rect]) -> Result<(), PresentError> { ... }
}
//
// Helpers for making people fall in the pit of success in terms of performance.
//
pub const DEFAULT_PIXEL_FORMAT: PixelFormat = if cfg!(android, wasm) { PixelFormat::Rgba8 } else { PixelFormat::Bgra8 };
struct Pixel {
// Ordering depends on platform
pub r: u8,
pub g: u8,
pub b: u8,
pub a: u8,
}
impl Pixel {
pub const BLACK: Self::new_rgba(0, 0, 0, 0);
pub const fn new_rgb(r: u8, g: u8, b: u8) -> Self { ... }
pub const fn new_rgba(r: u8, g: u8, b: u8, a: u8) -> Self { ... }
}
impl Buffer<'_> {
// Each row is `byte_stride / 4` wide.
pub fn pixel_rows(&mut self) -> impl Iterator<Item = &mut [Pixel]> { ... }
}List view
0 issues of 19 selected
- Status: Open (in progress).rust-windowing/softbuffernumber 289#289 In rust-windowing/softbuffer;
- Status: Open.#291 In rust-windowing/softbuffer;
- Status: Draft (not ready).rust-windowing/softbuffernumber 295#295 In rust-windowing/softbuffer;
- Status: Open.#238 In rust-windowing/softbuffer;
- Status: Open.#106 In rust-windowing/softbuffer;
- Status: Open.#98 In rust-windowing/softbuffer;
- Status: Open.#17 In rust-windowing/softbuffer;
- Status: Open (in progress).rust-windowing/softbuffernumber 275#275 In rust-windowing/softbuffer;
- Status: Draft (not ready).rust-windowing/softbuffernumber 95#95 In rust-windowing/softbuffer;
- Status: Draft (not ready).rust-windowing/softbuffernumber 96#96 In rust-windowing/softbuffer;
- Status: Open.#29 In rust-windowing/softbuffer;
- Status: Open.#73 In rust-windowing/softbuffer;
- Status: Open.#83 In rust-windowing/softbuffer;
- Status: Open.#109 In rust-windowing/softbuffer;
- Status: Open.#177 In rust-windowing/softbuffer;
- Status: Open.#207 In rust-windowing/softbuffer;
- Status: Open.#237 In rust-windowing/softbuffer;
- Status: Open (in progress).rust-windowing/softbuffernumber 313#313 In rust-windowing/softbuffer;
- Status: Open.#306 In rust-windowing/softbuffer;