srctree

Robin Linden parent 7fcc8b63 6d28a19b
render: Update property getters to use template arguments

This is to enforce passing the arguments at compile-time in order toswitch the return types to more reasonable types than strings.

inlinesplit
render/render.cpp added: 10, removed: 9, total 1
@@ -261,8 +261,9 @@ gfx::Color parse_color(std::string_view str) {
return gfx::Color{0xFF, 0, 0};
}
 
std::optional<gfx::Color> try_get_color(layout::LayoutBox const &layout, css::PropertyId color_property) {
auto maybe_color = layout.get_property(color_property);
template<css::PropertyId T>
std::optional<gfx::Color> try_get_color(layout::LayoutBox const &layout) {
auto maybe_color = layout.get_property(T);
 
// https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#currentcolor_keyword
if (maybe_color == "currentcolor") {
@@ -282,23 +283,23 @@ void render_text(gfx::Painter &painter, layout::LayoutBox const &layout, dom::Te
// * This shouldn't be done here.
auto font = gfx::Font{"arial"sv};
auto font_size = gfx::FontSize{.px = 10};
auto color = try_get_color(layout, css::PropertyId::Color).value_or(kDefaultColor);
auto color = try_get_color<css::PropertyId::Color>(layout).value_or(kDefaultColor);
painter.draw_text(layout.dimensions.content.position(), text.text, font, font_size, color);
}
 
void render_element(gfx::Painter &painter, layout::LayoutBox const &layout) {
auto background_color =
try_get_color(layout, css::PropertyId::BackgroundColor).value_or(named_colors.at("transparent"));
try_get_color<css::PropertyId::BackgroundColor>(layout).value_or(named_colors.at("transparent"));
auto const &border_size = layout.dimensions.border;
if (has_any_border(border_size)) {
gfx::Borders borders{};
borders.left.color = try_get_color(layout, css::PropertyId::BorderLeftColor).value_or(kDefaultColor);
borders.left.color = try_get_color<css::PropertyId::BorderLeftColor>(layout).value_or(kDefaultColor);
borders.left.size = border_size.left;
borders.right.color = try_get_color(layout, css::PropertyId::BorderRightColor).value_or(kDefaultColor);
borders.right.color = try_get_color<css::PropertyId::BorderRightColor>(layout).value_or(kDefaultColor);
borders.right.size = border_size.right;
borders.top.color = try_get_color(layout, css::PropertyId::BorderTopColor).value_or(kDefaultColor);
borders.top.color = try_get_color<css::PropertyId::BorderTopColor>(layout).value_or(kDefaultColor);
borders.top.size = border_size.top;
borders.bottom.color = try_get_color(layout, css::PropertyId::BorderBottomColor).value_or(kDefaultColor);
borders.bottom.color = try_get_color<css::PropertyId::BorderBottomColor>(layout).value_or(kDefaultColor);
borders.bottom.size = border_size.bottom;
 
painter.draw_rect(layout.dimensions.padding_box(), background_color, borders);