1 引言
在 MiniGUI 0.3.xx 的开发中,我们引入了图形和输入抽象层(Graphics and Input Abstract Layer,GAL 和 IAL)的概念。抽象层的概念类似 Linux 内核虚拟文件系统的概念。它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口之上。而用于实现这一抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序。这实际是一种面向对象的程序结构。利用 GAL 和 IAL,MiniGUI 可以在许多已有的图形函数库上运行,比如 SVGALib 和 LibGGI。并且可以非常方便地将 MiniGUI 移植到其他 POSIX 系统上,只需要根据我们的抽象层接口实现新的图形引擎即可。比如,在基于 Linux 的系统上,我们可以在 Linux FrameBuffer 驱动程序的基础上建立通用的 MiniGUI 图形引擎。实际上,包含在 MiniGUI 1.0.00 版本中的私有图形引擎(Native Engine)就是建立在 FrameBuffer 之上的图形引擎。一般而言,基于 Linux 的嵌入式系统均会提供 FrameBuffer 支持,这样私有图形引擎可以运行在一般的 PC 上,也可以运行在特定的嵌入式系统上。
相比图形来讲,将 MiniGUI 的底层输入与上层相隔显得更为重要。在基于 Linux 的嵌入式系统中,图形引擎可以通过 FrameBuffer 而获得,而输入设备的处理却没有统一的接口。在 PC 上,我们通常使用键盘和鼠标,而在嵌入式系统上,可能只有触摸屏和为数不多的几个键。在这种情况下,提供一个抽象的输入层,就显得格外重要。
本文将介绍 MiniGUI 的 GAL 和 IAL 接口,并介绍私有图形引擎和特定嵌入式系统下的输入引擎实现。
2 MiniGUI 的 GAL 和 IAL 定义
GAL 和 IAL 的结构是类似的,我们以 GAL 为例说明 MiniGUI GAL 和 IAL 抽象层的结构。
2.1 GAL 和图形引擎
参见图 1。系统维护一个已注册图形引擎数组,保存每个图形引擎数据结构的指针。系统利用一个指针保存当前使用的图形引擎。一般而言,系统中至少有两个图形引擎,一个是“哑”图形引擎,不进行任何实际的图形输出;一个是实际要使用的图形引擎,比如 LibGGI 或者 SVGALib,或者 Native Engine。每个图形引擎的数据结构定义了该图形引擎的一些信息,比如标识符、属性等,更重要的是,它实现了 GAL 所定义的各个接口,包括初始化和终止、图形上下文管理、画点处理函数、画线处理函数、矩形框填充函数、调色板函数等等。
图1 GAL 和图形引擎
如果在某个实际项目中所使用的图形硬件比较特殊,现有的图形引擎均不支持。这时,我们就可以安照 GAL 所定义的接口实现自己的图形引擎,并指定 MiniGUI 使用这种私有的图形引擎即可。这种软件技术实际就是面向对象多态性的具体体现。
利用 GAL 和 IAL,大大提高了 MiniGUI 的可移植性,并且使得程序的开发和调试变得更加容易。我们可以在 X Window 上开发和调试自己的 MiniGUI 程序,通过重新编译就可以让 MiniGUI 应用程序运行在特殊的嵌入式硬件平台上。
在代码实现上,MiniGUI 通过 GFX 数据结构来表示图形引擎,见清单 1。
清单 1
MiniGUI 中的图形引擎结构(src/include/gal.h)
55 typedef struct tagGFX
56 {
57
char*
id;
58
59
// Initialization and termination
60
BOOL
(*initgfx) (struct tagGFX* gfx);
61
void
(*termgfx) (struct tagGFX* gfx);
62
63
// Phisical graphics context
64
GAL_GC
phygc;
65
int
bytes_per_phypixel;
66
int
bits_per_phypixel;
67
int
width_phygc;
68
int
height_phygc;
69
int
colors_phygc;
70
BOOL
grayscale_screen;
71
72
// GC properties
73
int
(*bytesperpixel) (GAL_GC gc);
74
int
(*bitsperpixel) (GAL_GC gc);
75
int
(*width) (GAL_GC gc);
76
int
(*height) (GAL_GC gc);
77
int
(*colors) (GAL_GC gc);
78
79
// Allocation and release of graphics context
80
int
(*allocategc) (GAL_GC gc, int width, int height, int depth,
81
GAL_GC* newgc);
82
void
(*freegc) (GAL_GC gc);
83
void
(*setgc) (GAL_GC gc);
84
85
// Clipping of graphics context
86
void
(*enableclipping) (GAL_GC gc);
87
void
(*disableclipping) (GAL_GC gc);
88
int
(*setclipping) (GAL_GC gc, int x1, int y1, int x2, int y2);
89
int
(*getclipping) (GAL_GC gc, int* x1, int* y1, int* x2, int* y2);
90
91
// Background and foreground colors
92
int
(*getbgcolor) (GAL_GC gc, gal_pixel* color);
93
int
(*setbgcolor) (GAL_GC gc, gal_pixel color);
94
int
(*getfgcolor) (GAL_GC gc, gal_pixel* color);
95
int
(*setfgcolor) (GAL_GC gc, gal_pixel color);
96
97
// Convertion between gal_color and gal_pixel
98
gal_pixel (*mapcolor) (GAL_GC gc, gal_color *color);
99
int
(*unmappixel) (GAL_GC gc, gal_pixel pixel, gal_color* color);
100
int
(*packcolors) (GAL_GC gc, void* buf, gal_color* colors, int len);
101
int
(*unpackpixels) (GAL_GC gc, void* buf, gal_color* colors, int len);
102
103
// Palette operations
104
int
(*getpalette) (GAL_GC gc, int s, int len, gal_color* cmap);
105
int
(*setpalette) (GAL_GC gc, int s, int len, gal_color* cmap);
106
int
(*setcolorfulpalette) (GAL_GC gc);
107
108
// Box operations
109
size_t
(*boxsize) (GAL_GC gc, int w, int h);
110
int
(*fillbox) (GAL_GC gc, int x, int y, int w, int h,
111
gal_pixel pixel);
112
int
(*putbox) (GAL_GC gc, int x, int y, int w, int h, void* buf);
113
int
(*getbox) (GAL_GC gc, int x, int y, int w, int h, void* buf);
114
int
(*putboxmask) (GAL_GC gc, int x, int y, int w, int h, void* buf, gal_pixel cxx);
115
int
(*putboxpart) (GAL_GC gc, int x, int y, int w, int h, int bw,
116
int bh, void* buf, int xo, int yo);
117
int
(*putboxwithop) (GAL_GC gc, int x, int y, int w, int h,
118
void* buf, int raster_op);
119
int
(*scalebox) (GAL_GC gc, int sw, int sh, void* srcbuf,
120
int dw, int dh, void* dstbuf);
121
122
int
(*copybox) (GAL_GC gc, int x, int y, int w, int h, int nx, int ny);
123
int
(*crossblit) (GAL_GC src, int sx, int sy, int sw, int sh,
124
GAL_GC dst, int dx, int dy);
125
126
// Horizontal line operaions
127
int
(*drawhline) (GAL_GC gc, int x, int y, int w, gal_pixel pixel);
128
int
(*puthline)
(GAL_GC gc, int x, int y, int w, void* buf);
129
int
(*gethline)
(GAL_GC gc, int x, int y, int w, void* buf);
130
131
// Vertical line operations
132
int
(*drawvline) (GAL_GC gc, int x, int y, int h, gal_pixel pixel);
133
int
(*putvline)
(GAL_GC gc, int x, int y, int h, void* buf);
134
int
(*getvline)
(GAL_GC gc, int x, int y, int h, void* buf);
135
136
// Pixel operations
137
int
(*drawpixel) (GAL_GC gc, int x, int y, gal_pixel pixel);
138
int
(*putpixel) (GAL_GC gc, int x, int y, gal_pixel color);
139
int
(*getpixel) (GAL_GC gc, int x, int y, gal_pixel* color);
140
141
// Other drawing
142
int
(*circle) (GAL_GC gc, int x, int y, int r, gal_pixel pixel);
143
int
(*line) (GAL_GC gc, int x1, int y1, int x2, int y2,
144
gal_pixel pixel);
145
int
(*rectangle) (GAL_GC gc, int l, int t, int r, int b,
146
gal_pixel pixel);
147
148
// Simple Character output
149
int
(*putchar) (GAL_GC gc, int x, int y, char c);
150
int
(*putstr) (GAL_GC gc, int x, int y, const char* str);
151
int
(*