[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] background_color command
From: |
Colin Watson |
Subject: |
Re: [PATCH] background_color command |
Date: |
Thu, 23 Dec 2010 12:21:53 +0000 |
User-agent: |
Mutt/1.5.18 (2008-05-17) |
On Sat, Dec 18, 2010 at 08:46:46PM +0100, Vladimir 'φ-coder/phcoder' Serbinenko
wrote:
> On 12/10/2010 06:53 PM, Colin Watson wrote:
> > module = {
> > + name = video_colors;
> > + common = video/colors.c;
> > + enable = videomodules;
> > +};
>
> Both main users of video (gfxmenu and gfxterm) use color routines. So I
> feel like video/colors.c can go into video.mod
Fixed.
> > + /* 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;
> >
> You should check the return value and not grub_errno.
> > +
> >
> It would be more optimal if in this case the image would be saved simply
> as the color rather than a filled array and use grub_video_fill_rect
> when this image is supposed to be blitted. also it would be neat to be
> able to specify the bgcolor around non-stretched image.
> > + data = bitmap->data;
> > + for (i = 0; i < window.height * window.width; i++)
> > + {
> > + *data++ = color.red;
> > + *data++ = color.green;
> > + *data++ = color.blue;
> > + }
> > +
> >
> grub_video_fill_rect is the function for such kind of operations.
This was all fixed in r2981 on the parse-color branch, which now just
sets virtual_screen.bg_color and virtual_screen.bg_color_display and
handles that appropriately.
> > + /* All was ok. */
> > + grub_errno = GRUB_ERR_NONE;
> >
> You shouldn't discard grub_errno manually unless there is an error you
> want to ignore.
> > + return grub_errno;
> >
> I'd rather use return GRUB_ERR_NONE;
Fixed.
Updated patch follows:
2010-12-23 Colin Watson <address@hidden>
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) [videomodules]: Add 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.
(redraw_screen_rect): Allow blend/replace of text layer to be
controlled independently from whether there is a background bitmap.
(grub_gfxterm_fullscreen): Change blend_text_bg when changing
bitmap.
(destroy_window): Likewise.
(grub_gfxterm_background_image_cmd): Likewise.
Fix border repainting.
* grub-core/term/gfxterm.c (dirty_region_add): When a repaint is
already scheduled, merge the virtual screen with the requested
region rather than repainting only the virtual screen.
=== 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-23 12:10:37 +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 = {
@@ -1454,6 +1454,7 @@ module = {
module = {
name = video;
common = video/video.c;
+ common = video/colors.c;
enable = videomodules;
};
=== 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-23 12:15:40 +0000
@@ -128,6 +128,7 @@ static struct grub_video_render_target *
static unsigned int bitmap_width;
static unsigned int bitmap_height;
static struct grub_video_bitmap *bitmap;
+static int blend_text_bg;
static struct grub_dirty_region dirty_region;
@@ -344,6 +345,7 @@ grub_gfxterm_fullscreen (void)
grub_video_fill_rect (color, 0, 0, mode_info.width, mode_info.height);
}
bitmap = 0;
+ blend_text_bg = 0;
/* Select the font to use. */
font_name = grub_env_get ("gfxterm_font");
@@ -396,6 +398,7 @@ destroy_window (void)
{
grub_video_bitmap_destroy (bitmap);
bitmap = 0;
+ blend_text_bg = 0;
}
repaint_callback = 0;
@@ -481,26 +484,27 @@ redraw_screen_rect (unsigned int x, unsi
/* Render background layer. */
grub_video_fill_rect (color, x, ty, width, h);
}
-
- /* Render text layer as blended. */
- grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_BLEND, x, y,
- x - virtual_screen.offset_x,
- y - virtual_screen.offset_y,
- width, height);
}
else
{
/* Render background layer. */
color = virtual_screen.bg_color_display;
grub_video_fill_rect (color, x, y, width, height);
-
- /* Render text layer as replaced (to get texts background color). */
- grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_REPLACE, x, y,
- x - virtual_screen.offset_x,
- y - virtual_screen.offset_y,
- width, height);
}
+ if (blend_text_bg)
+ /* Render text layer as blended. */
+ grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_BLEND, x, y,
+ x - virtual_screen.offset_x,
+ y - virtual_screen.offset_y,
+ width, height);
+ else
+ /* Render text layer as replaced (to get texts background color). */
+ grub_video_blit_render_target (text_layer, GRUB_VIDEO_BLIT_REPLACE, x, y,
+ x - virtual_screen.offset_x,
+ y - virtual_screen.offset_y,
+ width, height);
+
/* Restore saved viewport. */
grub_video_set_viewport (saved_view.x, saved_view.y,
saved_view.width, saved_view.height);
@@ -539,10 +543,20 @@ dirty_region_add (int x, int y, unsigned
if (repaint_scheduled)
{
- x = virtual_screen.offset_x;
- y = virtual_screen.offset_y;
- width = virtual_screen.width;
- height = virtual_screen.height;
+ if (x > (int)virtual_screen.offset_x)
+ {
+ width += virtual_screen.offset_x - x;
+ x = virtual_screen.offset_x;
+ }
+ if (y > (int)virtual_screen.offset_y)
+ {
+ height += virtual_screen.offset_y - y;
+ y = virtual_screen.offset_y;
+ }
+ if (width < virtual_screen.width)
+ width = virtual_screen.width;
+ if (height < virtual_screen.height)
+ height = virtual_screen.height;
repaint_scheduled = 0;
repaint_was_scheduled = 1;
}
@@ -1127,6 +1141,7 @@ grub_gfxterm_background_image_cmd (grub_
{
grub_video_bitmap_destroy (bitmap);
bitmap = 0;
+ blend_text_bg = 0;
/* Mark whole screen as dirty. */
dirty_region_add (0, 0, window.width, window.height);
@@ -1159,6 +1174,7 @@ grub_gfxterm_background_image_cmd (grub_
/* Replace the original bitmap with the scaled one. */
grub_video_bitmap_destroy (bitmap);
bitmap = scaled_bitmap;
+ blend_text_bg = 1;
}
}
}
@@ -1180,6 +1196,48 @@ 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;
+ struct grub_video_render_target *old_target;
+
+ 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);
+ }
+
+ /* Set the background and border colors. The background color needs to be
+ compatible with the text layer. */
+ grub_video_get_active_render_target (&old_target);
+ grub_video_set_active_render_target (text_layer);
+ virtual_screen.bg_color = grub_video_map_rgba_color (color);
+ grub_video_set_active_render_target (old_target);
+ virtual_screen.bg_color_display = grub_video_map_rgba_color (color);
+ blend_text_bg = 1;
+
+ /* Mark whole screen as dirty. */
+ dirty_region_add (0, 0, window.width, window.height);
+
+ return GRUB_ERR_NONE;
+}
+
static struct grub_term_output grub_video_term =
{
.name = "gfxterm",
@@ -1201,6 +1259,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 +1270,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 address@hidden