(1)图层管理结构的初始化
系统对桌面图形做出图形结构的管理形式,图层管理表的结构如下:
struct SHTCTL
{
 unsigned char *vram, *map;
 int xsize, ysize, top;
 struct SHEET *p_sheets[MAX_SHEETS];
 struct SHEET sheets[MAX_SHEETS];
};
  vram 图像缓冲区首地址
   xsize, ysize 分辨率的x和y 与BOOTINFO中的值相同
   sheets 图层指针数组, 指向sheets0中各个图层
   sheets0 图层数组, 存放各个图层结构
sheets的存在主要是避免sheet结构体大大量排序影响内核效率。
单个图层结构体如下:
struct SHEET
{
 unsigned char *buf;
 int bxsize, bysize, vx0, vy0, col_inv, height, flags;
 struct SHTCTL *ctl;
};
   用来记录单个图层的信息
   buf 是记录图层上所描画内容的地址
   bxsize, bysize 图层的行数和列数
   vx0, vy0 图层左上角的坐标
   col_inv 图层的透明色色号
   height 图层的高度
   flags 记录图层各种状态信息
图层支持透明色,典型的例子就是鼠标图层。
图层管理结构的初始化,是建立在内存分配的基础上,首先从内存中分配足够大的内存空间,也为图层地图分配了内存空间,内存地图的作用后面进行介绍。
最后便利所有图层,初始化所有的图层的使用标志为未使用,且把sheet管理的结构体指向自身。
(2)图层的分配
图层的分配比较简单,主要是遍历图层管理表 ,查找第一个未使用的图层,即Flag=0的图层。找到之后,该图层的使用状态时使用,并且高度设置为-1,即不显示,最后返回该图层地址,如果失败返回0.
(3)图层的刷新相关算法
图层的刷新考虑到很多的算法设计,在优秀的系统设计中,对于图层的设置都不会刷新全部的内容,这样的算法效率太低,所以只会刷新相关需要显示的相关区域。
对图层的刷新主要有几个图层功能需要调用实现,首先是图层的移动函数。对图层的移动,需要提供三个参数,第一,需要移动的图层,第二是移动图层目的位置的横纵坐标。
移动的第一步是记录,图层原先的位置坐标,然后设置sheet结构体中现位置坐标。然后进行刷新操作。
刷新的第一步是根据图层地图,这个地图的作用更新图层鼠标的数据到显存的时候,对照图层地图进行更新。
更新屏幕区域的地图信息,需要指定该图层管理结构体,和需要刷新位置的坐标(左上角和右下角),以及该图层的高度。高度的指定是为了提高效率设置的,该高度以下的图层不需要更新到图层地图。
在更新内存地图的时候,首先需要调整输入更新坐标的位置,这是为了当一个图层移动的位置超过屏幕位置部分将不进行刷新。
然后在遍历高度在指定图层之上的图层,将图层在sheets中的下标,存入图层地图,最后按钮图层地图进行刷新操作。
(4)图层的平移及高度设定功能
图层的平移主要是调用上述的部分函数,首先图层的平移需要指定图层需要指定需要平移的图层指针,其次指定需要移动目的位置。
指定好坐标后执行下面操作:
刷新原图层矩形到图层地图,其次刷新现在的图层位置到地图。
按照图层地图的绘制,输出数据到显存。
图层平移完成。
图层的高度设定和移动有一致的思路,首先对输入参数进行检查,图层不能高于现有图层高度+1的高度,且不能小于-1。我们用-1来表示图层的隐藏。
这里分成三种情况进行处理,一:图层原高度高于先高度,二:图层原高度低于原高度 三:图层高度不变。第三种情况会直接略过,不进行处理。仅对一二种情况进行操作,这种操作的原理是对p_sheets图层进行排序,采用的方式是有序数组排序的通用方式。
进行排序完成之后,刷新相关图层区域管理地图,并刷新到显存中显示。
当然还有相关配套的图层的释放和设置算法比较简单,这里不做更详细说明。