| @@ -395,6 +395,12 @@ Fl_Color fl_inactive(Fl_Color c) { | |||||
| return fl_color_average(c, FL_GRAY, .33f); | return fl_color_average(c, FL_GRAY, .33f); | ||||
| } | } | ||||
| static int get_luminosity ( Fl_Color c1 ) | |||||
| { | |||||
| return ((c1 >> 24) * 30 + ((c1 >> 16) & 255) * 59 + ((c1 >> 8) & 255) * 11) / 100; | |||||
| } | |||||
| /** | /** | ||||
| Returns a color that contrasts with the background color. | Returns a color that contrasts with the background color. | ||||
| This will be the foreground color if it contrasts sufficiently with the | This will be the foreground color if it contrasts sufficiently with the | ||||
| @@ -404,8 +410,8 @@ Fl_Color fl_inactive(Fl_Color c) { | |||||
| \return contrasting color | \return contrasting color | ||||
| */ | */ | ||||
| Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg) { | Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg) { | ||||
| unsigned c1, c2; // RGB colors | |||||
| int l1, l2; // Luminosities | |||||
| unsigned c1, c2, flbg, flfg; // RGB colors | |||||
| int l1, l2, l3, l4; // Luminosities | |||||
| // Get the RGB values for each color... | // Get the RGB values for each color... | ||||
| @@ -414,16 +420,26 @@ Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg) { | |||||
| if (bg & 0xffffff00) c2 = (unsigned)bg; | if (bg & 0xffffff00) c2 = (unsigned)bg; | ||||
| else c2 = fl_cmap[bg]; | else c2 = fl_cmap[bg]; | ||||
| if (FL_BACKGROUND_COLOR & 0xffffff00) flbg = (unsigned)FL_BACKGROUND_COLOR; | |||||
| else flbg = fl_cmap[FL_BACKGROUND_COLOR]; | |||||
| // Compute the luminosity... | |||||
| l1 = ((c1 >> 24) * 30 + ((c1 >> 16) & 255) * 59 + ((c1 >> 8) & 255) * 11) / 100; | |||||
| l2 = ((c2 >> 24) * 30 + ((c2 >> 16) & 255) * 59 + ((c2 >> 8) & 255) * 11) / 100; | |||||
| if (FL_FOREGROUND_COLOR & 0xffffff00) flfg = (unsigned)FL_FOREGROUND_COLOR; | |||||
| else flfg = fl_cmap[FL_FOREGROUND_COLOR]; | |||||
| // Compute the luminosity... | |||||
| l1 = get_luminosity(c1); | |||||
| l2 = get_luminosity(c2); | |||||
| l3 = get_luminosity(flbg); | |||||
| l4 = get_luminosity(flfg); | |||||
| // Compare and return the contrasting color... | // Compare and return the contrasting color... | ||||
| if ((l1 - l2) > 99) return fg; | if ((l1 - l2) > 99) return fg; | ||||
| else if ((l2 - l1) > 99) return fg; | else if ((l2 - l1) > 99) return fg; | ||||
| else if (l2 > 127) return FL_BLACK; | |||||
| else return FL_WHITE; | |||||
| else | |||||
| { | |||||
| return abs( l2 - l3 ) > abs( l2 - l4 ) ? FL_BACKGROUND_COLOR : FL_FOREGROUND_COLOR; | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @} | @} | ||||