数码相框 在LCD上显示多行文字(6)
目的:
1、从左边起显示几行文字
2、居中显示几行文字
在LCD上显示下列两行文字:
我是程序员gif
Hello World
分析:
1、从左边起显示几行文字
(1)先描画字体
(2)然后算出边框
定义两个标志变量:line_box_ymax和line_box_ymin
通过FT_Glyph_Get_CBox()测量字形图象,获取一行文字的yMax,Min最大值,最小值。
显示第一行时:
pen.x = 0*64; //单位是64分之一像素
显示第2~n行时:
pen.y = (var.yres - 24) * 64; //fb_var.yres:LCD总高度,原点为(0, 24)
2、居中显示几行文字
(1)先算出边框(知道起点,长、宽)
(2)再确定坐标并描画
代码中的一些变量解释:
bbox:是每个字体文件在x和y方向最大值和最小值的结构体
face:字体文件
pen:原点和位置
从左显示多行24X24文字
内容如下:
定义:某一行的BBox的y最小值line_box_ymin和最大值line_box_ymax
通过函数FT_Glyph_Get_CBox()测量字体图象,从glyph得到BBox,BBox含有每个文字的xMin,xMax,yMin,yMax,获取一行文字的yMax,Min最大值和最小值。
从左起显示几行文字代码如下:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <wchar.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
int fd_fb;
struct fb_var_screeninfo var; /* Current var */
struct fb_fix_screeninfo fix; /* Current fix */
int screen_size;
unsigned char *fbmem;
unsigned int line_width;
unsigned int pixel_width;
/* color : 0x00RRGGBB */
void lcd_put_pixel(int x, int y, unsigned int color)
{
unsigned char *pen_8 = fbmem+y*line_width+x*pixel_width;
unsigned short *pen_16;
unsigned int *pen_32;
unsigned int red, green, blue;
pen_16 = (unsigned short *)pen_8;
pen_32 = (unsigned int *)pen_8;
switch (var.bits_per_pixel)
{
case 8:
{
*pen_8 = color;
break;
}
case 16:
{
/* 565 */
red = (color >> 16) & 0xff;
green = (color >> 8) & 0xff;
blue = (color >> 0) & 0xff;
color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
*pen_16 = color;
break;
}
case 32:
{
*pen_32 = color;
break;
}
default:
{
printf("can't surport %dbpp\n", var.bits_per_pixel