The kernel's font library provides font_glyph_cursor() to create cursor
glyphs. Replace fbcon's fbcon_fill_cursor_mask() with a new helper that
uses font_glyph_cursor().

The cursor shapes remain mostly unchanged. The only exception is in
underline cursors for fonts with a size larger than 10. The underlining
dash is now one pixel closer to the font-glyph data, so that the cursor
looks less detached. This follows the style used by vgacon.

v2:
- adapt to new VT interface

Signed-off-by: Thomas Zimmermann <[email protected]>
Reviewed-by: Helge Deller <[email protected]>
---
 drivers/video/fbdev/core/bitblit.c   |  3 +-
 drivers/video/fbdev/core/fbcon.c     | 45 +++++++---------------------
 drivers/video/fbdev/core/fbcon.h     |  2 +-
 drivers/video/fbdev/core/fbcon_ccw.c |  3 +-
 drivers/video/fbdev/core/fbcon_cw.c  |  3 +-
 drivers/video/fbdev/core/fbcon_ud.c  |  3 +-
 6 files changed, 16 insertions(+), 43 deletions(-)

diff --git a/drivers/video/fbdev/core/bitblit.c 
b/drivers/video/fbdev/core/bitblit.c
index 39f44258d793..03b3b18e1fe9 100644
--- a/drivers/video/fbdev/core/bitblit.c
+++ b/drivers/video/fbdev/core/bitblit.c
@@ -334,11 +334,10 @@ static void bit_cursor(struct vc_data *vc, struct fb_info 
*info, bool enable,
            vc->vc_cursor_type != par->p->cursor_shape ||
            par->cursor_state.mask == NULL ||
            par->cursor_reset) {
-               unsigned char *mask = kmalloc_array(vc->vc_font.height, w, 
GFP_ATOMIC);
+               unsigned char *mask = fbcon_cursor_glyph(&vc->vc_font, 
vc->vc_cursor_type);
 
                if (!mask)
                        return;
-               fbcon_fill_cursor_mask(par, vc, mask);
 
                kfree(par->cursor_state.mask);
                par->cursor_state.mask = (const char *)mask;
diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
index 615fa596b7cc..8581b7a9b3b7 100644
--- a/drivers/video/fbdev/core/fbcon.c
+++ b/drivers/video/fbdev/core/fbcon.c
@@ -444,44 +444,21 @@ static void fbcon_del_cursor_work(struct fb_info *info)
        cancel_delayed_work_sync(&par->cursor_work);
 }
 
-void fbcon_fill_cursor_mask(struct fbcon_par *par, struct vc_data *vc, 
unsigned char *mask)
+unsigned char *fbcon_cursor_glyph(const struct vc_font *font, unsigned int 
cursor_type)
 {
-       static const unsigned int pattern = 0xffffffff;
-       unsigned int pitch = vc_font_pitch(&vc->vc_font);
-       unsigned int cur_height, size;
+       unsigned int height = font->height;
+       unsigned int cursor_size = CUR_SIZE(cursor_type);
+       unsigned char *glyph;
 
-       switch (CUR_SIZE(vc->vc_cursor_type)) {
-       case CUR_NONE:
-               cur_height = 0;
-               break;
-       case CUR_UNDERLINE:
-               if (vc->vc_font.height < 10)
-                       cur_height = 1;
-               else
-                       cur_height = 2;
-               break;
-       case CUR_LOWER_THIRD:
-               cur_height = vc->vc_font.height / 3;
-               break;
-       case CUR_LOWER_HALF:
-               cur_height = vc->vc_font.height / 2;
-               break;
-       case CUR_TWO_THIRDS:
-               cur_height = (vc->vc_font.height * 2) / 3;
-               break;
-       case CUR_BLOCK:
-       default:
-               cur_height = vc->vc_font.height;
-               break;
-       }
+       glyph = kmalloc_array(height, vc_font_pitch(font), GFP_ATOMIC);
+       if (!glyph)
+               return NULL;
 
-       size = (vc->vc_font.height - cur_height) * pitch;
-       while (size--)
-               *mask++ = (unsigned char)~pattern;
+       font_glyph_cursor(font->width, height,
+                         vc_cursor_start(height, cursor_size),
+                         vc_cursor_end(height, cursor_size), glyph);
 
-       size = cur_height * pitch;
-       while (size--)
-               *mask++ = (unsigned char)pattern;
+       return glyph;
 }
 
 #ifndef MODULE
