fix(builder): Properly apply alpha for fg and bg
It was not quite clear how try_apply_alpha should behave if the given color was not ALPHA_ONLY. The implementation just returned 'this'. However, the build relied on it returning the given color. This broke all bg and fg settings in the entire bar. To clear this up, we switch this around take the alpha channel of 'this' and also return 'this' if it isn't ALPHA_ONLY. Fixes #2255
This commit is contained in:
parent
52eee95bf8
commit
e89da58940
@ -35,8 +35,8 @@ class rgba {
|
||||
uint8_t blue_i() const;
|
||||
|
||||
bool has_color() const;
|
||||
rgba apply_alpha(rgba other) const;
|
||||
rgba try_apply_alpha(rgba other) const;
|
||||
rgba apply_alpha_to(rgba other) const;
|
||||
rgba try_apply_alpha_to(rgba other) const;
|
||||
|
||||
private:
|
||||
/**
|
||||
|
@ -205,11 +205,7 @@ bar::bar(connection& conn, signal_emitter& emitter, const config& config, const
|
||||
* These are the base colors of the bar and cannot be alpha only
|
||||
* In that case, we just use the alpha channel on the default value.
|
||||
*/
|
||||
if (color.type() == rgba::ALPHA_ONLY) {
|
||||
return def.apply_alpha(color);
|
||||
} else {
|
||||
return color;
|
||||
}
|
||||
return color.try_apply_alpha_to(def);
|
||||
} catch (const exception& err) {
|
||||
throw application_error(sstream() << "Failed to set " << key << " (reason: " << err.what() << ")");
|
||||
}
|
||||
|
@ -259,7 +259,7 @@ void builder::font_close() {
|
||||
* Insert tag to alter the current background color
|
||||
*/
|
||||
void builder::background(rgba color) {
|
||||
color = m_bar.background.try_apply_alpha(color);
|
||||
color = color.try_apply_alpha_to(m_bar.background);
|
||||
|
||||
auto hex = color_util::simplify_hex(color);
|
||||
m_colors[syntaxtag::B] = hex;
|
||||
@ -278,7 +278,7 @@ void builder::background_close() {
|
||||
* Insert tag to alter the current foreground color
|
||||
*/
|
||||
void builder::color(rgba color) {
|
||||
color = m_bar.foreground.try_apply_alpha(color);
|
||||
color = color.try_apply_alpha_to(m_bar.foreground);
|
||||
|
||||
auto hex = color_util::simplify_hex(color);
|
||||
m_colors[syntaxtag::F] = hex;
|
||||
|
@ -140,21 +140,22 @@ bool rgba::has_color() const {
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the current alpha channel with the alpha channel of the other color
|
||||
*
|
||||
* Useful for ALPHA_ONLY colors
|
||||
* Applies the alpha channel of this color to the given color.
|
||||
*/
|
||||
rgba rgba::apply_alpha(rgba other) const {
|
||||
uint32_t val = (m_value & 0x00FFFFFF) | (((uint32_t)other.alpha_i()) << 24);
|
||||
rgba rgba::apply_alpha_to(rgba other) const {
|
||||
uint32_t val = (other.value() & 0x00FFFFFF) | (((uint32_t)alpha_i()) << 24);
|
||||
return rgba(val, m_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calls apply_alpha, if the given color is ALPHA_ONLY.
|
||||
* If this is an ALPHA_ONLY color, applies this alpha channel to the other
|
||||
* color, otherwise just returns this.
|
||||
*
|
||||
* \returns the new color if this is ALPHA_ONLY or a copy of this otherwise.
|
||||
*/
|
||||
rgba rgba::try_apply_alpha(rgba other) const {
|
||||
if (other.type() == ALPHA_ONLY) {
|
||||
return apply_alpha(other);
|
||||
rgba rgba::try_apply_alpha_to(rgba other) const {
|
||||
if (m_type == ALPHA_ONLY) {
|
||||
return apply_alpha_to(other);
|
||||
}
|
||||
|
||||
return *this;
|
||||
|
@ -96,16 +96,26 @@ TEST(Rgba, channel) {
|
||||
EXPECT_EQ(0x99 / 255.0, rgba{0x88449933}.green_d());
|
||||
}
|
||||
|
||||
TEST(Rgba, applyAlpha) {
|
||||
rgba v{0xCC123456};
|
||||
rgba modified = v.apply_alpha(rgba{0xAA000000, rgba::ALPHA_ONLY});
|
||||
TEST(Rgba, applyAlphaTo) {
|
||||
rgba v{0xAA000000, rgba::ALPHA_ONLY};
|
||||
rgba modified = v.apply_alpha_to(rgba{0xCC123456, rgba::ALPHA_ONLY});
|
||||
EXPECT_EQ(0xAA123456, modified.value());
|
||||
|
||||
v = rgba{0x00123456};
|
||||
modified = v.apply_alpha(rgba{0xCC999999});
|
||||
v = rgba{0xCC999999};
|
||||
modified = v.apply_alpha_to(rgba{0x00123456});
|
||||
EXPECT_EQ(0xCC123456, modified.value());
|
||||
}
|
||||
|
||||
TEST(Rgba, tryApplyAlphaTo) {
|
||||
rgba v{0xAA000000, rgba::ALPHA_ONLY};
|
||||
rgba modified = v.try_apply_alpha_to(rgba{0xCC123456, rgba::ALPHA_ONLY});
|
||||
EXPECT_EQ(0xAA123456, modified.value());
|
||||
|
||||
v = rgba{0xCC999999};
|
||||
modified = v.try_apply_alpha_to(rgba{0x00123456});
|
||||
EXPECT_EQ(0xCC999999, modified.value());
|
||||
}
|
||||
|
||||
TEST(ColorUtil, simplify) {
|
||||
EXPECT_EQ("#111", color_util::simplify_hex("#FF111111"));
|
||||
EXPECT_EQ("#234", color_util::simplify_hex("#ff223344"));
|
||||
|
Loading…
Reference in New Issue
Block a user