分享
 
 
 

输入抽象层及NativeEngine的实现一

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

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

(*

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有