|
@@ -1165,6 +1165,8 @@ static void fbcon_free_font(struct display *p, bool freefont)
|
|
p->userfont = 0;
|
|
p->userfont = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void set_vc_hi_font(struct vc_data *vc, bool set);
|
|
|
|
+
|
|
static void fbcon_deinit(struct vc_data *vc)
|
|
static void fbcon_deinit(struct vc_data *vc)
|
|
{
|
|
{
|
|
struct display *p = &fb_display[vc->vc_num];
|
|
struct display *p = &fb_display[vc->vc_num];
|
|
@@ -1200,6 +1202,9 @@ finished:
|
|
if (free_font)
|
|
if (free_font)
|
|
vc->vc_font.data = NULL;
|
|
vc->vc_font.data = NULL;
|
|
|
|
|
|
|
|
+ if (vc->vc_hi_font_mask)
|
|
|
|
+ set_vc_hi_font(vc, false);
|
|
|
|
+
|
|
if (!con_is_bound(&fb_con))
|
|
if (!con_is_bound(&fb_con))
|
|
fbcon_exit();
|
|
fbcon_exit();
|
|
|
|
|
|
@@ -2436,32 +2441,10 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|
|
|
- const u8 * data, int userfont)
|
|
|
|
|
|
+/* set/clear vc_hi_font_mask and update vc attrs accordingly */
|
|
|
|
+static void set_vc_hi_font(struct vc_data *vc, bool set)
|
|
{
|
|
{
|
|
- struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
|
|
|
- struct fbcon_ops *ops = info->fbcon_par;
|
|
|
|
- struct display *p = &fb_display[vc->vc_num];
|
|
|
|
- int resize;
|
|
|
|
- int cnt;
|
|
|
|
- char *old_data = NULL;
|
|
|
|
-
|
|
|
|
- if (con_is_visible(vc) && softback_lines)
|
|
|
|
- fbcon_set_origin(vc);
|
|
|
|
-
|
|
|
|
- resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
|
|
|
|
- if (p->userfont)
|
|
|
|
- old_data = vc->vc_font.data;
|
|
|
|
- if (userfont)
|
|
|
|
- cnt = FNTCHARCNT(data);
|
|
|
|
- else
|
|
|
|
- cnt = 256;
|
|
|
|
- vc->vc_font.data = (void *)(p->fontdata = data);
|
|
|
|
- if ((p->userfont = userfont))
|
|
|
|
- REFCOUNT(data)++;
|
|
|
|
- vc->vc_font.width = w;
|
|
|
|
- vc->vc_font.height = h;
|
|
|
|
- if (vc->vc_hi_font_mask && cnt == 256) {
|
|
|
|
|
|
+ if (!set) {
|
|
vc->vc_hi_font_mask = 0;
|
|
vc->vc_hi_font_mask = 0;
|
|
if (vc->vc_can_do_color) {
|
|
if (vc->vc_can_do_color) {
|
|
vc->vc_complement_mask >>= 1;
|
|
vc->vc_complement_mask >>= 1;
|
|
@@ -2484,7 +2467,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|
((c & 0xfe00) >> 1) | (c & 0xff);
|
|
((c & 0xfe00) >> 1) | (c & 0xff);
|
|
vc->vc_attr >>= 1;
|
|
vc->vc_attr >>= 1;
|
|
}
|
|
}
|
|
- } else if (!vc->vc_hi_font_mask && cnt == 512) {
|
|
|
|
|
|
+ } else {
|
|
vc->vc_hi_font_mask = 0x100;
|
|
vc->vc_hi_font_mask = 0x100;
|
|
if (vc->vc_can_do_color) {
|
|
if (vc->vc_can_do_color) {
|
|
vc->vc_complement_mask <<= 1;
|
|
vc->vc_complement_mask <<= 1;
|
|
@@ -2516,8 +2499,38 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|
} else
|
|
} else
|
|
vc->vc_video_erase_char = c & ~0x100;
|
|
vc->vc_video_erase_char = c & ~0x100;
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|
|
|
+ const u8 * data, int userfont)
|
|
|
|
+{
|
|
|
|
+ struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
|
|
|
+ struct fbcon_ops *ops = info->fbcon_par;
|
|
|
|
+ struct display *p = &fb_display[vc->vc_num];
|
|
|
|
+ int resize;
|
|
|
|
+ int cnt;
|
|
|
|
+ char *old_data = NULL;
|
|
|
|
+
|
|
|
|
+ if (con_is_visible(vc) && softback_lines)
|
|
|
|
+ fbcon_set_origin(vc);
|
|
|
|
+
|
|
|
|
+ resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
|
|
|
|
+ if (p->userfont)
|
|
|
|
+ old_data = vc->vc_font.data;
|
|
|
|
+ if (userfont)
|
|
|
|
+ cnt = FNTCHARCNT(data);
|
|
|
|
+ else
|
|
|
|
+ cnt = 256;
|
|
|
|
+ vc->vc_font.data = (void *)(p->fontdata = data);
|
|
|
|
+ if ((p->userfont = userfont))
|
|
|
|
+ REFCOUNT(data)++;
|
|
|
|
+ vc->vc_font.width = w;
|
|
|
|
+ vc->vc_font.height = h;
|
|
|
|
+ if (vc->vc_hi_font_mask && cnt == 256)
|
|
|
|
+ set_vc_hi_font(vc, false);
|
|
|
|
+ else if (!vc->vc_hi_font_mask && cnt == 512)
|
|
|
|
+ set_vc_hi_font(vc, true);
|
|
|
|
|
|
if (resize) {
|
|
if (resize) {
|
|
int cols, rows;
|
|
int cols, rows;
|