]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Move gfxmenu color handling to video, so that gfxterm can use it
authorColin Watson <cjwatson@ubuntu.com>
Fri, 10 Dec 2010 16:45:58 +0000 (16:45 +0000)
committerColin Watson <cjwatson@ubuntu.com>
Fri, 10 Dec 2010 16:45:58 +0000 (16:45 +0000)
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.

13 files changed:
ChangeLog.parse-color [new file with mode: 0644]
grub-core/Makefile.core.def
grub-core/gfxmenu/gui_label.c
grub-core/gfxmenu/gui_list.c
grub-core/gfxmenu/gui_progress_bar.c
grub-core/gfxmenu/gui_string_util.c
grub-core/gfxmenu/theme_loader.c
grub-core/gfxmenu/view.c
grub-core/video/colors.c [moved from grub-core/gfxmenu/named_colors.c with 70% similarity]
include/grub/gfxmenu_view.h
include/grub/gui.h
include/grub/gui_string_util.h
include/grub/video.h

diff --git a/ChangeLog.parse-color b/ChangeLog.parse-color
new file mode 100644 (file)
index 0000000..93d696c
--- /dev/null
@@ -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.
index 37c0ce9702a95ce77f78174ff5ca47452d13bf92..fdf7d0826d361360b4639990ef1846296a17af04 100644 (file)
@@ -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 = {
@@ -1442,6 +1442,12 @@ module = {
   enable = i386_pc;
 };
 
+module = {
+  name = video_colors;
+  common = video/colors.c;
+  enable = videomodules;
+};
+
 module = {
   name = video_fb;
   common = video/fb/video_fb.c;
index 15a352f84c25379fb51123b2893a14a30cc74c82..a7dc95afc03bc87b4f573abcd328592bd7300e81 100644 (file)
@@ -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_video_rect_t *region)
   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 char *name, const char *value)
     }
   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)
     {
index b6b07dfd6221b02ed949da1790c2652eb5146d3d..ca20617959a0e99a4e8f84207f2d518274655806 100644 (file)
@@ -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_shown_items)
         (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 char *name, const char *value)
     }
   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 char *name, const char *value)
         }
       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;
index e1b31794fb7810b02c2adb04f825c3db1bcaeacb..db89ccbf77cf0c6500906b4f5d8a8a921168d88a 100644 (file)
@@ -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_bar_t self)
   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_bar_t self)
   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, const char *name, const char *value)
     }
   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;
index 8c51e396a692f6cafee55ab87954ec037502fe10..a9a415e312906722930501929c67fe77343e5d0e 100644 (file)
@@ -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;
-}
index 3854c6c53c8d2d2b1c9e4a9cdd672e188e983e7f..f9c711d3e455fb735d0a87aae455f58355e48265 100644 (file)
@@ -135,11 +135,11 @@ theme_set_string (grub_gfxmenu_view_t view,
         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 view,
       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;
index 901cdc8894dfc7476963f2c5fb88e693ca545e68..836a9884df83269c0a3185647251db88cfacd6ae 100644 (file)
@@ -50,8 +50,8 @@ grub_gfxmenu_view_new (const char *theme_path,
 {
   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_path,
   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 view,
     }
   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. */
similarity index 70%
rename from grub-core/gfxmenu/named_colors.c
rename to grub-core/video/colors.c
index eedbc47fb26ccf3752c6d65cbfbe4f6844f1c8d0..0637c55080eaa9c937d20dc81c29c4593de0bb3c 100644 (file)
@@ -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 *name,
     }
   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;
+}
index c52a3c71cb2479eb9dc93de7aad45721b0444a82..f858e9d493899e63b26f8ac80e2e803dd7d25409 100644 (file)
@@ -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;
index 6e4a11cbe85b5746cee0c71f18563d2ebdf53fd3..ef0795cf7c1845a0a099aec250c557dfced8c342 100644 (file)
    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_rect_t *r, grub_video_rect_t *old)
                            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)
index 1baa2eedee42ad138c9955a8d89e72b33993326a..34f9a090d1eb4b4e478e2d7655a4a62f71732fac 100644 (file)
@@ -30,8 +30,4 @@ char *grub_resolve_relative_path (const char *base, const char *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 */
index 5350d87eb36cb9ac10060607651c63ceb80f6be8..97bd85bd16b5b10278cc99ffb0640bfe2e43e212 100644 (file)
    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_mode_type_t flags,
 
 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 */