Put a default implementation of parse_color() in Fl_Screen_Driver and only Fl_X11_Screen_Driver reimplements it.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12628 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2018-01-09 07:26:49 +00:00
parent 9f0e9ff813
commit 3b437dae8c
8 changed files with 28 additions and 61 deletions

View File

@ -92,7 +92,8 @@ public:
virtual int ready() = 0;
virtual void grab(Fl_Window* win) = 0;
// --- global colors
virtual int parse_color(const char* p, uchar& r, uchar& g, uchar& b) = 0;
/* the default implementation of parse_color() may be enough */
virtual int parse_color(const char* p, uchar& r, uchar& g, uchar& b);
virtual void get_system_colors() = 0;
virtual const char *get_system_scheme();
// --- global timers

View File

@ -495,6 +495,31 @@ void Fl_Screen_Driver::open_display()
}
}
// simulation of XParseColor:
int Fl_Screen_Driver::parse_color(const char* p, uchar& r, uchar& g, uchar& b)
{
if (*p == '#') p++;
size_t n = strlen(p);
size_t m = n/3;
const char *pattern = 0;
switch(m) {
case 1: pattern = "%1x%1x%1x"; break;
case 2: pattern = "%2x%2x%2x"; break;
case 3: pattern = "%3x%3x%3x"; break;
case 4: pattern = "%4x%4x%4x"; break;
default: return 0;
}
int R,G,B; if (sscanf(p,pattern,&R,&G,&B) != 3) return 0;
switch(m) {
case 1: R *= 0x11; G *= 0x11; B *= 0x11; break;
case 3: R >>= 4; G >>= 4; B >>= 4; break;
case 4: R >>= 8; G >>= 8; B >>= 8; break;
}
r = (uchar)R; g = (uchar)G; b = (uchar)B;
return 1;
}
//
// End of "$Id$".
//

View File

@ -74,7 +74,6 @@ public:
virtual int ready();
virtual void grab(Fl_Window* win);
// --- global colors
virtual int parse_color(const char* p, uchar& r, uchar& g, uchar& b);
virtual void get_system_colors();
virtual const char *get_system_scheme();
// --- global timers

View File

@ -167,31 +167,6 @@ void Fl_Cocoa_Screen_Driver::grab(Fl_Window* win)
}
// simulation of XParseColor:
int Fl_Cocoa_Screen_Driver::parse_color(const char* p, uchar& r, uchar& g, uchar& b)
{
if (*p == '#') p++;
size_t n = strlen(p);
size_t m = n/3;
const char *pattern = 0;
switch(m) {
case 1: pattern = "%1x%1x%1x"; break;
case 2: pattern = "%2x%2x%2x"; break;
case 3: pattern = "%3x%3x%3x"; break;
case 4: pattern = "%4x%4x%4x"; break;
default: return 0;
}
int R,G,B; if (sscanf(p,pattern,&R,&G,&B) != 3) return 0;
switch(m) {
case 1: R *= 0x11; G *= 0x11; B *= 0x11; break;
case 3: R >>= 4; G >>= 4; B >>= 4; break;
case 4: R >>= 8; G >>= 8; B >>= 8; break;
}
r = (uchar)R; g = (uchar)G; b = (uchar)B;
return 1;
}
static void set_selection_color(uchar r, uchar g, uchar b)
{
Fl::set_color(FL_SELECTION_COLOR,r,g,b);

View File

@ -48,7 +48,6 @@ public:
virtual int ready();
virtual void grab(Fl_Window* win);
// --- global colors
virtual int parse_color(const char* p, uchar& r, uchar& g, uchar& b);
virtual void get_system_colors();
// --- global timers
virtual void add_timeout(double time, Fl_Timeout_Handler cb, void *argp);

View File

@ -108,12 +108,6 @@ void Fl_Pico_Screen_Driver::grab(Fl_Window* win)
}
int Fl_Pico_Screen_Driver::parse_color(const char* p, uchar& r, uchar& g, uchar& b)
{
return 0;
}
void Fl_Pico_Screen_Driver::get_system_colors()
{
}
@ -142,4 +136,4 @@ void Fl_Pico_Screen_Driver::remove_timeout(Fl_Timeout_Handler cb, void *argp)
//
// End of "$Id$".
//
//

View File

@ -70,7 +70,6 @@ public:
virtual int ready();
virtual void grab(Fl_Window* win);
// --- global colors
virtual int parse_color(const char* p, uchar& r, uchar& g, uchar& b);
virtual void get_system_colors();
virtual const char *get_system_scheme();
// --- global timers

View File

@ -299,31 +299,6 @@ void Fl_WinAPI_Screen_Driver::grab(Fl_Window* win)
}
// simulation of XParseColor:
int Fl_WinAPI_Screen_Driver::parse_color(const char* p, uchar& r, uchar& g, uchar& b)
{
if (*p == '#') p++;
size_t n = strlen(p);
size_t m = n/3;
const char *pattern = 0;
switch(m) {
case 1: pattern = "%1x%1x%1x"; break;
case 2: pattern = "%2x%2x%2x"; break;
case 3: pattern = "%3x%3x%3x"; break;
case 4: pattern = "%4x%4x%4x"; break;
default: return 0;
}
int R,G,B; if (sscanf(p,pattern,&R,&G,&B) != 3) return 0;
switch(m) {
case 1: R *= 0x11; G *= 0x11; B *= 0x11; break;
case 3: R >>= 4; G >>= 4; B >>= 4; break;
case 4: R >>= 8; G >>= 8; B >>= 8; break;
}
r = (uchar)R; g = (uchar)G; b = (uchar)B;
return 1;
}
static void set_selection_color(uchar r, uchar g, uchar b)
{
Fl::set_color(FL_SELECTION_COLOR,r,g,b);