IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C/C++编程-理论学习-考鼎录<子驱动程序> -> 正文阅读

[C++知识库]C/C++编程-理论学习-考鼎录<子驱动程序>

子驱动程序模式在稍有程序规模的C项目中大量应用

  1. Uinx一切皆文件
  2. Unix/Linux
  3. MiniGUI识别、应用不同的图片格式

注:一个统一的接口,下面有有不同的实现内容。

子驱动程序模式的一般实现套路

  1. 一套聚类接口
  2. 一些公共数据组成的抽象对象(数据结构)
  3. 一组函数指针组成的操作集(数据结构)
  4. 针对不同子类的操作集实现
/* STDIO接口的实现 */
struct _file_obj;
typedef struct _file_obj file_obj;

struct _file_ops {
	file_obj *open(void *pathname_buf, size_t size, const char xx);
	ssize_t read(file_obj *file, void *buf, size_t count);
	ssize_t write(file_obj *file, const void *buf, size_t count);
	off_t lseek(file_obj *file, off_t offset, int whence);
	void close(file_obj *file);
};

struct _FILE;
typedef struct _FILE FILE;


/* FILE结构:基本设计 */
struct _FILE{

};

/**
* fopen 的实现 
* /
struct _file_obj{
	int fd;
}


/* fmemopen 的实现 */
struct _file_obj{
	void*			buf;
	size_t			size;
	unsigned int	flags;
	off_t			rw_pos;
};

static file_obj *mem_open(void *buf, size_t size, const char xxx)
{
	...
}

static struct _file_ops mem_file_ops = {
	open: mem_open;
	...
}

FILE *fmemopen(void *buf, size_t size, const char *mode)
{
	FILE *file = NULL;
	
	file_obj *obj = mem_open(buf,size,mode);
	if(obj)
	{
		file = calloc(1, sizeof(FILE));
		file.obj = obj;
		file.ops = file_file_ops;
	}
	return file;
}

进一步考虑

  1. STDIO是带有缓冲区功能的,缓冲区信息应该在FILE中维护还是在file_obj中维护?
  2. 当前读写位置在什么地方维护?
  3. 子驱动程序设计的关键点
    1. 抽象对象的数据结构如何确定?
    2. 操作集如何取舍?

正确区分机制和策略

  • 机制:需要提供什么功能
  • 策略:如何使用这些功能
  • 以STDIO实现为例:
    1. 带有缓冲区支持的格式化输入输出属于使用策略,对不同类型的文件对象是一样的。
    2. 文件操作集提供的就是机制,符合最小的完备集合原则。

注:锤子的机制:【把】长、轻、韧(增加力矩,便于挥动);【头】硬,重,造型(便于敲击,释放力量);
锤子的策略:1. 可以用来砸钉子;2. 可以用来转圈着砸,安装于机器上; 3,可以放到机器人手里,然后给机器人下指令;
4,可以只小幅度挥动;5.等等;
综上,可见机制是更适合底层驱动实现,策略更符合上层应用实现。所以,对抽象的数据结构,操作集合都可依据此做判断,是放到驱动层,还是应用层。

MINIGUI中的逻辑字体

  • 现代图形系统中文字的显示过程:
    1. 字符串解码取出一个个字符。
    2. 如果包含有复杂书写(如阿拉伯、希伯来、印度语系文字),需要做双向排版处理。
    3. 字符到字型:如果含有复杂书写文字,需要做字符成型(shaping)处理,比如组合字符问题。
    4. 从字体文件中获取自型信息(点阵或矢量)。
    5. 交由图形系统渲染字型到指定的缓冲区位置。
/* 主要接口 */
PLOGFONT CreateLogFontByName(const char* font_name);
void GUIAPI DestroyLogFont (PLOGFONT log_font);

PLONGFONT GUIAPI SelectFont (HDC hdc, PLONGFONT log_font);
int GUIAPI TextOutLen (HDC hdc, int x, int y,const char* spText, int xxx);

......
- 抽象字符集
- 转化为unicode
- 排版操作
/* LOGFONT */
struct _DEVFONT;
typedef struct _DEVFONT DEVFONT;

typedef struct _LOGFONT{
	char* type;
	char* family;
	char* charset;
	DWORD32 style;
	int size;
	int rotation;
....

	unsigned short scales[MAXNR_DEVFONTS];
	DEVFONT*		devfonts[MAXNR_DEVFONTS];
}LOGFONT;


struct DEVFONT
{
	char name[ MAX +1 ];

	...
	FONTOPS* font_ops;
	CHARSETOPS* charset_ops;
	....
}


struct _CHARSETOPS
{
	int nr_chars;
	int bytes_maxlen_char;	
	const char* name;
	....
	int (*len_first_char)(const unsigned char * mstr, int mst,xxx);
	Achar32(*get_char_value)(const unsigned char * xxxx, xxxx);
	// 一堆函数
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 11:01:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 20:41:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码