Move gfxmenu color handling to video, so that gfxterm can use it

too.

* grub-core/gfxmenu/named_colors.c: Move to ...
* grub-core/video/colors.c: ... here.  Rename
grub_gui_get_named_color to grub_video_get_named_color.
* grub-core/gfxmenu/gui_string_util.c (my_isxdigit): Move to ...
* grub-core/video/colors.c (my_isxdigit): ... here.
* grub-core/gfxmenu/gui_string_util.c (parse_hex_color_component):
Move to ...
* grub-core/video/colors.c (parse_hex_color_component): ... here.
* grub-core/gfxmenu/gui_string_util.c (grub_gui_parse_color): Move
to ...
* grub-core/video/colors.c (grub_video_parse_color): ... here.

* include/grub/gui.h (grub_gui_color_t): Move to ...
* include/grub/video.h (grub_video_rgba_color_t): ... here.
* include/grub/gui.h (grub_gui_color_rgb): Move to ...
* include/grub/video.h (grub_video_rgba_color_rgb): ... here.
* include/grub/gui.h (grub_gui_map_color): Move to ...
* include/grub/video.h (grub_video_map_rgba_color): ... here.
* include/grub/gui_string_util.h (grub_gui_get_named_color): Move
to ...
* include/grub/video.h (grub_video_get_named_color): ... here.
* include/grub/gui_string_util.h (grub_gui_parse_color): Move to ...
* include/grub/video.h (grub_video_parse_color): ... here.

* grub-core/Makefile.core.def (kernel) [videoinkernel]: Add
video/colors.c.
(gfxmenu): Remove gfxmenu/named_colors.c.
(video_colors) [videomodules]: New module, containing
video/colors.c.
This commit is contained in:
Colin Watson 2010-12-10 16:45:58 +00:00
parent 5367ecd305
commit 52832c554c
13 changed files with 240 additions and 198 deletions

34
ChangeLog.parse-color Normal file
View file

@ -0,0 +1,34 @@
2010-12-10 Colin Watson <cjwatson@ubuntu.com>
Move gfxmenu color handling to video, so that gfxterm can use it
too.
* grub-core/gfxmenu/named_colors.c: Move to ...
* grub-core/video/colors.c: ... here. Rename
grub_gui_get_named_color to grub_video_get_named_color.
* grub-core/gfxmenu/gui_string_util.c (my_isxdigit): Move to ...
* grub-core/video/colors.c (my_isxdigit): ... here.
* grub-core/gfxmenu/gui_string_util.c (parse_hex_color_component):
Move to ...
* grub-core/video/colors.c (parse_hex_color_component): ... here.
* grub-core/gfxmenu/gui_string_util.c (grub_gui_parse_color): Move
to ...
* grub-core/video/colors.c (grub_video_parse_color): ... here.
* include/grub/gui.h (grub_gui_color_t): Move to ...
* include/grub/video.h (grub_video_rgba_color_t): ... here.
* include/grub/gui.h (grub_gui_color_rgb): Move to ...
* include/grub/video.h (grub_video_rgba_color_rgb): ... here.
* include/grub/gui.h (grub_gui_map_color): Move to ...
* include/grub/video.h (grub_video_map_rgba_color): ... here.
* include/grub/gui_string_util.h (grub_gui_get_named_color): Move
to ...
* include/grub/video.h (grub_video_get_named_color): ... here.
* include/grub/gui_string_util.h (grub_gui_parse_color): Move to ...
* include/grub/video.h (grub_video_parse_color): ... here.
* grub-core/Makefile.core.def (kernel) [videoinkernel]: Add
video/colors.c.
(gfxmenu): Remove gfxmenu/named_colors.c.
(video_colors) [videomodules]: New module, containing
video/colors.c.

View file

