Chinaunix首页 | 论坛 | 博客
  • 博客访问: 118901
  • 博文数量: 121
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 1210
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-03 23:43
文章分类

全部博文(121)

文章存档

2011年(1)

2010年(6)

2009年(114)

我的朋友

分类: LINUX

2009-10-04 00:48:18

minigui GAL层学习

2007032909

GAL分析想写已经很久了,但是就是没动笔。自己做事情太没魄力了

 

进入src/gal目录

 

第一步通读各文件,

 

GAL.c

定义静态全局GFX数组GFX gfxes [];(GFX结构名称的意思我不明白)

我以为要浪费好多的内存空间,每个GFX都是很大的,

这就要求我们在配置时候,对不需要的GAL设备不要选太多。

每个结构只是填充了初始化,销毁函数,每个结构体的其他成员,指针函数都是通过调用自身的初始化函数填充的。

 

并定义了一个全局指针变量 GFX* cur_gfx;

这个应该是上层GDI程序调用GAL层的关键结点所在吧。

 

此文件中在全局中对GAL初始化的函数InitGAL函数最重要了,

看到GAL的代码让我又对程序设计中高模块化,接口要力求简单的道理有了深层的理解了。InitGAL

首先是对配置文件导入的参量解析,并判断选择哪个GAL设备,并找出赋值给cur_gfx;这就使得GAL层和GDI层次有了联系了。

再通过cur_gfx指向的GAL设备的初始化函数进行真正的设备的初始化,这又是面向对象的思想。自己的变量,自己操作。真正的初始化代码到相应设备文件中,再详细描述。

 

文件中的销毁函数就没那么复杂了,

因为 cur_gfx结构不用在初始化了,直接调用它的销毁函数就可以了。

 

libggi.h

这是什么GGI库的头文件,我不了解。

只提供初始化,销毁函数

 

 libggi.c

文件中很多的函数,就是GFX的相应指针的具体实现,

不了解分析的就不会仔细并有深度了。(插一句,我记笔记是让我自己看的,我不会没事,在文章中复制粘贴下来资料,那不是自己的体会,笔记最重要的是自己现在怎么思维的,等一段时间之后,我了自己的笔记,依然能想起来,我现在的想法,可以清晰的了解我的学习过程,就算是给自己整理自己的历史了吧,已史为镜)。

 

看到GAL_GC结构,其中每个分量都是各个GAL对象,让我有些启发,相当与一个树,你就拿着那树根,

再找你要的GAL对象,他们都是并行的结构。就好象我们班的同学都要买不同的东西,我们都会去商店,各人买各人的东西。

 

现把各个函数原形列表如下:

static int bytes_per_pixel (GAL_GC gc)

static int bits_per_pixel (GAL_GC gc)

static int width (GAL_GC gc)

static int height (GAL_GC gc)

static int colors (GAL_GC gc)

static int allocategc (GAL_GC gc, int width, int height, int depth,

                GAL_GC* newgc)

static void freegc (GAL_GC gc)

static void enableclipping (GAL_GC gc)

static void disableclipping (GAL_GC gc)

static int setclipping (GAL_GC gc, int x1, int y1, int x2, int y2)

static int getclipping (GAL_GC gc, int* x1, int* y1, int* x2, int* y2)

static int getbgcolor (GAL_GC gc, gal_pixel* color)

static int setbgcolor (GAL_GC gc, gal_pixel color)

static int getfgcolor (GAL_GC gc, gal_pixel* color)

static int setfgcolor (GAL_GC gc, gal_pixel color)

inline static gal_uint16 rgb8to16 (gal_uint8 rgb)

inline static gal_uint8 rgb16to8 (gal_uint16 rgb)

static gal_pixel mapcolor(GAL_GC gc, GAL_Color *color)

static int unmappixel (GAL_GC gc, gal_pixel pixel, GAL_Color* color)

static int getpalette (GAL_GC gc, int s, int len, GAL_Color* cmap)

static int setpalette (GAL_GC gc, int s, int len, GAL_Color* cmap)

static int setcolorfulpalette (GAL_GC gc)

static size_t boxsize (GAL_GC gc, int w, int h)

static int fillbox (GAL_GC gc, int x, int y, int w, int h,

                gal_pixel pixel)

static int putbox (GAL_GC gc, int x, int y, int w, int h, void* buf)

static int getbox (GAL_GC gc, int x, int y, int w, int h, void* buf)

static int putboxmask (GAL_GC gc, int x, int y, int w, int h, void* buf, gal_pixel transparent)

static inline int muldiv64(int m1, int m2, int d)

static inline int muldiv64 (int m1, int m2, int d)

int scalebox (GAL_GC gc, int w1, int h1, void *_dp1, int w2, int h2, void *_dp2)

static int copybox (GAL_GC gc, int x, int y, int w, int h, int nx, int ny)

static int crossblit (GAL_GC src, int sx, int sy, int sw, int wh,

                GAL_GC dst, int dx, int dy)

static int drawhline (GAL_GC gc, int x, int y, int w, gal_pixel pixel)

static int drawvline (GAL_GC gc, int x, int y, int h, gal_pixel pixel)

static int drawpixel (GAL_GC gc, int x, int y, gal_pixel pixel)

static int getpixel (GAL_GC gc, int x, int y, gal_pixel* color)

static int circle (GAL_GC gc, int x, int y, int r, gal_pixel pixel)

static int line (GAL_GC gc, int x1, int y1, int x2, int y2,

                gal_pixel pixel)

static int rectangle (GAL_GC gc, int l, int t, int r, int b,

                gal_pixel pixel)

static void panic (int exitcode)

 

这是非常重要的设备初始化程序了

// Initialization and termination of  LibGGI

BOOL InitLibGGI (struct tagGFX* gfx)

 

现在让我有点迷糊了,到底谁是设备的抽象呢?

应该是GAL_GC吧

 

Svgalib.c Svgalib.h看了之后没什么感触,就是和前面LIBGGI的一样,具体画图实现的功能都是由它调用的库完成的,在MINIGUI-GAL层中只是做了个封装。

Vga16.c,vga16.h 也是一样,它的底层实现是直接调用LINUX系统内核的功能实现的。

它没有其他的库实现那么舒服了,必须自己封装结构了。

 

typedef struct tagGC_VGA16

{

    int doclip;

    int clipminx, clipminy, clipmaxx, clipmaxy;

 

    int xres, yres;

    int pitch;

 

    gal_pixel gr_background;

    gal_pixel gr_foreground;

 

    unsigned char scanline[640];

 

    unsigned char* fb_buff;

 

} GC_VGA16;

 

其中scanline[640]不太清楚具体用途,里面的函数具体实现也没仔细看,晓得里面有个RGB颜色和像素值之间的转化的映射关系。

 

下面进到

src/gal/native

 

首先,研究native.c文件,这是非常重要的GAL接口文件。

起有些实现功能是在genfunction.c

 

现写到次,下次再具体细化,详细。

阅读(1040) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~