Skip to content

Commit 811e8a4

Browse files
Update light color judgement by contrast ratio
1 parent 5348a05 commit 811e8a4

File tree

7 files changed

+49
-30
lines changed

7 files changed

+49
-30
lines changed

src/ui/Utils.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -710,9 +710,30 @@ namespace utils {
710710
+ juce::String{ num[6] } + juce::String{ num[7] };
711711
}
712712

713-
bool isLightColor(const juce::Colour& color) {
714-
float brightness = color.getRed() * 0.299 + color.getGreen() * 0.587 + color.getBlue() * 0.114;
715-
return brightness > 140;
713+
float colorLuminance(const juce::Colour& color) {
714+
auto normalize = [](int c) {
715+
float normalized = c / 255.0f;
716+
return (normalized <= 0.03928) ? normalized / 12.92 : std::pow((normalized + 0.055) / 1.055, 2.4);
717+
};
718+
return 0.2126f * normalize(color.getRed()) + 0.7152f * normalize(color.getGreen()) + 0.0722f * normalize(color.getBlue());
719+
}
720+
721+
float colorContrastRatio(float luminance1, float luminance2) {
722+
float L1 = std::max(luminance1, luminance2);
723+
float L2 = std::min(luminance1, luminance2);
724+
return (L1 + 0.05f) / (L2 + 0.05f);
725+
}
726+
727+
bool isLightColor(const juce::Colour& color,
728+
const juce::Colour& textColorLight, const juce::Colour& textColorDark) {
729+
float backgroundLuminance = colorLuminance(color);
730+
float darkLuminance = colorLuminance(textColorDark);
731+
float lightLuminance = colorLuminance(textColorLight);
732+
733+
float darkContrast = colorContrastRatio(backgroundLuminance, darkLuminance);
734+
float lightContrast = colorContrastRatio(backgroundLuminance, lightLuminance);
735+
736+
return darkContrast < lightContrast;
716737
}
717738

718739
const IntSectionList getUnionSections(const IntSectionList& source) {

src/ui/Utils.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,11 @@ namespace utils {
156156
const juce::String createTimeString(const TimeInSeconds& time);
157157
const juce::String createBeatString(const TimeInBeats& time);
158158

159-
bool isLightColor(const juce::Colour& color);
159+
float colorLuminance(const juce::Colour& color);
160+
float colorContrastRatio(float luminance1, float luminance2);
161+
bool isLightColor(const juce::Colour& color,
162+
const juce::Colour& textColorLight = juce::Colours::black,
163+
const juce::Colour& textColorDark = juce::Colours::white);
160164
using IntSection = std::pair<int, int>;
161165
using IntSectionList = juce::Array<IntSection>;
162166
const IntSectionList getUnionSections(const IntSectionList& source);

src/ui/component/editor/MIDIContentViewer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void MIDIContentViewer::update(int index, uint64_t ref) {
3636

3737
if (index >= 0) {
3838
this->trackColor = quickAPI::getSeqTrackColor(index);
39-
this->trackColorIsLight = utils::isLightColor(this->trackColor);
39+
//this->trackColorIsLight = utils::isLightColor(this->trackColor);
4040

4141
/** Note Color Gradient */
4242
auto& laf = this->getLookAndFeel();

src/ui/component/editor/MIDIContentViewer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class MIDIContentViewer final
103103
std::unique_ptr<juce::Image> noteTemp = nullptr;
104104

105105
juce::Colour trackColor;
106-
bool trackColorIsLight = false;
106+
//bool trackColorIsLight = false;
107107
juce::Array<juce::Colour> noteColorGradient;
108108

109109
void updateKeyImageTemp();

src/ui/component/mixer/MixerTrackComponent.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -289,14 +289,12 @@ void MixerTrackComponent::update(int index) {
289289
this->trackColor = quickAPI::getMixerTrackColor(index);
290290

291291
auto& laf = this->getLookAndFeel();
292-
if (utils::isLightColor(this->trackColor)) {
293-
this->nameColor = laf.findColour(
294-
juce::Label::ColourIds::textWhenEditingColourId);
295-
}
296-
else {
297-
this->nameColor = laf.findColour(
298-
juce::Label::ColourIds::textColourId);
299-
}
292+
auto textColorLight = laf.findColour(
293+
juce::Label::ColourIds::textWhenEditingColourId);
294+
auto textColorDark = laf.findColour(
295+
juce::Label::ColourIds::textColourId);
296+
this->nameColor = utils::isLightColor(this->trackColor, textColorLight, textColorDark)
297+
? textColorLight : textColorDark;
300298

301299
this->sideChain->update(index);
302300

src/ui/component/sequencer/SeqTrackComponent.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,12 @@ void SeqTrackComponent::update(int index) {
130130
this->trackColor = quickAPI::getSeqTrackColor(index);
131131

132132
auto& laf = this->getLookAndFeel();
133-
if (utils::isLightColor(this->trackColor)) {
134-
this->idColor = laf.findColour(
135-
juce::Label::ColourIds::textWhenEditingColourId);
136-
}
137-
else {
138-
this->idColor = laf.findColour(
139-
juce::Label::ColourIds::textColourId);
140-
}
133+
auto textColorLight = laf.findColour(
134+
juce::Label::ColourIds::textWhenEditingColourId);
135+
auto textColorDark = laf.findColour(
136+
juce::Label::ColourIds::textColourId);
137+
this->idColor = utils::isLightColor(this->trackColor, textColorLight, textColorDark)
138+
? textColorLight : textColorDark;
141139

142140
auto name = quickAPI::getSeqTrackName(index);
143141
if (name.isEmpty()) {

src/ui/component/sequencer/SeqTrackContentViewer.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,12 @@ void SeqTrackContentViewer::update(int index) {
7171
this->trackColor = quickAPI::getSeqTrackColor(index);
7272

7373
auto& laf = this->getLookAndFeel();
74-
if (utils::isLightColor(this->trackColor)) {
75-
this->nameColor = laf.findColour(
76-
juce::Label::ColourIds::textWhenEditingColourId);
77-
}
78-
else {
79-
this->nameColor = laf.findColour(
80-
juce::Label::ColourIds::textColourId);
81-
}
74+
auto textColorLight = laf.findColour(
75+
juce::Label::ColourIds::textWhenEditingColourId);
76+
auto textColorDark = laf.findColour(
77+
juce::Label::ColourIds::textColourId);
78+
this->nameColor = utils::isLightColor(this->trackColor, textColorLight, textColorDark)
79+
? textColorLight : textColorDark;
8280

8381
if (changeData) {
8482
this->updateDataRef();

0 commit comments

Comments
 (0)