@ -178,6 +178,7 @@ kernel = {
videoinkernel = io/bufio.c; videoinkernel = io/bufio.c;
videoinkernel = video/bitmap.c; videoinkernel = video/bitmap.c;
videoinkernel = video/bitmap_scale.c; videoinkernel = video/bitmap_scale.c;
videoinkernel = video/colors.c;
videoinkernel = video/fb/fbblit.c; videoinkernel = video/fb/fbblit.c;
videoinkernel = video/fb/fbfill.c; videoinkernel = video/fb/fbfill.c;
videoinkernel = video/fb/fbutil.c; videoinkernel = video/fb/fbutil.c;
@ -1049,7 +1050,6 @@ module = {
common = gfxmenu/gui_progress_bar.c; common = gfxmenu/gui_progress_bar.c;
common = gfxmenu/gui_util.c; common = gfxmenu/gui_util.c;
common = gfxmenu/gui_string_util.c; common = gfxmenu/gui_string_util.c;
common = gfxmenu/named_colors.c;
}; };
module = { module = {
@ -1442,6 +1442,12 @@ module = {
enable = i386_pc; enable = i386_pc;
}; };
module = {
name = video_colors;
common = video/colors.c;
enable = videomodules;
};
module = { module = {
name = video_fb; name = video_fb;
common = video/fb/video_fb.c; common = video/fb/video_fb.c;

View file

@ -48,7 +48,7 @@ struct grub_gui_label
char *text; char *text;
char *template; char *template;
grub_font_t font; grub_font_t font;
grub_gui_color_t color; grub_video_rgba_color_t color;
int value; int value;
enum align_mode align; enum align_mode align;
}; };
@ -107,7 +107,7 @@ label_paint (void *vself, const grub_video_rect_t *region)
grub_gui_set_viewport (&self->bounds, &vpsave); grub_gui_set_viewport (&self->bounds, &vpsave);
grub_font_draw_string (self->text, grub_font_draw_string (self->text,
self->font, self->font,
grub_gui_map_color (self->color), grub_video_map_rgba_color (self->color),
left_x, left_x,
grub_font_get_ascent (self->font)); grub_font_get_ascent (self->font));
grub_gui_restore_viewport (&vpsave); grub_gui_restore_viewport (&vpsave);
@ -186,7 +186,7 @@ label_set_property (void *vself, const char *name, const char *value)
} }
else if (grub_strcmp (name, "color") == 0) else if (grub_strcmp (name, "color") == 0)
{ {
grub_gui_parse_color (value, &self->color); grub_video_parse_color (value, &self->color);
} }
else if (grub_strcmp (name, "align") == 0) else if (grub_strcmp (name, "align") == 0)
{ {

View file

@ -41,9 +41,9 @@ struct grub_gui_list_impl
int item_spacing; int item_spacing;
grub_font_t item_font; grub_font_t item_font;
grub_font_t selected_item_font; grub_font_t selected_item_font;
grub_gui_color_t item_color; grub_video_rgba_color_t item_color;
int selected_item_color_set; int selected_item_color_set;
grub_gui_color_t selected_item_color; grub_video_rgba_color_t selected_item_color;
int draw_scrollbar; int draw_scrollbar;
int need_to_recreate_scrollbar; int need_to_recreate_scrollbar;
@ -267,13 +267,13 @@ draw_menu (list_impl_t self, int num_shown_items)
(is_selected && self->selected_item_font (is_selected && self->selected_item_font
? self->selected_item_font ? self->selected_item_font
: self->item_font); : self->item_font);
grub_gui_color_t text_color = grub_video_rgba_color_t text_color =
((is_selected && self->selected_item_color_set) ((is_selected && self->selected_item_color_set)
? self->selected_item_color ? self->selected_item_color
: self->item_color); : self->item_color);
grub_font_draw_string (item_title, grub_font_draw_string (item_title,
font, font,
grub_gui_map_color (text_color), grub_video_map_rgba_color (text_color),
sel_leftpad + self->icon_width + icon_text_space, sel_leftpad + self->icon_width + icon_text_space,
(item_top + (item_height - (ascent + descent)) (item_top + (item_height - (ascent + descent))
/ 2 + ascent)); / 2 + ascent));
@ -429,7 +429,7 @@ list_set_property (void *vself, const char *name, const char *value)
} }
else if (grub_strcmp (name, "item_color") == 0) else if (grub_strcmp (name, "item_color") == 0)
{ {
grub_gui_parse_color (value, &self->item_color); grub_video_parse_color (value, &self->item_color);
} }
else if (grub_strcmp (name, "selected_item_color") == 0) else if (grub_strcmp (name, "selected_item_color") == 0)
{ {
@ -439,7 +439,7 @@ list_set_property (void *vself, const char *name, const char *value)
} }
else else
{ {
if (grub_gui_parse_color (value, &self->selected_item_color) if (grub_video_parse_color (value, &self->selected_item_color)
== GRUB_ERR_NONE) == GRUB_ERR_NONE)
self->selected_item_color_set = 1; self->selected_item_color_set = 1;
} }
@ -562,7 +562,7 @@ grub_gui_list_new (void)
{ {
list_impl_t self; list_impl_t self;
grub_font_t default_font; grub_font_t default_font;
grub_gui_color_t default_fg_color; grub_video_rgba_color_t default_fg_color;
self = grub_zalloc (sizeof (*self)); self = grub_zalloc (sizeof (*self));
if (! self) if (! self)
@ -574,7 +574,7 @@ grub_gui_list_new (void)
self->visible = 1; self->visible = 1;
default_font = grub_font_get ("Unknown Regular 16"); default_font = grub_font_get ("Unknown Regular 16");
default_fg_color = grub_gui_color_rgb (0, 0, 0); default_fg_color = grub_video_rgba_color_rgb (0, 0, 0);
self->icon_width = 32; self->icon_width = 32;
self->icon_height = 32; self->icon_height = 32;

View file

@ -40,10 +40,10 @@ struct grub_gui_progress_bar
int show_text; int show_text;
char *template; char *template;
grub_font_t font; grub_font_t font;
grub_gui_color_t text_color; grub_video_rgba_color_t text_color;
grub_gui_color_t border_color; grub_video_rgba_color_t border_color;
grub_gui_color_t bg_color; grub_video_rgba_color_t bg_color;
grub_gui_color_t fg_color; grub_video_rgba_color_t fg_color;
char *theme_dir; char *theme_dir;
int need_to_recreate_pixmaps; int need_to_recreate_pixmaps;
@ -109,7 +109,7 @@ draw_filled_rect_bar (grub_gui_progress_bar_t self)
f.height = self->bounds.height - 2; f.height = self->bounds.height - 2;
/* Border. */ /* Border. */
grub_video_fill_rect (grub_gui_map_color (self->border_color), grub_video_fill_rect (grub_video_map_rgba_color (self->border_color),
f.x - 1, f.y - 1, f.x - 1, f.y - 1,
f.width + 2, f.height + 2); f.width + 2, f.height + 2);
@ -117,12 +117,12 @@ draw_filled_rect_bar (grub_gui_progress_bar_t self)
int barwidth = (f.width int barwidth = (f.width
* (self->value - self->start) * (self->value - self->start)
/ (self->end - self->start)); / (self->end - self->start));
grub_video_fill_rect (grub_gui_map_color (self->bg_color), grub_video_fill_rect (grub_video_map_rgba_color (self->bg_color),
f.x + barwidth, f.y, f.x + barwidth, f.y,
f.width - barwidth, f.height); f.width - barwidth, f.height);
/* Bar foreground. */ /* Bar foreground. */
grub_video_fill_rect (grub_gui_map_color (self->fg_color), grub_video_fill_rect (grub_video_map_rgba_color (self->fg_color),
f.x, f.y, f.x, f.y,
barwidth, f.height); barwidth, f.height);
} }
@ -161,7 +161,8 @@ draw_text (grub_gui_progress_bar_t self)
if (self->template) if (self->template)
{ {
grub_font_t font = self->font; grub_font_t font = self->font;
grub_video_color_t text_color = grub_gui_map_color (self->text_color); grub_video_color_t text_color =
grub_video_map_rgba_color (self->text_color);
int width = self->bounds.width; int width = self->bounds.width;
int height = self->bounds.height; int height = self->bounds.height;
char *text; char *text;
@ -298,19 +299,19 @@ progress_bar_set_property (void *vself, const char *name, const char *value)
} }
else if (grub_strcmp (name, "text_color") == 0) else if (grub_strcmp (name, "text_color") == 0)
{ {
grub_gui_parse_color (value, &self->text_color); grub_video_parse_color (value, &self->text_color);
} }
else if (grub_strcmp (name, "border_color") == 0) else if (grub_strcmp (name, "border_color") == 0)
{ {
grub_gui_parse_color (value, &self->border_color); grub_video_parse_color (value, &self->border_color);
} }
else if (grub_strcmp (name, "bg_color") == 0) else if (grub_strcmp (name, "bg_color") == 0)
{ {
grub_gui_parse_color (value, &self->bg_color); grub_video_parse_color (value, &self->bg_color);
} }
else if (grub_strcmp (name, "fg_color") == 0) else if (grub_strcmp (name, "fg_color") == 0)
{ {
grub_gui_parse_color (value, &self->fg_color); grub_video_parse_color (value, &self->fg_color);
} }
else if (grub_strcmp (name, "bar_style") == 0) else if (grub_strcmp (name, "bar_style") == 0)
{ {
@ -379,9 +380,9 @@ grub_gui_progress_bar_new (void)
self->progress.component.ops = &progress_bar_ops; self->progress.component.ops = &progress_bar_ops;
self->visible = 1; self->visible = 1;
self->font = grub_font_get ("Unknown Regular 16"); self->font = grub_font_get ("Unknown Regular 16");
grub_gui_color_t black = { .red = 0, .green = 0, .blue = 0, .alpha = 255 }; grub_video_rgba_color_t black = { .red = 0, .green = 0, .blue = 0, .alpha = 255 };
grub_gui_color_t gray = { .red = 128, .green = 128, .blue = 128, .alpha = 255 }; grub_video_rgba_color_t gray = { .red = 128, .green = 128, .blue = 128, .alpha = 255 };
grub_gui_color_t lightgray = { .red = 200, .green = 200, .blue = 200, .alpha = 255 }; grub_video_rgba_color_t lightgray = { .red = 200, .green = 200, .blue = 200, .alpha = 255 };
self->text_color = black; self->text_color = black;
self->border_color = black; self->border_color = black;
self->bg_color = gray; self->bg_color = gray;

View file

@ -204,124 +204,3 @@ grub_get_dirname (const char *file_path)
return grub_new_substring (file_path, 0, last_slash + 1); return grub_new_substring (file_path, 0, last_slash + 1);
} }
static __inline int
my_isxdigit (char c)
{
return ((c >= '0' && c <= '9')
|| (c >= 'a' && c <= 'f')
|| (c >= 'A' && c <= 'F'));
}
static int
parse_hex_color_component (const char *s, unsigned start, unsigned end)
{
unsigned len;
char buf[3];
len = end - start;
/* Check the limits so we don't overrun the buffer. */
if (len < 1 || len > 2)
return 0;
if (len == 1)
{
buf[0] = s[start]; /* Get the first and only hex digit. */
buf[1] = buf[0]; /* Duplicate the hex digit. */
}
else if (len == 2)
{
buf[0] = s[start];
buf[1] = s[start + 1];
}
buf[2] = '\0';
return grub_strtoul (buf, 0, 16);
}
/* Parse a color string of the form "r, g, b", "#RGB", "#RGBA",
"#RRGGBB", or "#RRGGBBAA". */
grub_err_t
grub_gui_parse_color (const char *s, grub_gui_color_t *color)
{
grub_gui_color_t c;
/* Skip whitespace. */
while (*s && grub_isspace (*s))
s++;
if (*s == '#')
{
/* HTML-style. Number if hex digits:
[6] #RRGGBB [3] #RGB
[8] #RRGGBBAA [4] #RGBA */
s++; /* Skip the '#'. */
/* Count the hexits to determine the format. */
int hexits = 0;
const char *end = s;
while (my_isxdigit (*end))
{
end++;
hexits++;
}
/* Parse the color components based on the format. */
if (hexits == 3 || hexits == 4)
{
c.red = parse_hex_color_component (s, 0, 1);
c.green = parse_hex_color_component (s, 1, 2);
c.blue = parse_hex_color_component (s, 2, 3);
if (hexits == 4)
c.alpha = parse_hex_color_component (s, 3, 4);
else
c.alpha = 255;
}
else if (hexits == 6 || hexits == 8)
{
c.red = parse_hex_color_component (s, 0, 2);
c.green = parse_hex_color_component (s, 2, 4);
c.blue = parse_hex_color_component (s, 4, 6);
if (hexits == 8)
c.alpha = parse_hex_color_component (s, 6, 8);
else
c.alpha = 255;
}
else
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"invalid HTML-type color string `%s'", s);
}
else if (grub_isdigit (*s))
{
/* Comma separated decimal values. */
c.red = grub_strtoul (s, 0, 0);
if ((s = grub_strchr (s, ',')) == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"missing 1st comma separator in color `%s'", s);
s++;
c.green = grub_strtoul (s, 0, 0);
if ((s = grub_strchr (s, ',')) == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"missing 2nd comma separator in color `%s'", s);
s++;
c.blue = grub_strtoul (s, 0, 0);
if ((s = grub_strchr (s, ',')) == 0)
c.alpha = 255;
else
{
s++;
c.alpha = grub_strtoul (s, 0, 0);
}
}
else
{
if (! grub_gui_get_named_color (s, &c))
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"invalid named color `%s'", s);
}
if (grub_errno == GRUB_ERR_NONE)
*color = c;
return grub_errno;
}

