mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 20:14:06 +02:00
fbcon: Fill cursor mask in helper function
Fbcon creates a cursor shape on the fly from the user-configured settings. The logic to create a glyph with the cursor's bitmap mask is duplicated in four places. In the cases that involve console rotation, the implementation further rotates the cursor glyph for displaying. Consolidate all cursor-mask creation in a single helper. Update the callers accordingly. For console rotation, use the glyph helpers to rotate the created cursor glyph to the correct orientation. v2: - fix sparse truncated-bits warning Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
cfa72955a0
commit
6903bd6920
|
|
@ -329,46 +329,17 @@ 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) {
|
||||
char *mask = kmalloc_array(w, vc->vc_font.height, GFP_ATOMIC);
|
||||
int cur_height, size, i = 0;
|
||||
u8 msk = 0xff;
|
||||
unsigned char *mask = kmalloc_array(vc->vc_font.height, w, GFP_ATOMIC);
|
||||
|
||||
if (!mask)
|
||||
return;
|
||||
fbcon_fill_cursor_mask(par, vc, mask);
|
||||
|
||||
kfree(par->cursor_state.mask);
|
||||
par->cursor_state.mask = mask;
|
||||
par->cursor_state.mask = (const char *)mask;
|
||||
|
||||
par->p->cursor_shape = vc->vc_cursor_type;
|
||||
cursor.set |= FB_CUR_SETSHAPE;
|
||||
|
||||
switch (CUR_SIZE(par->p->cursor_shape)) {
|
||||
case CUR_NONE:
|
||||
cur_height = 0;
|
||||
break;
|
||||
case CUR_UNDERLINE:
|
||||
cur_height = (vc->vc_font.height < 10) ? 1 : 2;
|
||||
break;
|
||||
case CUR_LOWER_THIRD:
|
||||
cur_height = vc->vc_font.height/3;
|
||||
break;
|
||||
case CUR_LOWER_HALF:
|
||||
cur_height = vc->vc_font.height >> 1;
|
||||
break;
|
||||
case CUR_TWO_THIRDS:
|
||||
cur_height = (vc->vc_font.height << 1)/3;
|
||||
break;
|
||||
case CUR_BLOCK:
|
||||
default:
|
||||
cur_height = vc->vc_font.height;
|
||||
break;
|
||||
}
|
||||
size = (vc->vc_font.height - cur_height) * w;
|
||||
while (size--)
|
||||
mask[i++] = ~msk;
|
||||
size = cur_height * w;
|
||||
while (size--)
|
||||
mask[i++] = msk;
|
||||
}
|
||||
|
||||
par->cursor_state.enable = enable && !use_sw;
|
||||
|
|
|
|||
|
|
@ -446,6 +446,46 @@ 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)
|
||||
{
|
||||
static const unsigned int pattern = 0xffffffff;
|
||||
unsigned int pitch = vc_font_pitch(&vc->vc_font);
|
||||
unsigned int cur_height, size;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
size = (vc->vc_font.height - cur_height) * pitch;
|
||||
while (size--)
|
||||
*mask++ = (unsigned char)~pattern;
|
||||
|
||||
size = cur_height * pitch;
|
||||
while (size--)
|
||||
*mask++ = (unsigned char)pattern;
|
||||
}
|
||||
|
||||
#ifndef MODULE
|
||||
static int __init fb_console_setup(char *this_opt)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -192,6 +192,8 @@ 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);
|
||||
|
||||
#define FBCON_ATTRIBUTE_UNDERLINE 1
|
||||
#define FBCON_ATTRIBUTE_REVERSE 2
|
||||
#define FBCON_ATTRIBUTE_BOLD 4
|
||||
|
|
|
|||
|
|
@ -296,57 +296,26 @@ static void ccw_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) {
|
||||
char *tmp, *mask = kmalloc_array(w, vc->vc_font.width,
|
||||
GFP_ATOMIC);
|
||||
int cur_height, size, i = 0;
|
||||
int width = font_glyph_pitch(vc->vc_font.width);
|
||||
unsigned char *tmp, *mask;
|
||||
|
||||
if (!mask)
|
||||
tmp = kmalloc_array(vc->vc_font.height, vc_font_pitch(&vc->vc_font), GFP_ATOMIC);
|
||||
if (!tmp)
|
||||
return;
|
||||
fbcon_fill_cursor_mask(par, vc, tmp);
|
||||
|
||||
tmp = kmalloc_array(width, vc->vc_font.height, GFP_ATOMIC);
|
||||
|
||||
if (!tmp) {
|
||||
kfree(mask);
|
||||
mask = kmalloc_array(vc->vc_font.width, w, GFP_ATOMIC);
|
||||
if (!mask) {
|
||||
kfree(tmp);
|
||||
return;
|
||||
}
|
||||
font_glyph_rotate_270(tmp, vc->vc_font.width, vc->vc_font.height, mask);
|
||||
kfree(tmp);
|
||||
|
||||
kfree(par->cursor_state.mask);
|
||||
par->cursor_state.mask = mask;
|
||||
par->cursor_state.mask = (const char *)mask;
|
||||
|
||||
par->p->cursor_shape = vc->vc_cursor_type;
|
||||
cursor.set |= FB_CUR_SETSHAPE;
|
||||
|
||||
switch (CUR_SIZE(par->p->cursor_shape)) {
|
||||
case CUR_NONE:
|
||||
cur_height = 0;
|
||||
break;
|
||||
case CUR_UNDERLINE:
|
||||
cur_height = (vc->vc_font.height < 10) ? 1 : 2;
|
||||
break;
|
||||
case CUR_LOWER_THIRD:
|
||||
cur_height = vc->vc_font.height/3;
|
||||
break;
|
||||
case CUR_LOWER_HALF:
|
||||
cur_height = vc->vc_font.height >> 1;
|
||||
break;
|
||||
case CUR_TWO_THIRDS:
|
||||
cur_height = (vc->vc_font.height << 1)/3;
|
||||
break;
|
||||
case CUR_BLOCK:
|
||||
default:
|
||||
cur_height = vc->vc_font.height;
|
||||
break;
|
||||
}
|
||||
|
||||
size = (vc->vc_font.height - cur_height) * width;
|
||||
while (size--)
|
||||
tmp[i++] = 0;
|
||||
size = cur_height * width;
|
||||
while (size--)
|
||||
tmp[i++] = 0xff;
|
||||
font_glyph_rotate_270(tmp, vc->vc_font.width, vc->vc_font.height, mask);
|
||||
kfree(tmp);
|
||||
}
|
||||
|
||||
par->cursor_state.enable = enable && !use_sw;
|
||||
|
|
|
|||
|
|
@ -279,57 +279,26 @@ static void cw_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) {
|
||||
char *tmp, *mask = kmalloc_array(w, vc->vc_font.width,
|
||||
GFP_ATOMIC);
|
||||
int cur_height, size, i = 0;
|
||||
int width = font_glyph_pitch(vc->vc_font.width);
|
||||
unsigned char *tmp, *mask;
|
||||
|
||||
if (!mask)
|
||||
tmp = kmalloc_array(vc->vc_font.height, vc_font_pitch(&vc->vc_font), GFP_ATOMIC);
|
||||
if (!tmp)
|
||||
return;
|
||||
fbcon_fill_cursor_mask(par, vc, tmp);
|
||||
|
||||
tmp = kmalloc_array(width, vc->vc_font.height, GFP_ATOMIC);
|
||||
|
||||
if (!tmp) {
|
||||
kfree(mask);
|
||||
mask = kmalloc_array(vc->vc_font.width, w, GFP_ATOMIC);
|
||||
if (!mask) {
|
||||
kfree(tmp);
|
||||
return;
|
||||
}
|
||||
font_glyph_rotate_90(tmp, vc->vc_font.width, vc->vc_font.height, mask);
|
||||
kfree(tmp);
|
||||
|
||||
kfree(par->cursor_state.mask);
|
||||
par->cursor_state.mask = mask;
|
||||
par->cursor_state.mask = (const char *)mask;
|
||||
|
||||
par->p->cursor_shape = vc->vc_cursor_type;
|
||||
cursor.set |= FB_CUR_SETSHAPE;
|
||||
|
||||
switch (CUR_SIZE(par->p->cursor_shape)) {
|
||||
case CUR_NONE:
|
||||
cur_height = 0;
|
||||
break;
|
||||
case CUR_UNDERLINE:
|
||||
cur_height = (vc->vc_font.height < 10) ? 1 : 2;
|
||||
break;
|
||||
case CUR_LOWER_THIRD:
|
||||
cur_height = vc->vc_font.height/3;
|
||||
break;
|
||||
case CUR_LOWER_HALF:
|
||||
cur_height = vc->vc_font.height >> 1;
|
||||
break;
|
||||
case CUR_TWO_THIRDS:
|
||||
cur_height = (vc->vc_font.height << 1)/3;
|
||||
break;
|
||||
case CUR_BLOCK:
|
||||
default:
|
||||
cur_height = vc->vc_font.height;
|
||||
break;
|
||||
}
|
||||
|
||||
size = (vc->vc_font.height - cur_height) * width;
|
||||
while (size--)
|
||||
tmp[i++] = 0;
|
||||
size = cur_height * width;
|
||||
while (size--)
|
||||
tmp[i++] = 0xff;
|
||||
font_glyph_rotate_90(tmp, vc->vc_font.width, vc->vc_font.height, mask);
|
||||
kfree(tmp);
|
||||
}
|
||||
|
||||
par->cursor_state.enable = enable && !use_sw;
|
||||
|
|
|
|||
|
|
@ -326,50 +326,26 @@ static void ud_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) {
|
||||
char *mask = kmalloc_array(w, vc->vc_font.height, GFP_ATOMIC);
|
||||
int cur_height, size, i = 0;
|
||||
u8 msk = 0xff;
|
||||
unsigned char *tmp, *mask;
|
||||
|
||||
if (!mask)
|
||||
tmp = kmalloc_array(vc->vc_font.height, w, GFP_ATOMIC);
|
||||
if (!tmp)
|
||||
return;
|
||||
fbcon_fill_cursor_mask(par, vc, tmp);
|
||||
|
||||
mask = kmalloc_array(vc->vc_font.height, w, GFP_ATOMIC);
|
||||
if (!mask) {
|
||||
kfree(tmp);
|
||||
return;
|
||||
}
|
||||
font_glyph_rotate_180(tmp, vc->vc_font.width, vc->vc_font.height, mask);
|
||||
kfree(tmp);
|
||||
|
||||
kfree(par->cursor_state.mask);
|
||||
par->cursor_state.mask = mask;
|
||||
par->cursor_state.mask = (const char *)mask;
|
||||
|
||||
par->p->cursor_shape = vc->vc_cursor_type;
|
||||
cursor.set |= FB_CUR_SETSHAPE;
|
||||
|
||||
switch (CUR_SIZE(par->p->cursor_shape)) {
|
||||
case CUR_NONE:
|
||||
cur_height = 0;
|
||||
break;
|
||||
case CUR_UNDERLINE:
|
||||
cur_height = (vc->vc_font.height < 10) ? 1 : 2;
|
||||
break;
|
||||
case CUR_LOWER_THIRD:
|
||||
cur_height = vc->vc_font.height/3;
|
||||
break;
|
||||
case CUR_LOWER_HALF:
|
||||
cur_height = vc->vc_font.height >> 1;
|
||||
break;
|
||||
case CUR_TWO_THIRDS:
|
||||
cur_height = (vc->vc_font.height << 1)/3;
|
||||
break;
|
||||
case CUR_BLOCK:
|
||||
default:
|
||||
cur_height = vc->vc_font.height;
|
||||
break;
|
||||
}
|
||||
|
||||
size = cur_height * w;
|
||||
|
||||
while (size--)
|
||||
mask[i++] = msk;
|
||||
|
||||
size = (vc->vc_font.height - cur_height) * w;
|
||||
|
||||
while (size--)
|
||||
mask[i++] = ~msk;
|
||||
}
|
||||
|
||||
par->cursor_state.enable = enable && !use_sw;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user