diff --git a/drivers/video/fbdev/core/fbcon.h b/drivers/video/fbdev/core/fbcon.h
index 407d207b14f1..054cf66b15fa 100644
--- a/drivers/video/fbdev/core/fbcon.h
+++ b/drivers/video/fbdev/core/fbcon.h
@@ -202,7 +202,7 @@ extern void fbcon_set_tileops(struct vc_data *vc, struct 
fb_info *info);
 extern void fbcon_set_bitops_ur(struct fbcon_par *par);
 extern int  soft_cursor(struct fb_info *info, struct fb_cursor *cursor);
 
-void fbcon_fill_cursor_mask(struct fbcon_par *par, struct vc_data *vc, 
unsigned char *mask);
+unsigned char *fbcon_cursor_glyph(const struct vc_font *font, unsigned int 
cursor_type);
 
 #define FBCON_ATTRIBUTE_UNDERLINE 1
 #define FBCON_ATTRIBUTE_REVERSE   2
diff --git a/drivers/video/fbdev/core/fbcon_ccw.c 
b/drivers/video/fbdev/core/fbcon_ccw.c
index 33f02d579e02..9a9839631cc5 100644
--- a/drivers/video/fbdev/core/fbcon_ccw.c
+++ b/drivers/video/fbdev/core/fbcon_ccw.c
@@ -298,10 +298,9 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info 
*info, bool enable,
            par->cursor_reset) {
                unsigned char *tmp, *mask;
 
-               tmp = kmalloc_array(vc->vc_font.height, 
vc_font_pitch(&vc->vc_font), GFP_ATOMIC);
+               tmp = fbcon_cursor_glyph(&vc->vc_font, vc->vc_cursor_type);
                if (!tmp)
                        return;
-               fbcon_fill_cursor_mask(par, vc, tmp);
 
                mask = kmalloc_array(vc->vc_font.width, w, GFP_ATOMIC);
                if (!mask) {
diff --git a/drivers/video/fbdev/core/fbcon_cw.c 
b/drivers/video/fbdev/core/fbcon_cw.c
index bde820967eb9..4cb20337cf79 100644
--- a/drivers/video/fbdev/core/fbcon_cw.c
+++ b/drivers/video/fbdev/core/fbcon_cw.c
@@ -281,10 +281,9 @@ static void cw_cursor(struct vc_data *vc, struct fb_info 
*info, bool enable,
            par->cursor_reset) {
                unsigned char *tmp, *mask;
 
-               tmp = kmalloc_array(vc->vc_font.height, 
vc_font_pitch(&vc->vc_font), GFP_ATOMIC);
+               tmp = fbcon_cursor_glyph(&vc->vc_font, vc->vc_cursor_type);
                if (!tmp)
                        return;
-               fbcon_fill_cursor_mask(par, vc, tmp);
 
                mask = kmalloc_array(vc->vc_font.width, w, GFP_ATOMIC);
                if (!mask) {
diff --git a/drivers/video/fbdev/core/fbcon_ud.c 
b/drivers/video/fbdev/core/fbcon_ud.c
index eaf08999e249..ac22b9846b79 100644
--- a/drivers/video/fbdev/core/fbcon_ud.c
+++ b/drivers/video/fbdev/core/fbcon_ud.c
@@ -328,10 +328,9 @@ static void ud_cursor(struct vc_data *vc, struct fb_info 
*info, bool enable,
            par->cursor_reset) {
                unsigned char *tmp, *mask;
 
-               tmp = kmalloc_array(vc->vc_font.height, w, GFP_ATOMIC);
+               tmp = fbcon_cursor_glyph(&vc->vc_font, vc->vc_cursor_type);
                if (!tmp)
                        return;
-               fbcon_fill_cursor_mask(par, vc, tmp);
 
                mask = kmalloc_array(vc->vc_font.height, w, GFP_ATOMIC);
                if (!mask) {
-- 
2.55.0

Reply via email to