View file

@ -135,11 +135,11 @@ theme_set_string (grub_gfxmenu_view_t view,
return grub_errno; return grub_errno;
} }
else if (! grub_strcmp ("title-color", name)) else if (! grub_strcmp ("title-color", name))
grub_gui_parse_color (value, &view->title_color); grub_video_parse_color (value, &view->title_color);
else if (! grub_strcmp ("message-color", name)) else if (! grub_strcmp ("message-color", name))
grub_gui_parse_color (value, &view->message_color); grub_video_parse_color (value, &view->message_color);
else if (! grub_strcmp ("message-bg-color", name)) else if (! grub_strcmp ("message-bg-color", name))
grub_gui_parse_color (value, &view->message_bg_color); grub_video_parse_color (value, &view->message_bg_color);
else if (! grub_strcmp ("desktop-image", name)) else if (! grub_strcmp ("desktop-image", name))
{ {
struct grub_video_bitmap *raw_bitmap; struct grub_video_bitmap *raw_bitmap;
@ -170,7 +170,7 @@ theme_set_string (grub_gfxmenu_view_t view,
view->desktop_image = scaled_bitmap; view->desktop_image = scaled_bitmap;
} }
else if (! grub_strcmp ("desktop-color", name)) else if (! grub_strcmp ("desktop-color", name))
grub_gui_parse_color (value, &view->desktop_color); grub_video_parse_color (value, &view->desktop_color);
else if (! grub_strcmp ("terminal-box", name)) else if (! grub_strcmp ("terminal-box", name))
{ {
grub_err_t err; grub_err_t err;

View file

@ -50,8 +50,8 @@ grub_gfxmenu_view_new (const char *theme_path,
{ {
grub_gfxmenu_view_t view; grub_gfxmenu_view_t view;
grub_font_t default_font; grub_font_t default_font;
grub_gui_color_t default_fg_color; grub_video_rgba_color_t default_fg_color;
grub_gui_color_t default_bg_color; grub_video_rgba_color_t default_bg_color;
view = grub_malloc (sizeof (*view)); view = grub_malloc (sizeof (*view));
if (! view) if (! view)
@ -63,8 +63,8 @@ grub_gfxmenu_view_new (const char *theme_path,
view->screen.height = height; view->screen.height = height;
default_font = grub_font_get ("Unknown Regular 16"); default_font = grub_font_get ("Unknown Regular 16");
default_fg_color = grub_gui_color_rgb (0, 0, 0); default_fg_color = grub_video_rgba_color_rgb (0, 0, 0);
default_bg_color = grub_gui_color_rgb (255, 255, 255); default_bg_color = grub_video_rgba_color_rgb (255, 255, 255);
view->canvas = 0; view->canvas = 0;
@ -131,7 +131,7 @@ redraw_background (grub_gfxmenu_view_t view,
} }
else else
{ {
grub_video_fill_rect (grub_gui_map_color (view->desktop_color), grub_video_fill_rect (grub_video_map_rgba_color (view->desktop_color),
bounds->x, bounds->y, bounds->x, bounds->y,
bounds->width, bounds->height); bounds->width, bounds->height);
} }
@ -150,7 +150,7 @@ draw_title (grub_gfxmenu_view_t view)
int y = 40 + grub_font_get_ascent (view->title_font); int y = 40 + grub_font_get_ascent (view->title_font);
grub_font_draw_string (view->title_text, grub_font_draw_string (view->title_text,
view->title_font, view->title_font,
grub_gui_map_color (view->title_color), grub_video_map_rgba_color (view->title_color),
x, y); x, y);
} }
@ -244,13 +244,13 @@ draw_message (grub_gfxmenu_view_t view)
return; return;
grub_font_t font = view->message_font; grub_font_t font = view->message_font;
grub_video_color_t color = grub_gui_map_color (view->message_color); grub_video_color_t color = grub_video_map_rgba_color (view->message_color);
/* Border. */ /* Border. */
grub_video_fill_rect (color, grub_video_fill_rect (color,
f.x-1, f.y-1, f.width+2, f.height+2); f.x-1, f.y-1, f.width+2, f.height+2);
/* Fill. */ /* Fill. */
grub_video_fill_rect (grub_gui_map_color (view->message_bg_color), grub_video_fill_rect (grub_video_map_rgba_color (view->message_bg_color),
f.x, f.y, f.width, f.height); f.x, f.y, f.width, f.height);
/* Center the text. */ /* Center the text. */

View file

@ -25,7 +25,7 @@
struct named_color struct named_color
{ {
const char *name; const char *name;
grub_gui_color_t color; grub_video_rgba_color_t color;
}; };
/* /*
@ -193,8 +193,8 @@ static struct named_color named_colors[] =
stores the color into *COLOR. If the color was not found, returns 0 and stores the color into *COLOR. If the color was not found, returns 0 and
does not modify *COLOR. */ does not modify *COLOR. */
int int
grub_gui_get_named_color (const char *name, grub_video_get_named_color (const char *name,
grub_gui_color_t *color) grub_video_rgba_color_t *color)
{ {
int i; int i;
for (i = 0; named_colors[i].name; i++) for (i = 0; named_colors[i].name; i++)
@ -207,3 +207,124 @@ grub_gui_get_named_color (const char *name,
} }
return 0; return 0;
} }
static __inline int
my_isxdigit (char c)
{
return ((c >= '0' && c <= '9')
|| (c >= 'a' && c <= 'f')
|| (c >= 'A' && c <= 'F'));
}
static int
parse_hex_color_component (const char *s, unsigned start, unsigned end)
{
unsigned len;
char buf[3];
len = end - start;
/* Check the limits so we don't overrun the buffer. */
if (len < 1 || len > 2)
return 0;
if (len == 1)
{
buf[0] = s[start]; /* Get the first and only hex digit. */
buf[1] = buf[0]; /* Duplicate the hex digit. */
}
else if (len == 2)
{
buf[0] = s[start];
buf[1] = s[start + 1];
}
buf[2] = '\0';
return grub_strtoul (buf, 0, 16);
}
/* Parse a color string of the form "r, g, b", "#RGB", "#RGBA",
"#RRGGBB", or "#RRGGBBAA". */
grub_err_t
grub_video_parse_color (const char *s, grub_video_rgba_color_t *color)
{
grub_video_rgba_color_t c;
/* Skip whitespace. */
while (*s && grub_isspace (*s))
s++;
if (*s == '#')
{
/* HTML-style. Number if hex digits:
[6] #RRGGBB [3] #RGB
[8] #RRGGBBAA [4] #RGBA */
s++; /* Skip the '#'. */
/* Count the hexits to determine the format. */
int hexits = 0;
const char *end = s;
while (my_isxdigit (*end))
{
end++;
hexits++;
}
/* Parse the color components based on the format. */
if (hexits == 3 || hexits == 4)
{
c.red = parse_hex_color_component (s, 0, 1);
c.green = parse_hex_color_component (s, 1, 2);
c.blue = parse_hex_color_component (s, 2, 3);
if (hexits == 4)
c.alpha = parse_hex_color_component (s, 3, 4);
else
c.alpha = 255;
}
else if (hexits == 6 || hexits == 8)
{
c.red = parse_hex_color_component (s, 0, 2);
c.green = parse_hex_color_component (s, 2, 4);
c.blue = parse_hex_color_component (s, 4, 6);
if (hexits == 8)
c.alpha = parse_hex_color_component (s, 6, 8);
else
c.alpha = 255;
}
else
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"invalid HTML-type color string `%s'", s);
}
else if (grub_isdigit (*s))
{
/* Comma separated decimal values. */
c.red = grub_strtoul (s, 0, 0);
if ((s = grub_strchr (s, ',')) == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"missing 1st comma separator in color `%s'", s);
s++;
c.green = grub_strtoul (s, 0, 0);
if ((s = grub_strchr (s, ',')) == 0)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"missing 2nd comma separator in color `%s'", s);
s++;
c.blue = grub_strtoul (s, 0, 0);
if ((s = grub_strchr (s, ',')) == 0)
c.alpha = 255;
else
{
s++;
c.alpha = grub_strtoul (s, 0, 0);
}
}
else
{
if (! grub_video_get_named_color (s, &c))
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"invalid named color `%s'", s);
}
if (grub_errno == GRUB_ERR_NONE)
*color = c;
return grub_errno;
}

