mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
lib/fonts: Provide helpers for calculating glyph pitch and size
Implement pitch and size calculation for a single font glyph in the new helpers font_glyph_pitch() and font_glyph_size(). Replace the instances where the calculations are open-coded. Note that in the case of fbcon console rotation, the parameters for a glyph's width and height might be reversed. This is intentional. v2: - fix typos in commit message Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
c713b96427
commit
97df896024
|
|
@ -71,7 +71,6 @@
|
|||
* by Adam Tla/lka <atlka@pg.gda.pl>, Aug 2006
|
||||
*/
|
||||
|
||||
#include <linux/math.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched/signal.h>
|
||||
|
|
@ -244,7 +243,7 @@ enum {
|
|||
*/
|
||||
unsigned int vc_font_pitch(const struct vc_font *font)
|
||||
{
|
||||
return DIV_ROUND_UP(font->width, 8);
|
||||
return font_glyph_pitch(font->width);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vc_font_pitch);
|
||||
|
||||
|
|
@ -261,7 +260,7 @@ EXPORT_SYMBOL_GPL(vc_font_pitch);
|
|||
*/
|
||||
unsigned int vc_font_size(const struct vc_font *font)
|
||||
{
|
||||
return font->height * vc_font_pitch(font) * font->charcount;
|
||||
return font_glyph_size(font->width, font->height) * font->charcount;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vc_font_size);
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ static void ccw_update_attr(u8 *dst, u8 *src, int attribute,
|
|||
struct vc_data *vc)
|
||||
{
|
||||
int i, j, offset = (vc->vc_font.height < 10) ? 1 : 2;
|
||||
int width = (vc->vc_font.height + 7) >> 3;
|
||||
int width = font_glyph_pitch(vc->vc_font.height);
|
||||
int mod = vc->vc_font.height % 8;
|
||||
u8 c, msk = ~(0xff << offset), msk1 = 0;
|
||||
|
||||
|
|
@ -101,7 +101,7 @@ static inline void ccw_putcs_aligned(struct vc_data *vc, struct fb_info *info,
|
|||
{
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
u32 idx = (vc->vc_font.height + 7) >> 3;
|
||||
u32 idx = font_glyph_pitch(vc->vc_font.height);
|
||||
u8 *src;
|
||||
|
||||
while (cnt--) {
|
||||
|
|
@ -131,7 +131,7 @@ static void ccw_putcs(struct vc_data *vc, struct fb_info *info,
|
|||
{
|
||||
struct fb_image image;
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
u32 width = (vc->vc_font.height + 7)/8;
|
||||
u32 width = font_glyph_pitch(vc->vc_font.height);
|
||||
u32 cellsize = width * vc->vc_font.width;
|
||||
u32 maxcnt = info->pixmap.size/cellsize;
|
||||
u32 scan_align = info->pixmap.scan_align - 1;
|
||||
|
|
@ -223,7 +223,8 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, bool enable,
|
|||
struct fb_cursor cursor;
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
int w = (vc->vc_font.height + 7) >> 3, c;
|
||||
int w = font_glyph_pitch(vc->vc_font.height);
|
||||
int c;
|
||||
int y = real_y(par->p, vc->state.y);
|
||||
int attribute, use_sw = vc->vc_cursor_type & CUR_SW;
|
||||
int err = 1, dx, dy;
|
||||
|
|
@ -297,7 +298,7 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, bool enable,
|
|||
char *tmp, *mask = kmalloc_array(w, vc->vc_font.width,
|
||||
GFP_ATOMIC);
|
||||
int cur_height, size, i = 0;
|
||||
int width = (vc->vc_font.width + 7)/8;
|
||||
int width = font_glyph_pitch(vc->vc_font.width);
|
||||
|
||||
if (!mask)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ static void cw_update_attr(u8 *dst, u8 *src, int attribute,
|
|||
struct vc_data *vc)
|
||||
{
|
||||
int i, j, offset = (vc->vc_font.height < 10) ? 1 : 2;
|
||||
int width = (vc->vc_font.height + 7) >> 3;
|
||||
int width = font_glyph_pitch(vc->vc_font.height);
|
||||
u8 c, msk = ~(0xff >> offset);
|
||||
|
||||
for (i = 0; i < vc->vc_font.width; i++) {
|
||||
|
|
@ -86,7 +86,7 @@ static inline void cw_putcs_aligned(struct vc_data *vc, struct fb_info *info,
|
|||
{
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
u32 idx = (vc->vc_font.height + 7) >> 3;
|
||||
u32 idx = font_glyph_pitch(vc->vc_font.height);
|
||||
u8 *src;
|
||||
|
||||
while (cnt--) {
|
||||
|
|
@ -116,7 +116,7 @@ static void cw_putcs(struct vc_data *vc, struct fb_info *info,
|
|||
{
|
||||
struct fb_image image;
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
u32 width = (vc->vc_font.height + 7)/8;
|
||||
u32 width = font_glyph_pitch(vc->vc_font.height);
|
||||
u32 cellsize = width * vc->vc_font.width;
|
||||
u32 maxcnt = info->pixmap.size/cellsize;
|
||||
u32 scan_align = info->pixmap.scan_align - 1;
|
||||
|
|
@ -206,7 +206,8 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, bool enable,
|
|||
struct fb_cursor cursor;
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
int w = (vc->vc_font.height + 7) >> 3, c;
|
||||
int w = font_glyph_pitch(vc->vc_font.height);
|
||||
int c;
|
||||
int y = real_y(par->p, vc->state.y);
|
||||
int attribute, use_sw = vc->vc_cursor_type & CUR_SW;
|
||||
int err = 1, dx, dy;
|
||||
|
|
@ -280,7 +281,7 @@ static void cw_cursor(struct vc_data *vc, struct fb_info *info, bool enable,
|
|||
char *tmp, *mask = kmalloc_array(w, vc->vc_font.width,
|
||||
GFP_ATOMIC);
|
||||
int cur_height, size, i = 0;
|
||||
int width = (vc->vc_font.width + 7)/8;
|
||||
int width = font_glyph_pitch(vc->vc_font.width);
|
||||
|
||||
if (!mask)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -33,14 +33,12 @@ int fbcon_rotate_font(struct fb_info *info, struct vc_data *vc)
|
|||
src = par->fontdata = vc->vc_font.data;
|
||||
par->cur_rotate = par->p->con_rotate;
|
||||
len = vc->vc_font.charcount;
|
||||
s_cellsize = ((vc->vc_font.width + 7)/8) *
|
||||
vc->vc_font.height;
|
||||
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 = ((vc->vc_font.height + 7)/8) *
|
||||
vc->vc_font.width;
|
||||
d_cellsize = font_glyph_size(vc->vc_font.height, vc->vc_font.width);
|
||||
|
||||
if (info->fbops->fb_sync)
|
||||
info->fbops->fb_sync(info);
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ static void ud_update_attr(u8 *dst, u8 *src, int attribute,
|
|||
struct vc_data *vc)
|
||||
{
|
||||
int i, offset = (vc->vc_font.height < 10) ? 1 : 2;
|
||||
int width = (vc->vc_font.width + 7) >> 3;
|
||||
int width = font_glyph_pitch(vc->vc_font.width);
|
||||
unsigned int cellsize = vc->vc_font.height * width;
|
||||
u8 c;
|
||||
|
||||
|
|
@ -153,7 +153,7 @@ static void ud_putcs(struct vc_data *vc, struct fb_info *info,
|
|||
{
|
||||
struct fb_image image;
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
u32 width = (vc->vc_font.width + 7)/8;
|
||||
u32 width = font_glyph_pitch(vc->vc_font.width);
|
||||
u32 cellsize = width * vc->vc_font.height;
|
||||
u32 maxcnt = info->pixmap.size/cellsize;
|
||||
u32 scan_align = info->pixmap.scan_align - 1;
|
||||
|
|
@ -253,7 +253,8 @@ static void ud_cursor(struct vc_data *vc, struct fb_info *info, bool enable,
|
|||
struct fb_cursor cursor;
|
||||
struct fbcon_par *par = info->fbcon_par;
|
||||
unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
|
||||
int w = (vc->vc_font.width + 7) >> 3, c;
|
||||
int w = font_glyph_pitch(vc->vc_font.width);
|
||||
int c;
|
||||
int y = real_y(par->p, vc->state.y);
|
||||
int attribute, use_sw = vc->vc_cursor_type & CUR_SW;
|
||||
int err = 1, dx, dy;
|
||||
|
|
|
|||
|
|
@ -11,10 +11,50 @@
|
|||
#ifndef _VIDEO_FONT_H
|
||||
#define _VIDEO_FONT_H
|
||||
|
||||
#include <linux/math.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct console_font;
|
||||
|
||||
/*
|
||||
* Glyphs
|
||||
*/
|
||||
|
||||
/**
|
||||
* font_glyph_pitch - Calculates the number of bytes per scanline
|
||||
* @width: The glyph width in bits per scanline
|
||||
*
|
||||
* A glyph's pitch is the number of bytes in a single scanline, rounded
|
||||
* up to the next full byte. The parameter @width receives the number
|
||||
* of visible bits per scanline. For example, if width is 14 bytes per
|
||||
* scanline, the pitch is 2 bytes per scanline. If width is 8 bits per
|
||||
* scanline, the pitch is 1 byte per scanline.
|
||||
*
|
||||
* Returns:
|
||||
* The number of bytes in a single scanline of the glyph
|
||||
*/
|
||||
static inline unsigned int font_glyph_pitch(unsigned int width)
|
||||
{
|
||||
return DIV_ROUND_UP(width, 8);
|
||||
}
|
||||
|
||||
/**
|
||||
* font_glyph_size - Calculates the number of bytes per glyph
|
||||
* @width: The glyph width in bits per scanline
|
||||
* @vpitch: The number of scanlines in the glyph
|
||||
*
|
||||
* The number of bytes in a glyph depends on the pitch and the number
|
||||
* of scanlines. font_glyph_size automatically calculates the pitch
|
||||
* from the given width. The parameter @vpitch gives the number of
|
||||
* scanlines, which is usually the glyph's height in scanlines. Fonts
|
||||
* coming from user space can sometimes have a different vertical pitch
|
||||
* with empty scanlines between two adjacent glyphs.
|
||||
*/
|
||||
static inline unsigned int font_glyph_size(unsigned int width, unsigned int vpitch)
|
||||
{
|
||||
return font_glyph_pitch(width) * vpitch;
|
||||
}
|
||||
|
||||
/*
|
||||
* font_data_t and helpers
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
#include "font.h"
|
||||
|
||||
#define console_font_pitch(font) DIV_ROUND_UP((font)->width, 8)
|
||||
#define console_font_pitch(font) font_glyph_pitch((font)->width)
|
||||
|
||||
/*
|
||||
* Helpers for font_data_t
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user