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::*;
#[cfg(feature = "css_stylesheet_parsing")]
use crate::layout::style::selector::StyleSheet;
use crate::{
GlobalContext,
layout::{
Viewport,
style::{Affine, CalcArena, Color, ResolvedStyle},
},
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: ResolvedStyle,
pub(crate) draw_debug_border: bool,
pub(crate) fetched_resources: HashMap<Arc<str>, Arc<ImageSource>>,
#[cfg(feature = "css_stylesheet_parsing")]
pub(crate) stylesheets: Rc<[StyleSheet]>,
}
impl<'g> RenderContext<'g> {
#[cfg(feature = "css_stylesheet_parsing")]
pub(crate) fn new<I: IntoIterator<Item = StyleSheet>>(
global: &'g GlobalContext,
viewport: Viewport,
fetched_resources: HashMap<Arc<str>, Arc<ImageSource>>,
stylesheets: I,
) -> 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: ResolvedStyle::default(),
draw_debug_border: false,
fetched_resources,
stylesheets: Rc::from_iter(stylesheets),
}
}
#[cfg(not(feature = "css_stylesheet_parsing"))]
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: ResolvedStyle::default(),
draw_debug_border: false,
fetched_resources,
}
}
#[cfg(test)]
pub(crate) fn new_test(global: &'g GlobalContext, viewport: Viewport) -> Self {
#[cfg(feature = "css_stylesheet_parsing")]
{
use std::iter::empty;
Self::new(global, viewport, Default::default(), empty())
}
#[cfg(not(feature = "css_stylesheet_parsing"))]
{
Self::new(global, viewport, Default::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)
}