use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use crate::layout_props::Insets;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BackbufferMode {
Rgba,
LcdCoverage,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BackbufferKind {
None,
SoftwareRgba,
SoftwareLcd,
GlFbo,
}
#[derive(Clone, Copy, Debug)]
pub struct BackbufferSpec {
pub kind: BackbufferKind,
pub cached: bool,
pub alpha: f64,
pub outsets: Insets,
pub rounded_clip: Option<f64>,
}
impl BackbufferSpec {
pub const fn none() -> Self {
Self {
kind: BackbufferKind::None,
cached: false,
alpha: 1.0,
outsets: Insets::ZERO,
rounded_clip: None,
}
}
}
impl Default for BackbufferSpec {
fn default() -> Self {
Self::none()
}
}
pub struct BackbufferCache {
pub pixels: Option<Arc<Vec<u8>>>,
pub lcd_alpha: Option<Arc<Vec<u8>>>,
pub width: u32,
pub height: u32,
pub dirty: bool,
pub theme_epoch: u64,
pub typography_epoch: u64,
pub async_state_epoch: u64,
}
impl BackbufferCache {
pub fn new() -> Self {
Self {
pixels: None,
lcd_alpha: None,
width: 0,
height: 0,
dirty: true,
theme_epoch: 0,
typography_epoch: 0,
async_state_epoch: 0,
}
}
pub fn invalidate(&mut self) {
self.dirty = true;
}
}
impl Default for BackbufferCache {
fn default() -> Self {
Self::new()
}
}
static NEXT_BACKBUFFER_ID: AtomicU64 = AtomicU64::new(1);
pub struct BackbufferState {
id: u64,
pub cache: BackbufferCache,
pub dirty: bool,
pub width: u32,
pub height: u32,
pub spec_kind: BackbufferKind,
pub theme_epoch: u64,
pub typography_epoch: u64,
pub async_state_epoch: u64,
pub repaint_count: u64,
pub composite_count: u64,
}
impl BackbufferState {
pub fn new() -> Self {
Self {
id: NEXT_BACKBUFFER_ID.fetch_add(1, Ordering::Relaxed),
cache: BackbufferCache::new(),
dirty: true,
width: 0,
height: 0,
spec_kind: BackbufferKind::None,
theme_epoch: 0,
typography_epoch: 0,
async_state_epoch: 0,
repaint_count: 0,
composite_count: 0,
}
}
pub fn id(&self) -> u64 {
self.id
}
pub fn invalidate(&mut self) {
self.dirty = true;
self.cache.invalidate();
}
}
impl Default for BackbufferState {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Copy, Debug)]
pub struct CompositingLayer {
pub outset_left: f64,
pub outset_bottom: f64,
pub outset_right: f64,
pub outset_top: f64,
pub alpha: f64,
}
impl CompositingLayer {
pub const fn new(
outset_left: f64,
outset_bottom: f64,
outset_right: f64,
outset_top: f64,
alpha: f64,
) -> Self {
Self {
outset_left,
outset_bottom,
outset_right,
outset_top,
alpha,
}
}
}