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;
|
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:
|
||||||
/**
|
/**
|
||||||
|
@ -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() << ")");
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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"));
|
||||||
|
Loading…
Reference in New Issue
Block a user