grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] background_color command


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: Re: [PATCH] background_color command
Date: Sat, 25 Dec 2010 12:26:13 +0100
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.16) Gecko/20101211 Icedove/3.0.11

Go ahead for experimental
On 12/23/2010 01:21 PM, Colin Watson wrote:
> 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,
>
>   


-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]