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
现写到次,下次再具体细化,详细。