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:
patrick96 2020-12-01 14:49:41 +01:00
parent 52eee95bf8
commit e89da58940
No known key found for this signature in database
GPG Key ID: 521E5E03AEBCA1A7
5 changed files with 30 additions and 23 deletions

View File

@ -35,8 +35,8 @@ class rgba {
uint8_t blue_i() const; uint8_t blue_i() const;
bool has_color() const; bool has_color() const;
rgba apply_alpha(rgba other) const; rgba apply_alpha_to(rgba other) const;
rgba try_apply_alpha(rgba other) const; rgba try_apply_alpha_to(rgba other) const;
private: private:
/** /**

View File

@ -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 * 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. * In that case, we just use the alpha channel on the default value.
*/ */
if (color.type() == rgba::ALPHA_ONLY) { return color.try_apply_alpha_to(def);
return def.apply_alpha(color);
} else {
return color;
}
} catch (const exception& err) { } catch (const exception& err) {
throw application_error(sstream() << "Failed to set " << key << " (reason: " << err.what() << ")"); throw application_error(sstream() << "Failed to set " << key << " (reason: " << err.what() << ")");
} }

View File

@ -259,7 +259,7 @@ void builder::font_close() {
* Insert tag to alter the current background color * Insert tag to alter the current background color
*/ */
void builder::background(rgba 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); auto hex = color_util::simplify_hex(color);
m_colors[syntaxtag::B] = hex; m_colors[syntaxtag::B] = hex;
@ -278,7 +278,7 @@ void builder::background_close() {
* Insert tag to alter the current foreground color * Insert tag to alter the current foreground color
*/ */
void builder::color(rgba 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); auto hex = color_util::simplify_hex(color);
m_colors[syntaxtag::F] = hex; m_colors[syntaxtag::F] = hex;

View File

@ -140,21 +140,22 @@ bool rgba::has_color() const {
} }
/** /**
* Replaces the current alpha channel with the alpha channel of the other color * Applies the alpha channel of this color to the given color.
*
* Useful for ALPHA_ONLY colors
*/ */
rgba rgba::apply_alpha(rgba other) const { rgba rgba::apply_alpha_to(rgba other) const {
uint32_t val = (m_value & 0x00FFFFFF) | (((uint32_t)other.alpha_i()) << 24); uint32_t val = (other.value() & 0x00FFFFFF) | (((uint32_t)alpha_i()) << 24);
return rgba(val, m_type); 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 { rgba rgba::try_apply_alpha_to(rgba other) const {
if (other.type() == ALPHA_ONLY) { if (m_type == ALPHA_ONLY) {
return apply_alpha(other); return apply_alpha_to(other);
} }
return *this; return *this;

View File

@ -96,16 +96,26 @@ TEST(Rgba, channel) {
EXPECT_EQ(0x99 / 255.0, rgba{0x88449933}.green_d()); EXPECT_EQ(0x99 / 255.0, rgba{0x88449933}.green_d());
} }
TEST(Rgba, applyAlpha) { TEST(Rgba, applyAlphaTo) {
rgba v{0xCC123456}; rgba v{0xAA000000, rgba::ALPHA_ONLY};
rgba modified = v.apply_alpha(rgba{0xAA000000, rgba::ALPHA_ONLY}); rgba modified = v.apply_alpha_to(rgba{0xCC123456, rgba::ALPHA_ONLY});
EXPECT_EQ(0xAA123456, modified.value()); EXPECT_EQ(0xAA123456, modified.value());
v = rgba{0x00123456}; v = rgba{0xCC999999};
modified = v.apply_alpha(rgba{0xCC999999}); modified = v.apply_alpha_to(rgba{0x00123456});
EXPECT_EQ(0xCC123456, modified.value()); 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) { TEST(ColorUtil, simplify) {
EXPECT_EQ("#111", color_util::simplify_hex("#FF111111")); EXPECT_EQ("#111", color_util::simplify_hex("#FF111111"));
EXPECT_EQ("#234", color_util::simplify_hex("#ff223344")); EXPECT_EQ("#234", color_util::simplify_hex("#ff223344"));