Thread (11 messages) 11 messages, 3 authors, 2004-08-17

Re: patch fixing background next to penguin logo in monochrome

From: Antonino A. Daplas <hidden>
Date: 2004-08-16 03:10:57

On Sunday 15 August 2004 20:25, Geert Uytterhoeven wrote:
quoted
This one is a little difficult since there is currently no method to
convert monochrome attributes to color and vice versa.  The best one can
do is to clear all attributes when switching from mono<->color.

When switching, one will get plain text only.  This is  probably better
than having text with incorrect attributes.

Attached patch is completely untested, but it's the same one in 2.6.
Doesn't help, still the same behavior :-(
I looked at the code, and the flow seems to be like this:

fbcon_switch->fb_set_var->changevar->fbcon_setup->update_screen/redraw_screen

However, fbcon_setup() updates conp->vc_can_do_color, so by the time
the redraw_screen function in console.c checks for the vc_can_do_color field,
it always returns equal.

So instead of clearing the buffer attributes in redraw_screen(), we do it 
instead in fbcon_setup().

Try the patch below.  You might have to apply them manually as I'm using
Suse-9.0 linux kernel, which has the bootsplash code.  Also, all the previous
patches need to be reversed.

Tony

PS:  If we can change the clear_buffer_attribute to rebuild attributes from
the old buffer instead of just clearing the attributes, that would be perfect.
Is there an easy way to do that?
---

diff -uprN linux-2.4-orig/drivers/video/fbcon.c linux-2.4/drivers/video/fbcon.c
--- linux-2.4-orig/drivers/video/fbcon.c	2004-09-16 10:50:58.093218288 +0800
+++ linux-2.4/drivers/video/fbcon.c	2004-09-16 10:53:12.826735680 +0800
@@ -618,12 +618,25 @@ static void fbcon_font_widths(struct dis
 
 #define fontwidthvalid(p,w) ((p)->dispsw->fontwidthmask & FONTWIDTH(w))
 
+static void clear_buffer_attributes(struct vc_data *conp)
+{
+	unsigned short *p = (unsigned short *) conp->vc_origin;
+	int count = conp->vc_screenbuf_size/2;
+	int mask = conp->vc_hi_font_mask | 0xff;
+	int erase_char = conp->vc_video_erase_char;
+
+	for (; count > 0; count--, p++) {
+		scr_writew((scr_readw(p)&mask) | (erase_char&~mask), p);
+	}
+}
+
 static void fbcon_setup(int con, int init, int logo)
 {
     struct display *p = &fb_display[con];
     struct vc_data *conp = p->conp;
     int nr_rows, nr_cols;
     int old_rows, old_cols;
+    int old_was_color = conp->vc_can_do_color;
     unsigned short *save = NULL, *r, *q;
     int i, charcnt = 256;
     struct fbcon_font_desc *font;
@@ -803,6 +816,8 @@ static void fbcon_setup(int con, int ini
     p->bgcol = 0;
 
     if (!init) {
+	if (old_was_color != conp->vc_can_do_color)
+	    clear_buffer_attributes(conp);
 	if (conp->vc_cols != nr_cols || conp->vc_rows != nr_rows)
 	    vc_resize_con(nr_rows, nr_cols, con);
 	else if (CON_IS_VISIBLE(conp) &&
 




-------------------------------------------------------
SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media
100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33
Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift.
http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help