Skip to content

kzzzza/draw_code

Repository files navigation

图形与触摸演示工程 README

一、概述

南京大学数字系统II实验参考

  1. 实验二,帧缓冲设备实验,请checkout到1.0版本
  2. 实验四,触摸屏移植基于帧缓冲设备实验代码开发,参考最新版本即可

本工程在 Linux (帧缓冲 /dev/fb0 触摸屏 /dev/input/event1) 环境下实现:

  1. 基础图形绘制:像素、直线、矩形、填充矩形、圆、填充圆、三角形等。
  2. BMP 图片加载与显示。
  3. ASCII 8x8 字体与少量自定义汉字/或外部 HZK16 字库存取显示。
  4. 小球弹跳与简单动画演示。
  5. 触摸交互(基于 tslib):实现“触摸画板”功能,可在屏幕上绘制轨迹并根据退出条件离开。

目标平台:LoongArch 交叉编译环境,使用 loongarch64-linux-gnu-gcc。 显示默认适配分辨率:1024x768(可根据实际帧缓冲自动获取分辨率)。

二、目录结构说明

draw_code/
├── main.c          // 程序入口
├── draw.c/.h       // 帧缓冲初始化与基础绘图函数
├── bmp.c/.h        // BMP 图像加载与显示
├── char.c/.h       // ASCII 字符与自定义汉字 / HZK16 字库显示
├── ball.c/.h       // 小球弹跳动画
├── touch.c/.h      // 触摸屏初始化与画板功能(printboard)
├── tslib.h         // tslib 接口头文件
├── lib/            // 交叉链接使用的共享库(含 libts.so 等)
├── HZK16           // 16x16 汉字点阵(如需汉字显示)
├── image.bmp       // 示例 BMP 图片(若需要测试图片显示)
├── Makefile        // 编译规则
├── compilation_notes.md // 编译与链接实验心得
└── README.md       // 本说明文件

三、依赖与前置条件

  1. 帧缓冲设备:/dev/fb0 可访问(必要时使用 sudo)。
  2. 触摸屏输入及 tslib 已正确部署(libts.so 位于 lib/ 或指定的 -L 路径)。
  3. 若需汉字显示:放置 HZK16 字库文件到可执行文件同目录。
  4. 若需 BMP 测试:准备 image.bmp(24位或32位真彩 BMP)。

四、编译说明

在工程目录执行:

make

生成的可执行程序为:graphics_app

清理:

make clean

交叉编译若找不到 libts.so,需要在 Makefile 中确保:

LDFLAGS = -L./lib -lts -lm

或根据实际库路径调整 -L 选项。

五、运行说明

运行前请确认下列文件与可执行程序同目录(根据实际需求):

文件 用途
image.bmp BMP 图片显示测试
HZK16 汉字点阵字库(使用 HZK16 模式时)
libts.so* 触摸库(通过 -L./lib -lts 链接)

运行程序:

./graphics_app

必要时使用:

sudo ./graphics_app

六、功能特性列表

  1. 初始化帧缓冲并打印分辨率与色深信息。
  2. 基础像素级绘图(draw_pixel)。
  3. 线段绘制(Bresenham 算法)、矩形 / 填充矩形、圆 / 填充圆、三角形。
  4. 屏幕清除与全屏填充(背景色)。
  5. 显示 BMP 图片:bmp_load + bmp_draw
  6. 字符显示:draw_char / draw_string,支持数字、大小写字母、部分符号。
  7. 汉字显示:两种方式
    • 自定义小集合汉字点阵(hanzi_fonts
    • 外部 HZK16 字库通过偏移读取(load_hzk16_font + draw_hzk16_char
  8. 小球弹跳动画:ball_init / ball_update / fill_circle
  9. 触摸画板功能:printboard,实时采集触摸点绘制轨迹。

七、触摸画板功能说明 (printboard)

函数声明(见 touch.h):

void printboard(uint32_t fg_color, uint32_t bg_color, int timeout_ms);

行为说明:

  1. 进入后清屏为 bg_color
  2. 有触摸时:在触点绘制半径 3 的小圆,并用直线连接上一个触点形成笔迹。
  3. 退出条件:
    • 触摸落点在左上角矩形区域 (040,040)
    • 长时间无触摸且达到 timeout_ms(若 timeout_ms<=0 则不因超时退出)
  4. 建议在进入画板前已调用:graphics_init(); touch_init();

示例片段(可放入 main.c 测试):

if (graphics_init() != 0) return -1;
if (touch_init() != 0) { graphics_cleanup(); return -1; }

// 启动触摸画板:白色前景,黑色背景,无触摸 30 秒自动退出
printboard(0x00FFFFFF, 0x00000000, 30000);

touch_close();
graphics_cleanup();

八、汉字显示提示

  1. 使用自定义点阵:确保所需汉字已在 hanzi_fonts 中定义。
  2. 使用 HZK16:加载函数原型示例:
int load_hzk16_font(const char *path); // 读取整块到内存
void free_hzk16_font(void);            // 释放映射
  1. 绘制:
draw_hzk16_char(x, y, (const unsigned char*)"汉字", 0x00FF00FF);

请注意:GB2312 两字节编码时,每个汉字偏移 = (区码-1)*94 + (位码-1))*32。

九、常见问题与排查

现象 原因 解决
undefined reference to ts_setup 链接缺失 -lts LDFLAGS 补全 -L路径 -lts
cannot find -lts 未提供库搜索路径 使用 -L./lib 或绝对路径
触摸无反应 权限或设备路径错误 确认 /dev/input/event* 权限,尝试 sudo
汉字不显示 未加载字库或编码不匹配 确认 HZK16 文件、编码是否 GB2312
BMP 显示错位 位深或行填充处理错误 确认 24/32 位与行对齐 (row_padded) 计算
汉字无法显示 代码编码方式需要使用GB2312 修改代码编码方式

十、版权与许可

本工程示例代码仅用于南京大学数字系统II实验学习参考。

NJUEE231180007


欢迎补充改进与反馈!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published