#include namespace psemek::ui { namespace { template void merge(std::optional & dst, std::optional const & src) { if (!dst) dst = src; } template void merge(std::shared_ptr & dst, std::shared_ptr const & src) { if (!dst) dst = src; } template void scale(T & dst, float factor) { if (dst) dst = static_cast(std::ceil((*dst) * factor)); } template void scale(std::optional> & dst, float factor) { if (dst) for (std::size_t i = 0; i < N; ++i) (*dst)[i] = static_cast(std::ceil((*dst)[i] * factor)); } } void merge(style & dst, style const & src) { merge(dst.bg_color, src.bg_color); merge(dst.fg_color, src.fg_color); merge(dst.highlight_color, src.highlight_color); merge(dst.action_color, src.action_color); merge(dst.action_offset, src.action_offset); merge(dst.border_color, src.border_color); merge(dst.border_width, src.border_width); merge(dst.bevel_light_color, src.bevel_light_color); merge(dst.bevel_dark_color, src.bevel_dark_color); merge(dst.bevel_type, src.bevel_type); merge(dst.bevel_width, src.bevel_width); merge(dst.axis_color, src.axis_color); merge(dst.ref_height, src.ref_height); merge(dst.shadow_offset, src.shadow_offset); merge(dst.shadow_color, src.shadow_color); merge(dst.inner_margin, src.inner_margin); merge(dst.outer_margin, src.outer_margin); merge(dst.text_color, src.text_color); merge(dst.text_scale, src.text_scale); merge(dst.text_shadow_offset, src.text_shadow_offset); merge(dst.font, src.font); } style scale(style const & s, float factor) { style result = s; scale(result.action_offset, factor); scale(result.border_width, factor); scale(result.ref_height, factor); scale(result.shadow_offset, factor); scale(result.inner_margin, factor); scale(result.outer_margin, factor); scale(result.text_scale, factor); scale(result.text_shadow_offset, factor); return result; } style default_style() { style s; s.bg_color = {95, 95, 95, 255}; s.fg_color = {127, 127, 127, 255}; s.highlight_color = {159, 159, 159, 255}; s.action_color = {63, 63, 63, 255}; s.action_offset = {1, 1}; s.border_color = {255, 255, 255, 255}; s.border_width = 3; s.bevel_light_color = {159, 159, 159, 255}; s.bevel_dark_color = {63, 63, 63, 63}; s.bevel_type = bevel_type::up; s.bevel_width = 1; s.axis_color = {255, 255, 255, 255}; s.ref_height = 22; s.shadow_offset = {1, 1}; s.shadow_color = {0, 0, 0, 255}; s.inner_margin = 5; s.outer_margin = 10; s.text_color = {255, 255, 255, 255}; s.text_scale = 1; s.text_shadow_offset = {1, 1}; return s; } }