@@ -63,6 +63,10 @@ bool looks_like_hex(std::string_view str) {
return str.starts_with('#') && (str.length() == 7 || str.length() == 4);
}
bool has_any_border(layout::LayoutBox const &layout) {
return layout.dimensions.border_box() != layout.dimensions.padding_box();
}
dom::Text const *try_get_text(layout::LayoutBox const &layout) {
return std::get_if<dom::Text>(&layout.node->node);
}
@@ -105,6 +109,40 @@ void render_text(gfx::IPainter &painter, layout::LayoutBox const &layout, dom::T
painter.draw_text(layout.dimensions.content.position(), text.text, font, font_size, color);
}
void render_borders(gfx::IPainter &painter, layout::LayoutBox const &layout) {
// TODO(mkiael): Handle a lot more border styles
auto color = style::get_property(*layout.node, "color"sv).value_or(kDefaultColor);
auto border_box = layout.dimensions.border_box();
auto const &border_size = layout.dimensions.border;
if (border_size.left > 0) {
geom::Rect border{border_box.left(),
border_box.top() + border_size.top,
border_size.left,
border_box.height - border_size.top - border_size.bottom};
auto border_color = style::get_property(*layout.node, "border-left-color"sv).value_or(color);
painter.fill_rect(border, parse_color(border_color));
}
if (border_size.right > 0) {
geom::Rect border{border_box.right() - border_size.right,
border_box.top() + border_size.top,
border_size.right,
border_box.height - border_size.top - border_size.bottom};
auto border_color = style::get_property(*layout.node, "border-right-color"sv).value_or(color);
painter.fill_rect(border, parse_color(border_color));
}
if (border_size.top > 0) {
geom::Rect border{border_box.left(), border_box.top(), border_box.width, border_size.top};
auto border_color = style::get_property(*layout.node, "border-top-color"sv).value_or(color);
painter.fill_rect(border, parse_color(border_color));
}
if (border_size.bottom > 0) {
geom::Rect border{
border_box.left(), border_box.bottom() - border_size.bottom, border_box.width, border_size.bottom};
auto border_color = style::get_property(*layout.node, "border-bottom-color"sv).value_or(color);
painter.fill_rect(border, parse_color(border_color));
}
}
void render_background(gfx::IPainter &painter, layout::LayoutBox const &layout) {
if (auto maybe_color = style::get_property(*layout.node, "background-color")) {
painter.fill_rect(layout.dimensions.padding_box(), parse_color(*maybe_color));
@@ -115,6 +153,9 @@ void do_render(gfx::IPainter &painter, layout::LayoutBox const &layout) {
if (auto const *text = try_get_text(layout)) {
render_text(painter, layout, *text);
} else {
if (has_any_border(layout)) {
render_borders(painter, layout);
}
render_background(painter, layout);
}
}