View file

@ -87,11 +87,11 @@ struct grub_gfxmenu_view
grub_font_t title_font; grub_font_t title_font;
grub_font_t message_font; grub_font_t message_font;
char *terminal_font_name; char *terminal_font_name;
grub_gui_color_t title_color; grub_video_rgba_color_t title_color;
grub_gui_color_t message_color; grub_video_rgba_color_t message_color;
grub_gui_color_t message_bg_color; grub_video_rgba_color_t message_bg_color;
struct grub_video_bitmap *desktop_image; struct grub_video_bitmap *desktop_image;
grub_gui_color_t desktop_color; grub_video_rgba_color_t desktop_color;
grub_gfxmenu_box_t terminal_box; grub_gfxmenu_box_t terminal_box;
char *title_text; char *title_text;
char *progress_message_text; char *progress_message_text;

View file

@ -31,16 +31,6 @@
status changes. */ status changes. */
#define GRUB_GFXMENU_TIMEOUT_COMPONENT_ID "__timeout__" #define GRUB_GFXMENU_TIMEOUT_COMPONENT_ID "__timeout__"
/* A representation of a color. Unlike grub_video_color_t, this
representation is independent of any video mode specifics. */
typedef struct grub_gui_color
{
grub_uint8_t red;
grub_uint8_t green;
grub_uint8_t blue;
grub_uint8_t alpha;
} grub_gui_color_t;
typedef struct grub_gui_component *grub_gui_component_t; typedef struct grub_gui_component *grub_gui_component_t;
typedef struct grub_gui_container *grub_gui_container_t; typedef struct grub_gui_container *grub_gui_container_t;
typedef struct grub_gui_list *grub_gui_list_t; typedef struct grub_gui_list *grub_gui_list_t;
@ -242,23 +232,6 @@ grub_gui_set_viewport (const grub_video_rect_t *r, grub_video_rect_t *old)
r->height); r->height);
} }
static __inline grub_gui_color_t
grub_gui_color_rgb (int r, int g, int b)
{
grub_gui_color_t c;
c.red = r;
c.green = g;
c.blue = b;
c.alpha = 255;
return c;
}
static __inline grub_video_color_t
grub_gui_map_color (grub_gui_color_t c)
{
return grub_video_map_rgba (c.red, c.green, c.blue, c.alpha);
}
static inline int static inline int
grub_video_have_common_points (const grub_video_rect_t *a, grub_video_have_common_points (const grub_video_rect_t *a,
const grub_video_rect_t *b) const grub_video_rect_t *b)

