mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
Move the glyph rotation helpers from fbcon to the font library. Wrap them behind clean interfaces. Also clear the output memory to zero. Previously, the implementation relied on the caller to do that. Go through the fbcon code and callers of the glyph-rotation helpers. In addition to the font rotation, there's also the cursor code, which uses the rotation helpers. The font-rotation relied on a single memset to zero for the whole font. This is now multiple memsets on each glyph. This will be sorted out when the font library also implements font rotation. Building glyph rotation in the font library still depends on CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y. If we get more users of the code, we can still add a dedicated Kconfig symbol to the font library. No changes have been made to the actual implementation of the rotate_*() and pattern_*() functions. These will be refactored as separate changes. v2: - fix typos Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Signed-off-by: Helge Deller <deller@gmx.de>
92 lines
2.1 KiB
C
92 lines
2.1 KiB
C
/*
|
|
* linux/drivers/video/console/fbcon_rotate.c -- Software Rotation
|
|
*
|
|
* Copyright (C) 2005 Antonino Daplas <adaplas @pol.net>
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive for
|
|
* more details.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/string.h>
|
|
#include <linux/fb.h>
|
|
#include <linux/font.h>
|
|
#include <linux/vt_kern.h>
|
|
#include <linux/console.h>
|
|
#include <asm/types.h>
|
|
#include "fbcon.h"
|
|
#include "fbcon_rotate.h"
|
|
|
|
int fbcon_rotate_font(struct fb_info *info, struct vc_data *vc)
|
|
{
|
|
struct fbcon_par *par = info->fbcon_par;
|
|
int len, err = 0;
|
|
int s_cellsize, d_cellsize, i;
|
|
const u8 *src;
|
|
u8 *dst;
|
|
|
|
if (vc->vc_font.data == par->fontdata &&
|
|
par->p->con_rotate == par->cur_rotate)
|
|
goto finished;
|
|
|
|
src = par->fontdata = vc->vc_font.data;
|
|
par->cur_rotate = par->p->con_rotate;
|
|
len = vc->vc_font.charcount;
|
|
s_cellsize = font_glyph_size(vc->vc_font.width, vc->vc_font.height);
|
|
d_cellsize = s_cellsize;
|
|
|
|
if (par->rotate == FB_ROTATE_CW ||
|
|
par->rotate == FB_ROTATE_CCW)
|
|
d_cellsize = font_glyph_size(vc->vc_font.height, vc->vc_font.width);
|
|
|
|
if (info->fbops->fb_sync)
|
|
info->fbops->fb_sync(info);
|
|
|
|
if (par->fd_size < d_cellsize * len) {
|
|
kfree(par->fontbuffer);
|
|
par->fontbuffer = NULL;
|
|
par->fd_size = 0;
|
|
|
|
dst = kmalloc_array(len, d_cellsize, GFP_KERNEL);
|
|
|
|
if (dst == NULL) {
|
|
err = -ENOMEM;
|
|
goto finished;
|
|
}
|
|
|
|
par->fd_size = d_cellsize * len;
|
|
par->fontbuffer = dst;
|
|
}
|
|
|
|
dst = par->fontbuffer;
|
|
|
|
switch (par->rotate) {
|
|
case FB_ROTATE_UD:
|
|
for (i = len; i--; ) {
|
|
font_glyph_rotate_180(src, vc->vc_font.width, vc->vc_font.height, dst);
|
|
src += s_cellsize;
|
|
dst += d_cellsize;
|
|
}
|
|
break;
|
|
case FB_ROTATE_CW:
|
|
for (i = len; i--; ) {
|
|
font_glyph_rotate_90(src, vc->vc_font.width, vc->vc_font.height, dst);
|
|
src += s_cellsize;
|
|
dst += d_cellsize;
|
|
}
|
|
break;
|
|
case FB_ROTATE_CCW:
|
|
for (i = len; i--; ) {
|
|
font_glyph_rotate_270(src, vc->vc_font.width, vc->vc_font.height, dst);
|
|
src += s_cellsize;
|
|
dst += d_cellsize;
|
|
}
|
|
break;
|
|
}
|
|
|
|
finished:
|
|
return err;
|
|
}
|