mod background_drawing;
mod blend;
mod canvas;
mod components;
mod debug_drawing;
mod dithering;
mod image_drawing;
pub(crate) mod inline_drawing;
mod render;
mod text_drawing;
mod webp;
mod write;
use std::{collections::HashMap, rc::Rc, sync::Arc};
use taffy::Size;
pub(crate) use background_drawing::*;
pub(crate) use blend::*;
pub(crate) use canvas::*;
pub(crate) use components::*;
pub(crate) use debug_drawing::*;
pub use dithering::*;
pub(crate) use image_drawing::*;
pub use render::*;
pub(crate) use text_drawing::*;
pub use write::*;
use crate::{
GlobalContext,
layout::{
Viewport,
style::{Affine, CalcArena, Color, ComputedStyle, StyleSheet},
},
resources::image::ImageSource,
};
#[derive(Clone)]
pub(crate) struct Sizing {
pub(crate) viewport: Viewport,
pub(crate) container_size: Size<Option<f32>>,
pub(crate) font_size: f32,
pub(crate) calc_arena: Rc<CalcArena>,
}
impl Sizing {
pub(crate) fn query_container_width(&self) -> f32 {
self
.container_size
.width
.unwrap_or(self.viewport.width.unwrap_or_default() as f32)
}
pub(crate) fn query_container_height(&self) -> f32 {
self
.container_size
.height
.unwrap_or(self.viewport.height.unwrap_or_default() as f32)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct RenderTime {
pub time_ms: u64,
}
#[derive(Clone)]
pub struct RenderContext<'g> {
pub(crate) global: &'g GlobalContext,
pub(crate) transform: Affine,
pub(crate) sizing: Sizing,
pub(crate) current_color: Color,
pub(crate) style: Box<ComputedStyle>,
pub(crate) time: RenderTime,
pub(crate) draw_debug_border: bool,
pub(crate) fetched_resources: HashMap<Arc<str>, Arc<ImageSource>>,
pub(crate) stylesheet: Rc<StyleSheet>,
}
impl<'g> RenderContext<'g> {
pub(crate) fn new(
global: &'g GlobalContext,
viewport: Viewport,
fetched_resources: HashMap<Arc<str>, Arc<ImageSource>>,
stylesheet: Rc<StyleSheet>,
time: RenderTime,
) -> Self {
Self {
global,
sizing: Sizing {
viewport,
container_size: Size::NONE,
font_size: viewport.font_size,
calc_arena: Rc::new(CalcArena::default()),
},
transform: Affine::IDENTITY,
current_color: Color::black(),
style: Box::default(),
time,
draw_debug_border: false,
fetched_resources,
stylesheet,
}
}
#[cfg(test)]
pub(crate) fn new_test(global: &'g GlobalContext, viewport: Viewport) -> Self {
Self::new(
global,
viewport,
Default::default(),
Default::default(),
RenderTime::default(),
)
}
}
#[inline(always)]
pub(crate) fn fast_div_255(v: u32) -> u8 {
fast_div_255_u32(v) as u8
}
#[inline(always)]
pub(crate) fn fast_div_255_u32(v: u32) -> u32 {
((v.wrapping_add(128).wrapping_add(v >> 8)) >> 8).min(255)
}