View file

@ -30,8 +30,4 @@ char *grub_resolve_relative_path (const char *base, const char *path);
char *grub_get_dirname (const char *file_path); char *grub_get_dirname (const char *file_path);
int grub_gui_get_named_color (const char *name, grub_gui_color_t *color);
grub_err_t grub_gui_parse_color (const char *s, grub_gui_color_t *color);
#endif /* GRUB_GUI_STRING_UTIL_HEADER */ #endif /* GRUB_GUI_STRING_UTIL_HEADER */

View file

@ -27,6 +27,15 @@
specific coding format. */ specific coding format. */
typedef grub_uint32_t grub_video_color_t; typedef grub_uint32_t grub_video_color_t;
/* Video color in hardware independent format. */
typedef struct grub_video_rgba_color
{
grub_uint8_t red;
grub_uint8_t green;
grub_uint8_t blue;
grub_uint8_t alpha;
} grub_video_rgba_color_t;
/* This structure is driver specific and should not be accessed directly by /* This structure is driver specific and should not be accessed directly by
outside code. */ outside code. */
struct grub_video_render_target; struct grub_video_render_target;
@ -428,4 +437,27 @@ grub_video_check_mode_flag (grub_video_mode_type_t flags,
grub_video_driver_id_t EXPORT_FUNC (grub_video_get_driver_id) (void); grub_video_driver_id_t EXPORT_FUNC (grub_video_get_driver_id) (void);
static __inline grub_video_rgba_color_t
grub_video_rgba_color_rgb (int r, int g, int b)
{
grub_video_rgba_color_t c;
c.red = r;
c.green = g;
c.blue = b;
c.alpha = 255;
return c;
}
static __inline grub_video_color_t
grub_video_map_rgba_color (grub_video_rgba_color_t c)
{
return grub_video_map_rgba (c.red, c.green, c.blue, c.alpha);
}
int EXPORT_FUNC (grub_video_get_named_color) (const char *name,
grub_video_rgba_color_t *color);
grub_err_t EXPORT_FUNC (grub_video_parse_color) (const char *s,
grub_video_rgba_color_t *color);
#endif /* ! GRUB_VIDEO_HEADER */ #endif /* ! GRUB_VIDEO_HEADER */