From: Colin Watson <cjwatson@ubuntu.com>
To: grub-devel@gnu.org
Subject: Re: [PATCH] background_color command
Date: Fri, 10 Dec 2010 17:53:42 +0000 [thread overview]
Message-ID: <20101210175342.GA686@riva.ucam.org> (raw)
In-Reply-To: <20101210123941.GX21862@riva.ucam.org>
On Fri, Dec 10, 2010 at 12:39:42PM +0000, Colin Watson wrote:
> This patch adds a background_color command to gfxterm, which is useful
> if you just want a simple background fill and don't want to have to
> worry about scaling a background image to the right size.
>
> 2010-12-10 Colin Watson <cjwatson@ubuntu.com>
>
> * grub-core/term/gfxterm.c (grub_gfxterm_background_color_cmd): New
> function.
> (GRUB_MOD_INIT): Register background_color command.
> (GRUB_MOD_FINI): Unregister background_color command.
Vladimir suggested on IRC that I should generalise the gfxmenu colour
parsing code instead. Here's a patch that does this. I've pushed this
to the parse-color branch here:
bzr+ssh://bzr.sv.gnu.org/grub/branches/parse-color/
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.
Add a background_color command.
* grub-core/term/gfxterm.c (grub_gfxterm_background_color_cmd): New
function.
(GRUB_MOD_INIT): Register background_color command.
(GRUB_MOD_FINI): Unregister background_color command.
=== modified file 'grub-core/Makefile.core.def'
--- grub-core/Makefile.core.def 2010-12-01 21:42:11 +0000
+++ grub-core/Makefile.core.def 2010-12-10 15:34:05 +0000
@@ -178,6 +178,7 @@ kernel = {
videoinkernel = io/bufio.c;
videoinkernel = video/bitmap.c;
videoinkernel = video/bitmap_scale.c;
+ videoinkernel = video/colors.c;
videoinkernel = video/fb/fbblit.c;
videoinkernel = video/fb/fbfill.c;
videoinkernel = video/fb/fbutil.c;
@@ -1049,7 +1050,6 @@ module = {
common = gfxmenu/gui_progress_bar.c;
common = gfxmenu/gui_util.c;
common = gfxmenu/gui_string_util.c;
- common = gfxmenu/named_colors.c;
};
module = {
@@ -1443,6 +1443,12 @@ module = {
};
module = {
+ name = video_colors;
+ common = video/colors.c;
+ enable = videomodules;
+};
+
+module = {
name = video_fb;
common = video/fb/video_fb.c;
common = video/fb/fbblit.c;
=== modified file 'grub-core/gfxmenu/gui_label.c'
--- grub-core/gfxmenu/gui_label.c 2010-05-13 01:56:14 +0000
+++ grub-core/gfxmenu/gui_label.c 2010-12-10 15:32:01 +0000
@@ -48,7 +48,7 @@ struct grub_gui_label
char *text;
char *template;
grub_font_t font;
- grub_gui_color_t color;
+ grub_video_rgba_color_t color;
int value;
enum align_mode align;
};
@@ -107,7 +107,7 @@ label_paint (void *vself, const grub_vid
grub_gui_set_viewport (&self->bounds, &vpsave);
grub_font_draw_string (self->text,
self->font,
- grub_gui_map_color (self->color),
+ grub_video_map_rgba_color (self->color),
left_x,
grub_font_get_ascent (self->font));
grub_gui_restore_viewport (&vpsave);
@@ -186,7 +186,7 @@ label_set_property (void *vself, const c
}
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)
{
=== modified file 'grub-core/gfxmenu/gui_list.c'
--- grub-core/gfxmenu/gui_list.c 2010-10-16 20:16:52 +0000
+++ grub-core/gfxmenu/gui_list.c 2010-12-10 15:40:32 +0000
@@ -41,9 +41,9 @@ struct grub_gui_list_impl
int item_spacing;
grub_font_t 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;
- grub_gui_color_t selected_item_color;
+ grub_video_rgba_color_t selected_item_color;
int draw_scrollbar;
int need_to_recreate_scrollbar;
@@ -267,13 +267,13 @@ draw_menu (list_impl_t self, int num_sho
(is_selected && self->selected_item_font
? self->selected_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)
? self->selected_item_color
: self->item_color);
grub_font_draw_string (item_title,
font,
- grub_gui_map_color (text_color),
+ grub_video_map_rgba_color (text_color),
sel_leftpad + self->icon_width + icon_text_space,
(item_top + (item_height - (ascent + descent))
/ 2 + ascent));
@@ -429,7 +429,7 @@ list_set_property (void *vself, const ch
}
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)
{
@@ -439,7 +439,7 @@ list_set_property (void *vself, const ch
}
else
{
- if (grub_gui_parse_color (value, &self->selected_item_color)
+ if (grub_video_parse_color (value, &self->selected_item_color)
== GRUB_ERR_NONE)
self->selected_item_color_set = 1;
}
@@ -562,7 +562,7 @@ grub_gui_list_new (void)
{
list_impl_t self;
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));
if (! self)
@@ -574,7 +574,7 @@ grub_gui_list_new (void)
self->visible = 1;
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_height = 32;
=== modified file 'grub-core/gfxmenu/gui_progress_bar.c'
--- grub-core/gfxmenu/gui_progress_bar.c 2010-05-13 01:56:14 +0000
+++ grub-core/gfxmenu/gui_progress_bar.c 2010-12-10 15:31:57 +0000
@@ -40,10 +40,10 @@ struct grub_gui_progress_bar
int show_text;
char *template;
grub_font_t font;
- grub_gui_color_t text_color;
- grub_gui_color_t border_color;
- grub_gui_color_t bg_color;
- grub_gui_color_t fg_color;
+ grub_video_rgba_color_t text_color;
+ grub_video_rgba_color_t border_color;
+ grub_video_rgba_color_t bg_color;
+ grub_video_rgba_color_t fg_color;
char *theme_dir;
int need_to_recreate_pixmaps;
@@ -109,7 +109,7 @@ draw_filled_rect_bar (grub_gui_progress_
f.height = self->bounds.height - 2;
/* 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.width + 2, f.height + 2);
@@ -117,12 +117,12 @@ draw_filled_rect_bar (grub_gui_progress_
int barwidth = (f.width
* (self->value - 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.width - barwidth, f.height);
/* 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,
barwidth, f.height);
}
@@ -161,7 +161,8 @@ draw_text (grub_gui_progress_bar_t self)
if (self->template)
{
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 height = self->bounds.height;
char *text;
@@ -298,19 +299,19 @@ progress_bar_set_property (void *vself,
}
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)
{
- grub_gui_parse_color (value, &self->border_color);
+ grub_video_parse_color (value, &self->border_color);
}
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)
{
- grub_gui_parse_color (value, &self->fg_color);
+ grub_video_parse_color (value, &self->fg_color);
}
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->visible = 1;
self->font = grub_font_get ("Unknown Regular 16");
- grub_gui_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_gui_color_t lightgray = { .red = 200, .green = 200, .blue = 200, .alpha = 255 };
+ grub_video_rgba_color_t black = { .red = 0, .green = 0, .blue = 0, .alpha = 255 };
+ grub_video_rgba_color_t gray = { .red = 128, .green = 128, .blue = 128, .alpha = 255 };
+ grub_video_rgba_color_t lightgray = { .red = 200, .green = 200, .blue = 200, .alpha = 255 };
self->text_color = black;
self->border_color = black;
self->bg_color = gray;
=== modified file 'grub-core/gfxmenu/gui_string_util.c'
--- grub-core/gfxmenu/gui_string_util.c 2009-12-29 16:31:02 +0000
+++ grub-core/gfxmenu/gui_string_util.c 2010-12-10 15:30:31 +0000
@@ -204,124 +204,3 @@ grub_get_dirname (const char *file_path)
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;
-}
=== modified file 'grub-core/gfxmenu/theme_loader.c'
--- grub-core/gfxmenu/theme_loader.c 2010-01-05 20:06:27 +0000
+++ grub-core/gfxmenu/theme_loader.c 2010-12-10 15:32:00 +0000
@@ -135,11 +135,11 @@ theme_set_string (grub_gfxmenu_view_t vi
return grub_errno;
}
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))
- grub_gui_parse_color (value, &view->message_color);
+ grub_video_parse_color (value, &view->message_color);
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))
{
struct grub_video_bitmap *raw_bitmap;
@@ -170,7 +170,7 @@ theme_set_string (grub_gfxmenu_view_t vi
view->desktop_image = scaled_bitmap;
}
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))
{
grub_err_t err;
=== modified file 'grub-core/gfxmenu/view.c'
--- grub-core/gfxmenu/view.c 2010-10-16 20:16:52 +0000
+++ grub-core/gfxmenu/view.c 2010-12-10 15:29:48 +0000
@@ -50,8 +50,8 @@ grub_gfxmenu_view_new (const char *theme
{
grub_gfxmenu_view_t view;
grub_font_t default_font;
- grub_gui_color_t default_fg_color;
- grub_gui_color_t default_bg_color;
+ grub_video_rgba_color_t default_fg_color;
+ grub_video_rgba_color_t default_bg_color;
view = grub_malloc (sizeof (*view));
if (! view)
@@ -63,8 +63,8 @@ grub_gfxmenu_view_new (const char *theme
view->screen.height = height;
default_font = grub_font_get ("Unknown Regular 16");
- default_fg_color = grub_gui_color_rgb (0, 0, 0);
- default_bg_color = grub_gui_color_rgb (255, 255, 255);
+ default_fg_color = grub_video_rgba_color_rgb (0, 0, 0);
+ default_bg_color = grub_video_rgba_color_rgb (255, 255, 255);
view->canvas = 0;
@@ -131,7 +131,7 @@ redraw_background (grub_gfxmenu_view_t v
}
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->width, bounds->height);
}
@@ -150,7 +150,7 @@ draw_title (grub_gfxmenu_view_t view)
int y = 40 + grub_font_get_ascent (view->title_font);
grub_font_draw_string (view->title_text,
view->title_font,
- grub_gui_map_color (view->title_color),
+ grub_video_map_rgba_color (view->title_color),
x, y);
}
@@ -244,13 +244,13 @@ draw_message (grub_gfxmenu_view_t view)
return;
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. */
grub_video_fill_rect (color,
f.x-1, f.y-1, f.width+2, f.height+2);
/* 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);
/* Center the text. */
=== modified file 'grub-core/term/gfxterm.c'
--- grub-core/term/gfxterm.c 2010-09-14 21:06:01 +0000
+++ grub-core/term/gfxterm.c 2010-12-10 17:37:47 +0000
@@ -1180,6 +1180,62 @@ grub_gfxterm_background_image_cmd (grub_
return grub_errno;
}
+static grub_err_t
+grub_gfxterm_background_color_cmd (grub_command_t cmd __attribute__ ((unused)),
+ int argc, char **args)
+{
+ grub_video_rgba_color_t color;
+ grub_uint8_t *data;
+ unsigned int i;
+
+ if (argc != 1)
+ return grub_error (GRUB_ERR_BAD_ARGUMENT, "missing operand");
+
+ /* Check that we have video adapter active. */
+ if (grub_video_get_info (NULL) != GRUB_ERR_NONE)
+ return grub_errno;
+
+ if (grub_video_parse_color (args[0], &color) != GRUB_ERR_NONE)
+ return grub_errno;
+
+ /* Destroy existing background bitmap if loaded. */
+ if (bitmap)
+ {
+ grub_video_bitmap_destroy (bitmap);
+ bitmap = 0;
+
+ /* Mark whole screen as dirty. */
+ dirty_region_add (0, 0, window.width, window.height);
+ }
+
+ /* Create a filled bitmap so that we get suitable text blending. */
+ grub_video_bitmap_create (&bitmap, window.width, window.height,
+ GRUB_VIDEO_BLIT_FORMAT_RGB_888);
+ if (grub_errno != GRUB_ERR_NONE)
+ return grub_errno;
+
+ data = bitmap->data;
+ for (i = 0; i < window.height * window.width; i++)
+ {
+ *data++ = color.red;
+ *data++ = color.green;
+ *data++ = color.blue;
+ }
+
+ bitmap_width = window.width;
+ bitmap_height = window.height;
+
+ /* Set the border color. */
+ virtual_screen.bg_color_display = grub_video_map_rgba_color (color);
+
+ /* Mark whole screen as dirty. */
+ dirty_region_add (0, 0, window.width, window.height);
+
+ /* All was ok. */
+ grub_errno = GRUB_ERR_NONE;
+ return grub_errno;
+}
+
static struct grub_term_output grub_video_term =
{
.name = "gfxterm",
@@ -1201,6 +1257,7 @@ static struct grub_term_output grub_vide
};
static grub_extcmd_t background_image_cmd_handle;
+static grub_command_t background_color_cmd_handle;
GRUB_MOD_INIT(gfxterm)
{
@@ -1211,10 +1268,16 @@ GRUB_MOD_INIT(gfxterm)
N_("[-m (stretch|normal)] FILE"),
N_("Load background image for active terminal."),
background_image_cmd_options);
+ background_color_cmd_handle =
+ grub_register_command ("background_color",
+ grub_gfxterm_background_color_cmd,
+ N_("COLOR"),
+ N_("Set background color for active terminal."));
}
GRUB_MOD_FINI(gfxterm)
{
+ grub_unregister_command (background_color_cmd_handle);
grub_unregister_extcmd (background_image_cmd_handle);
grub_term_unregister_output (&grub_video_term);
}
=== renamed file 'grub-core/gfxmenu/named_colors.c' => 'grub-core/video/colors.c'
--- grub-core/gfxmenu/named_colors.c 2009-11-20 15:02:58 +0000
+++ grub-core/video/colors.c 2010-12-10 15:31:32 +0000
@@ -25,7 +25,7 @@
struct named_color
{
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
does not modify *COLOR. */
int
-grub_gui_get_named_color (const char *name,
- grub_gui_color_t *color)
+grub_video_get_named_color (const char *name,
+ grub_video_rgba_color_t *color)
{
int i;
for (i = 0; named_colors[i].name; i++)
@@ -207,3 +207,124 @@ grub_gui_get_named_color (const char *na
}
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;
+}
=== modified file 'include/grub/gfxmenu_view.h'
--- include/grub/gfxmenu_view.h 2010-03-23 17:17:54 +0000
+++ include/grub/gfxmenu_view.h 2010-12-10 15:28:54 +0000
@@ -87,11 +87,11 @@ struct grub_gfxmenu_view
grub_font_t title_font;
grub_font_t message_font;
char *terminal_font_name;
- grub_gui_color_t title_color;
- grub_gui_color_t message_color;
- grub_gui_color_t message_bg_color;
+ grub_video_rgba_color_t title_color;
+ grub_video_rgba_color_t message_color;
+ grub_video_rgba_color_t message_bg_color;
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;
char *title_text;
char *progress_message_text;
=== modified file 'include/grub/gui.h'
--- include/grub/gui.h 2010-05-13 01:56:14 +0000
+++ include/grub/gui.h 2010-12-10 15:27:20 +0000
@@ -31,16 +31,6 @@
status changes. */
#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_container *grub_gui_container_t;
typedef struct grub_gui_list *grub_gui_list_t;
@@ -242,23 +232,6 @@ grub_gui_set_viewport (const grub_video_
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
grub_video_have_common_points (const grub_video_rect_t *a,
const grub_video_rect_t *b)
=== modified file 'include/grub/gui_string_util.h'
--- include/grub/gui_string_util.h 2009-12-29 16:31:02 +0000
+++ include/grub/gui_string_util.h 2010-12-10 15:25:37 +0000
@@ -30,8 +30,4 @@ char *grub_resolve_relative_path (const
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 */
=== modified file 'include/grub/video.h'
--- include/grub/video.h 2010-09-12 00:09:09 +0000
+++ include/grub/video.h 2010-12-10 15:35:07 +0000
@@ -27,6 +27,15 @@
specific coding format. */
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
outside code. */
struct grub_video_render_target;
@@ -428,4 +437,27 @@ grub_video_check_mode_flag (grub_video_m
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 */
Thanks,
--
Colin Watson [cjwatson@ubuntu.com]
next prev parent reply other threads:[~2010-12-10 17:54 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-10 12:39 [PATCH] background_color command Colin Watson
2010-12-10 17:53 ` Colin Watson [this message]
2010-12-13 14:00 ` Colin Watson
2010-12-18 19:46 ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-12-23 12:21 ` Colin Watson
2010-12-25 11:26 ` Vladimir 'φ-coder/phcoder' Serbinenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101210175342.GA686@riva.ucam.org \
--to=cjwatson@ubuntu.com \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.