grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] background_color command
@ 2010-12-10 12:39 Colin Watson
  2010-12-10 17:53 ` Colin Watson
  0 siblings, 1 reply; 6+ messages in thread
From: Colin Watson @ 2010-12-10 12:39 UTC (permalink / raw)
  To: grub-devel

This patch adds a background_color command to gfxterm, which is useful
if you just want a simple background fill and don't want to have to
worry about scaling a background image to the right size.

2010-12-10  Colin Watson  <cjwatson@ubuntu.com>

	* grub-core/term/gfxterm.c (grub_gfxterm_background_color_cmd): New
	function.
	(GRUB_MOD_INIT): Register background_color command.
	(GRUB_MOD_FINI): Unregister background_color command.

=== modified file 'grub-core/term/gfxterm.c'
--- grub-core/term/gfxterm.c	2010-09-14 21:06:01 +0000
+++ grub-core/term/gfxterm.c	2010-12-10 11:22:37 +0000
@@ -1180,6 +1180,76 @@ 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)
+{
+  int i;
+  unsigned int j;
+  unsigned long raw_color;
+  grub_uint8_t red, green, blue;
+  grub_uint8_t *data;
+
+  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;
+
+  for (i = 0; i < 7 && args[0][i]; i++)
+    if ((args[0][i] < '0' || args[0][i] > '9')
+        && (args[0][i] < 'a' || args[0][i] > 'f')
+        && (args[0][i] < 'A' || args[0][i] > 'F'))
+      break;
+
+  if (i != 6)
+    return grub_error (GRUB_ERR_BAD_ARGUMENT,
+                       "color `%s' is not in RRGGBB form", args[0]);
+
+  raw_color = grub_strtoul (args[0], 0, 16);
+  red = (raw_color >> 16) & 0xFF;
+  green = (raw_color >> 8) & 0xFF;
+  blue = raw_color & 0xFF;
+
+  /* Destroy existing background bitmap if loaded.  */
+  if (bitmap)
+    {
+      grub_video_bitmap_destroy (bitmap);
+      bitmap = 0;
+
+      /* Mark whole screen as dirty.  */
+      dirty_region_add (0, 0, window.width, window.height);
+    }
+
+  /* Create a filled bitmap so that we get suitable text blending.  */
+  grub_video_bitmap_create (&bitmap, window.width, window.height,
+                            GRUB_VIDEO_BLIT_FORMAT_RGB_888);
+  if (grub_errno != GRUB_ERR_NONE)
+    return grub_errno;
+
+  data = bitmap->data;
+  for (j = 0; j < window.height * window.width; j++)
+    {
+      *data++ = red;
+      *data++ = green;
+      *data++ = blue;
+    }
+
+  bitmap_width = window.width;
+  bitmap_height = window.height;
+
+  /* Set the border color.  */
+  virtual_screen.bg_color_display = grub_video_map_rgb (red, green, blue);
+
+  /* Mark whole screen as dirty.  */
+  dirty_region_add (0, 0, window.width, window.height);
+
+  /* All was ok.  */
+  grub_errno = GRUB_ERR_NONE;
+  return grub_errno;
+}
+
 static struct grub_term_output grub_video_term =
   {
     .name = "gfxterm",
@@ -1201,6 +1271,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 +1282,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_("RRGGBB"),
+                           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);
 }

Thanks,

-- 
Colin Watson                                       [cjwatson@ubuntu.com]


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-12-25 11:26 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-10 12:39 [PATCH] background_color command Colin Watson
2010-12-10 17:53 ` Colin Watson
2010-12-13 14:00   ` Colin Watson
2010-12-18 19:46   ` Vladimir 'φ-coder/phcoder' Serbinenko
2010-12-23 12:21     ` Colin Watson
2010-12-25 11:26       ` Vladimir 'φ-coder/phcoder' Serbinenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).