Lines
0 %
Functions
Branches
100 %
use crate::css::{Color, Value};
use crate::layout::{AnonymousBlock, BlockNode, InlineNode, LayoutBox, Rect};
#[derive(Debug)]
pub enum DisplayCommand {
SolidColor(Color, Rect),
}
pub type DisplayList = Vec<DisplayCommand>;
pub fn build_display_list(layout_root: &LayoutBox) -> DisplayList {
let mut list = Vec::new();
render_layout_box(&mut list, layout_root);
list
fn render_layout_box(list: &mut DisplayList, layout_box: &LayoutBox) {
render_background(list, layout_box);
render_borders(list, layout_box);
for child in &layout_box.children {
render_layout_box(list, child);
fn render_background(list: &mut DisplayList, layout_box: &LayoutBox) {
if let Some(color) = get_color(layout_box, "background") {
list.push(DisplayCommand::SolidColor(
color,
layout_box.dimensions.border_box(),
));
fn render_borders(list: &mut DisplayList, layout_box: &LayoutBox) {
let color = match get_color(layout_box, "border-color") {
Some(color) => color,
_ => return,
};
let d = &layout_box.dimensions;
let border_box = d.border_box();
// Left border
color.clone(),
Rect {
x: border_box.x,
y: border_box.y,
width: d.border.left,
height: border_box.height,
},
// Right border
x: border_box.x + border_box.width - d.border.right,
width: d.border.right,
// Top border
width: border_box.width,
height: d.border.top,
// Bottom border
y: border_box.y + border_box.height - d.border.bottom,
height: d.border.bottom,
/// Return the specified color for CSS property `name`, or None if no color was specified.
fn get_color(layout_box: &LayoutBox, name: &str) -> Option<Color> {
match layout_box.box_type {
BlockNode(style) | InlineNode(style) => match style.value(name) {
Some(Value::ColorValue(color)) => Some(color),
_ => None,
AnonymousBlock => None,