On Mon, Dec 24, 2007 at 02:28:18AM +0100, Robert Millan wrote:
>
> New patch. Corrects a minor mistake when filling the last colum in the
> menu. Also, it doesn't change the colors on gfxterm since some reasjustments
> were needed for that, and there's also a bug that makes it impossible to
> change colors on the fly with gfxterm/vbe (I'll write more on that later).
This patch (relative to previous one) basicaly makes it work with a big
ugly kludge (see "| 0xff000000" line). The problem seems to be that alpha
channel is set to 0 for all return values of grub_video_map_color() after
gfxterm initialization. I checked the few places in the code where those
variables are zeroed, but to no avail. I assume the problem is just they
haven't been initialised, but I just have no idea where they're supposed to.
Any clues?
--
Robert Millan
<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call, if you are unable to speak?
(as seen on /.)
diff -ur grub2.color/term/gfxterm.c grub2.gfxterm/term/gfxterm.c
--- grub2.color/term/gfxterm.c 2007-12-24 02:21:30.000000000 +0100
+++ grub2.gfxterm/term/gfxterm.c 2007-12-24 02:07:31.000000000 +0100
@@ -38,10 +38,13 @@
#define DEFAULT_BORDER_WIDTH 10
-#define DEFAULT_FG_COLOR 0x0a
-#define DEFAULT_BG_COLOR 0x00
#define DEFAULT_CURSOR_COLOR 0x0f
+static grub_uint8_t grub_gfxterm_cur_color = 0x7;
+static grub_uint8_t grub_gfxterm_standard_color = 0x7;
+static grub_uint8_t grub_gfxterm_normal_color = 0x7;
+static grub_uint8_t grub_gfxterm_highlight_color = 0x70;
+
struct grub_dirty_region
{
int top_left_x;
@@ -90,8 +93,6 @@
int cursor_state;
/* Color settings. */
- grub_video_color_t fg_color_setting;
- grub_video_color_t bg_color_setting;
grub_video_color_t fg_color;
grub_video_color_t bg_color;
grub_video_color_t cursor_color;
@@ -175,10 +176,8 @@
we can only have those after mode is initialized. */
grub_video_set_active_render_target (text_layer);
- virtual_screen.fg_color_setting = grub_video_map_color (DEFAULT_FG_COLOR);
- virtual_screen.bg_color_setting = grub_video_map_color (DEFAULT_BG_COLOR);
- virtual_screen.fg_color = virtual_screen.fg_color_setting;
- virtual_screen.bg_color = virtual_screen.bg_color_setting;
+ virtual_screen.fg_color = grub_video_map_color (grub_gfxterm_cur_color & 0x0f);
+ virtual_screen.bg_color = grub_video_map_color (grub_gfxterm_cur_color >> 4);
virtual_screen.cursor_color = grub_video_map_color (DEFAULT_CURSOR_COLOR);
grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY);
@@ -805,15 +804,12 @@
static void
grub_gfxterm_cls (void)
{
- grub_video_color_t color;
-
/* Clear virtual screen. */
grub_virtual_screen_cls ();
/* Clear text layer. */
grub_video_set_active_render_target (text_layer);
- color = virtual_screen.bg_color_setting;
- grub_video_fill_rect (color, 0, 0, mode_info.width, mode_info.height);
+ grub_video_fill_rect (virtual_screen.bg_color, 0, 0, mode_info.width, mode_info.height);
grub_video_set_active_render_target (GRUB_VIDEO_RENDER_TARGET_DISPLAY);
/* Mark virtual screen to be redrawn. */
@@ -823,20 +819,39 @@
static void
grub_virtual_screen_setcolorstate (grub_term_color_state state)
{
- switch (state)
- {
+ grub_video_color_t tmp;
+
+ switch (state) {
case GRUB_TERM_COLOR_STANDARD:
+ grub_gfxterm_cur_color = grub_gfxterm_standard_color;
+ break;
case GRUB_TERM_COLOR_NORMAL:
- virtual_screen.fg_color = virtual_screen.fg_color_setting;
- virtual_screen.bg_color = virtual_screen.bg_color_setting;
+ grub_gfxterm_cur_color = grub_gfxterm_normal_color;
break;
case GRUB_TERM_COLOR_HIGHLIGHT:
- virtual_screen.fg_color = virtual_screen.bg_color_setting;
- virtual_screen.bg_color = virtual_screen.fg_color_setting;
+ grub_gfxterm_cur_color = grub_gfxterm_highlight_color;
break;
default:
break;
- }
+ }
+
+ virtual_screen.fg_color = grub_video_map_color (grub_gfxterm_cur_color & 0x0f) | 0xff000000;
+ virtual_screen.bg_color = grub_video_map_color (grub_gfxterm_cur_color >> 4);
+}
+
+static void
+grub_virtual_screen_setcolor (grub_uint8_t normal_color,
+ grub_uint8_t highlight_color)
+{
+ grub_gfxterm_normal_color = normal_color;
+ grub_gfxterm_highlight_color = highlight_color;
+}
+
+static void
+grub_virtual_screen_getcolor (grub_uint8_t *normal_color, grub_uint8_t *highlight_color)
+{
+ *normal_color = grub_gfxterm_normal_color;
+ *highlight_color = grub_gfxterm_highlight_color;
}
static void
@@ -874,6 +889,8 @@
.gotoxy = grub_gfxterm_gotoxy,
.cls = grub_gfxterm_cls,
.setcolorstate = grub_virtual_screen_setcolorstate,
+ .setcolor = grub_virtual_screen_setcolor,
+ .getcolor = grub_virtual_screen_getcolor,
.setcursor = grub_gfxterm_setcursor,
.refresh = grub_gfxterm_refresh,
.flags = 0,
diff -ur grub2.color/video/i386/pc/vbe.c grub2.gfxterm/video/i386/pc/vbe.c
--- grub2.color/video/i386/pc/vbe.c 2007-07-22 01:32:32.000000000 +0200
+++ grub2.gfxterm/video/i386/pc/vbe.c 2007-12-24 02:29:48.000000000 +0100
@@ -722,6 +722,8 @@
value |= blue << render_target->mode_info.blue_field_pos;
value |= alpha << render_target->mode_info.reserved_field_pos;
+ grub_printf ("alpha=%x, bits=%x\n", alpha, render_target->mode_info.reserved_field_pos);
+
return value;
}
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel