【framebuffer】
概念:
Framebuffer(帧缓冲区) 是 Linux 提供的一种将图像数据直接输出到显示设备的机制。
它在
/dev/fb0
等设备节点中提供接口,使用户空间可以通过 mmap 直接访问显存。通过
ioctl
系统调用可获取分辨率、像素格式等信息。
struct fb_var_screeninfo {__u32 xres; // 实际分辨率(横向像素)__u32 yres; // 实际分辨率(纵向像素)__u32 xres_virtual; // 虚拟分辨率__u32 yres_virtual;__u32 bits_per_pixel; // 每个像素占用的位数
};
- int init_fb(char *devname)
- 功能:初始化 framebuffer,完成设备打开、参数获取、内存映射。
- 步骤:
- open("/dev/fb8",0_RDWR)打开显示设备
- ioctl(fd,FBIOGET_VSCREENINFO,&vinf)获取屏幕信息
- 计算显存大小:len = xres_virtual * yres_virtual * bits_per_pixel / 8;
- mmap 将显存映射到用户空间;
- 返回:设备文件描述符。
- void draw point(int x,inty,unsigned int col)
- 功能 : 在指定坐标(x,y)绘制一个像素点。
- 关键点:
- 不同像素格式(RGB888/RGB565)写入方式不同
- 访问地址计算公式
- void draw clear(unsigned int col)
- 功能:清屏操作,将整个 framebuffer 填充为单一颜色。
- 通过双层循环逐像素写入。
- void draw_hline()/draw_s_line()
- 功能:绘制水平线和竖直线。
- 实现原理:固定某一坐标,循环调用 draw_point()
- void draw_rectangle(int x,int y,int w,int h, unsigned int col)
- 功能:绘制矩形轮廓。
- 通过绘制四条边实现。
- void draw xline(int x1,int yl,int x2,int y2,unsigned int col)
- 功能:绘制任意两点间直线。
- 原理:根据直线方程 y=kx+b计算每个像素点位置。
- void draw_circle(int x0,int yo,int r,unsigned int col)
- 功能:绘制圆。
- 实现:通过极坐标公式(x,y) = (r * cos0 + x0,r * sin0 + y0)
- 循环角度 θ,计算圆上坐标点。
- void draw_bmp(int x,int y,char *picname, int w, int h)
- 功能:在屏幕上显示 BMP 图片
- 核心逻辑:
- 1.跳过 BMP 头部(前 54 字节);
- 2.读取 RGB 三色数据
- 3.按行倒序绘制(BMP 图像数据自下而上存储)
- 4.不同位深下颜色格式转换:
- void draw_word()/draw_utf8()/draw_utf8_str()
- 功能:绘制单字节或多字节文字(支持中文 UTF-8 编码)
- 关键点:
- 处理字模数据(如 16x16 字模);draw word
- draw_utf8 调用编码转换函数 enc_utf8_to_unicode_one()
- draw_utf8_str 连续绘制字符串
- 每个字模通过 8 位移位判断是否绘制像素点。