srctree

Robin Linden parent b9a5492b d9a9f673
render: Handle the #rgba and #rrggbbaa color formats

inlinesplit
render/render.cpp added: 52, removed: 5, total 47
@@ -226,16 +226,26 @@ std::optional<gfx::Color> try_from_hex_chars(std::string_view hex_chars) {
std::uint32_t hex{};
if (hex_chars.length() == 6) {
std::from_chars(hex_chars.data(), hex_chars.data() + hex_chars.size(), hex, /*base*/ 16);
return gfx::Color::from_rgb(hex);
} else if (hex_chars.length() == 3) {
std::ostringstream ss;
ss << hex_chars[0] << hex_chars[0] << hex_chars[1] << hex_chars[1] << hex_chars[2] << hex_chars[2];
auto expanded = ss.str();
std::from_chars(expanded.data(), expanded.data() + expanded.size(), hex, /*base*/ 16);
} else {
return std::nullopt;
return gfx::Color::from_rgb(hex);
} else if (hex_chars.length() == 8) {
std::from_chars(hex_chars.data(), hex_chars.data() + hex_chars.size(), hex, /*base*/ 16);
return gfx::Color::from_rgba(hex);
} else if (hex_chars.length() == 4) {
std::ostringstream ss;
ss << hex_chars[0] << hex_chars[0] << hex_chars[1] << hex_chars[1] << hex_chars[2] << hex_chars[2]
<< hex_chars[3] << hex_chars[3];
auto expanded = ss.str();
std::from_chars(expanded.data(), expanded.data() + expanded.size(), hex, /*base*/ 16);
return gfx::Color::from_rgba(hex);
}
 
return gfx::Color::from_rgb(hex);
return std::nullopt;
}
 
gfx::Color parse_color(std::string_view str) {
 
render/render_test.cpp added: 52, removed: 5, total 47
@@ -167,5 +167,42 @@ int main() {
expect_eq(saver.take_commands(), CanvasCommands{std::move(cmd)});
});
 
etest::test("hex colors", [] {
dom::Node dom = dom::Element{"div"};
auto styled = style::StyledNode{.node = dom};
auto layout = layout::LayoutBox{
.node = &styled,
.type = layout::LayoutType::Block,
.dimensions = {{0, 0, 20, 20}},
};
 
gfx::CanvasCommandSaver saver;
gfx::Painter painter{saver};
 
// #rgba
styled.properties = {{"background-color", "#abcd"}};
auto cmd = gfx::DrawRectCmd{.rect{0, 0, 20, 20}, .color{gfx::Color{0xaa, 0xbb, 0xcc, 0xdd}}};
render::render_layout(painter, layout);
expect_eq(saver.take_commands(), CanvasCommands{std::move(cmd)});
 
// #rrggbbaa
styled.properties = {{"background-color", "#12345678"}};
cmd = gfx::DrawRectCmd{.rect{0, 0, 20, 20}, .color{gfx::Color{0x12, 0x34, 0x56, 0x78}}};
render::render_layout(painter, layout);
expect_eq(saver.take_commands(), CanvasCommands{std::move(cmd)});
 
// #rgb
styled.properties = {{"background-color", "#abc"}};
cmd = gfx::DrawRectCmd{.rect{0, 0, 20, 20}, .color{gfx::Color{0xaa, 0xbb, 0xcc}}};
render::render_layout(painter, layout);
expect_eq(saver.take_commands(), CanvasCommands{std::move(cmd)});
 
// #rrggbb
styled.properties = {{"background-color", "#123456"}};
cmd = gfx::DrawRectCmd{.rect{0, 0, 20, 20}, .color{gfx::Color{0x12, 0x34, 0x56}}};
render::render_layout(painter, layout);
expect_eq(saver.take_commands(), CanvasCommands{std::move(cmd)});
});
 
return etest::run_all_tests();
}