mod background_drawing;
mod blend;
mod canvas;
mod components;
mod debug_drawing;
mod image_drawing;
pub(crate) mod inline_drawing;
mod render;
mod text_drawing;
mod write;
use std::{collections::HashMap, rc::Rc, sync::Arc};
pub(crate) use background_drawing::*;
pub(crate) use blend::*;
pub(crate) use canvas::*;
pub(crate) use components::*;
pub(crate) use debug_drawing::*;
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, InheritedStyle},
},
resources::image::ImageSource,
};
#[derive(Clone)]
pub(crate) struct Sizing {
pub(crate) viewport: Viewport,
pub(crate) font_size: f32,
pub(crate) calc_arena: Rc<CalcArena>,
}
#[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: InheritedStyle,
pub(crate) draw_debug_border: bool,
pub(crate) fetched_resources: HashMap<Arc<str>, Arc<ImageSource>>,
}
impl<'g> RenderContext<'g> {
pub(crate) fn new(
global: &'g GlobalContext,
viewport: Viewport,
fetched_resources: HashMap<Arc<str>, Arc<ImageSource>>,
) -> Self {
Self {
global,
sizing: Sizing {
viewport,
font_size: viewport.font_size,
calc_arena: Rc::new(CalcArena::default()),
},
transform: Affine::IDENTITY,
current_color: Color::black(),
style: InheritedStyle::default(),
draw_debug_border: false,
fetched_resources,
}
}
}
#[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)
}