Move apply_alpha functionality into rgba
This commit is contained in:
parent
eeab4f0d45
commit
413c911cd1
@ -129,10 +129,10 @@ class renderer
|
|||||||
alignment m_align;
|
alignment m_align;
|
||||||
std::bitset<3> m_attr;
|
std::bitset<3> m_attr;
|
||||||
int m_font{0};
|
int m_font{0};
|
||||||
rgba m_bg{0U};
|
rgba m_bg{};
|
||||||
rgba m_fg{0U};
|
rgba m_fg{};
|
||||||
rgba m_ol{0U};
|
rgba m_ol{};
|
||||||
rgba m_ul{0U};
|
rgba m_ul{};
|
||||||
vector<action_block> m_actions;
|
vector<action_block> m_actions;
|
||||||
|
|
||||||
bool m_fixedcenter;
|
bool m_fixedcenter;
|
||||||
|
@ -12,6 +12,14 @@ struct rgba {
|
|||||||
*/
|
*/
|
||||||
uint32_t m_value;
|
uint32_t m_value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NONE marks this instance as invalid. If such a color is encountered, it
|
||||||
|
* should be treated as if no color was set.
|
||||||
|
*
|
||||||
|
* ALPHA_ONLY is used for color strings that only have an alpha channel (#AA)
|
||||||
|
* these kinds should be combined with another color that has RGB channels
|
||||||
|
* before they are used to render anything.
|
||||||
|
*/
|
||||||
enum color_type { NONE, ARGB, ALPHA_ONLY } m_type{NONE};
|
enum color_type { NONE, ARGB, ALPHA_ONLY } m_type{NONE};
|
||||||
|
|
||||||
explicit rgba();
|
explicit rgba();
|
||||||
@ -33,6 +41,7 @@ struct rgba {
|
|||||||
uint8_t b_int() const;
|
uint8_t b_int() const;
|
||||||
|
|
||||||
bool has_color() const;
|
bool has_color() const;
|
||||||
|
void apply_alpha(rgba other);
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace color_util {
|
namespace color_util {
|
||||||
|
@ -261,7 +261,8 @@ void builder::font_close() {
|
|||||||
void builder::background(rgba color) {
|
void builder::background(rgba color) {
|
||||||
if (color.m_type == color.ALPHA_ONLY) {
|
if (color.m_type == color.ALPHA_ONLY) {
|
||||||
rgba bg = m_bar.background;
|
rgba bg = m_bar.background;
|
||||||
color.m_value |= bg;
|
bg.apply_alpha(color);
|
||||||
|
color = bg;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto hex = color_util::simplify_hex(color);
|
auto hex = color_util::simplify_hex(color);
|
||||||
@ -282,8 +283,9 @@ void builder::background_close() {
|
|||||||
*/
|
*/
|
||||||
void builder::color(rgba color) {
|
void builder::color(rgba color) {
|
||||||
if (color.m_type == color.ALPHA_ONLY) {
|
if (color.m_type == color.ALPHA_ONLY) {
|
||||||
rgba bg = m_bar.foreground;
|
rgba fg = m_bar.foreground;
|
||||||
color.m_value |= bg;
|
fg.apply_alpha(color);
|
||||||
|
color = fg;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto hex = color_util::simplify_hex(color);
|
auto hex = color_util::simplify_hex(color);
|
||||||
|
@ -30,7 +30,7 @@ static string normalize_hex(string hex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hex.length() == 3) {
|
if (hex.length() == 3) {
|
||||||
// RGB -> ARGB
|
// RGB -> FRGB
|
||||||
hex.insert(0, 1, 'f');
|
hex.insert(0, 1, 'f');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,6 +134,15 @@ bool rgba::has_color() const {
|
|||||||
return m_type != NONE;
|
return m_type != NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the current alpha channel with the alpha channel of the other color
|
||||||
|
*
|
||||||
|
* Useful for ALPHA_ONLY colors
|
||||||
|
*/
|
||||||
|
void rgba::apply_alpha(rgba other) {
|
||||||
|
m_value = (m_value & 0x00FFFFFF) | (other.a_int() << 24);
|
||||||
|
}
|
||||||
|
|
||||||
string color_util::simplify_hex(string hex) {
|
string color_util::simplify_hex(string hex) {
|
||||||
// convert #ffrrggbb to #rrggbb
|
// convert #ffrrggbb to #rrggbb
|
||||||
if (hex.length() == 9 && std::toupper(hex[1]) == 'F' && std::toupper(hex[2]) == 'F') {
|
if (hex.length() == 9 && std::toupper(hex[1]) == 'F' && std::toupper(hex[2]) == 'F') {
|
||||||
|
Loading…
Reference in New Issue
Block a user