⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gif.h

📁 winsail v2.0是用于DOS下的图形界面空间系统
💻 H
字号:
#ifndef _GIF_PICTURE_
#define _GIF_PICTURE_


//GIF的LZW算法的编译表
//串表最大12位,即4096字节,初始化到索引"色深+2"字节,内容为0~色深+1
//	每个string可以形成一棵二叉树, 此二叉树仅有一个右节点
//	因为wPrefix总是指向String Table中的另一位置, 而wSuffix指向"0~色深-1"
struct LZW_COMPILE_TABLE
{
	WORD	wPrefix ;	// 为 Old
	WORD	wSuffix ;	// 为 GetFirstChar (Old) 或 GetFirstChar (Code)
};

struct GIF_HEADER //GIF文件头
{
	BYTE  bySignature[3]; //署名,
	BYTE  byVersion[3];	 //版本号,"87a"表1987年5月版本,"89a"表1989年7月版本
};

struct GIF_SCREEN //逻辑屏幕标识符
{
	WORD  wScreenWidth; //逻辑屏幕宽度
	WORD  wScreenHeight; //逻辑屏幕高度
	struct  flag
	{
		BYTE pixel:3; //全局颜色列表大小,pixel+1确定颜色列表的索引数(2的pixel+1次方).
		BYTE s:1; //分类标志(Sort Flag),如果置位表示全局颜色列表分类排列.
		BYTE cr:3; //颜色深度(Color ResoluTion),cr+1确定图象的颜色深度.
		BYTE m:1; //全局颜色列表标志(Global Color Table Flag)。
	}Flag;
	BYTE  byBackgroundColor; //前景色
	BYTE  byAspectRatio; //像素宽高比
};

struct GIF_RGBQUAD
{
	BYTE byRed;
	BYTE byGreen;
	BYTE byBlue;
};

/*一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,
  图象标识符以0x2C(',')字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑
  屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成。

  GIF图象数据使用了LZW压缩算法,大大减小了图象数据的大小。图象数据在压缩前有两种
  排列格式:连续的和交织的(由图象标识符的交织标志控制)。连续方式按从左到右、从上
  到下的顺序排列图象的光栅数据;交织图象按下面的方法处理光栅数据:

  创建四个通道(pass)保存数据,每个通道提取不同行的数据:
  第一通道(Pass 1)提取从第0行开始每隔8行的数据;
  第二通道(Pass 2)提取从第4行开始每隔8行的数据;
  第三通道(Pass 3)提取从第2行开始每隔4行的数据;
  第四通道(Pass 4)提取从第1行开始每隔2行的数据;
*/

struct GIF_ENTRY //图像标识符
{
	BYTE byFlags;      //图象标识符开始标志,恒定于0x2C
	WORD  wImageLeft ; // 图象相对于逻辑屏幕左上角的x坐标,常为0;
	WORD  wImageTop ; //  图象相对于逻辑屏幕左上角的y坐标,常为0
	WORD  wImageWidth ;// 图象的宽度
	WORD  wImageHeight ;// 图象的高度
	struct flag
	{
		BYTE pixel:3; //局部颜色列表大小,pixel+1就为颜色列表的位数
		BYTE r:2; //保留,必须初始化为0.
		BYTE s:1; //分类标志,如果置位表示紧跟着的局部颜色列表分类排列.
		BYTE i:1; //交织标志,置位时图象数据使用连续方式排列,否则使用顺序排列。
		BYTE m:1; //局部颜色列表标志。
	}Flag;
};

/*这一部分是可选的(需要89a版本),可以放在一个图象块(包括图象标识符、局部颜色列表
  和图象数据)或文本扩展块的前面,用来控制跟在它后面的第一个图象(或文本)的渲
  染(Render)形式。
*/
struct GIF_CONTROL_EX //图形控制扩展块
{
	BYTE byFlags1;  //扩展块,恒定于0x21
	BYTE byFlags2;  //图形控制扩展块,恒定于0xF9
   BYTE bySize;    //不包括块终结器,固定值4
	struct  flag
	{
		WORD t:2; //透明色标志,置位表示使用透明颜色
		WORD i:2; //用户输入标志
					//指出是否期待用户有输入之后才继续进行下去,置位表示期待,值否
					//表示不期待。用户输入可以是按回车键、鼠标点击等,可以和延迟
					//时间一起使用,在设置的延迟时间内用户有输入则马上继续进行,或
					//者没有输入直到延迟时间到达而继续。

		WORD method:8; //处置方法
							//0 - 不使用处置方法
							//1 - 不处置图形,把图形从当前位置移去
							//2 - 回复到背景色
							//3 - 回复到先前状态
							//4-7 - 自定义
		WORD reserved:4; //保留
	}Flag;
	BYTE byDelayTime; //单位1/100秒,如果值不为1,表示
							//暂停规定的时间后再继续往下处理数据流
	BYTE byTransparentIndex; //透明色索引值
	BYTE byTerminator; //标识块终结,固定值0


};

/*这一部分是可选的(需要89a版本),可以用来记录图形、版权、
  描述等任何的非图形和控制的纯文本数据(7-bit ASCII字符),
  注释扩展并不影响对图象数据流的处理,解码器完全可以忽略它。
  存放位置可以是数据流的任何地方,最好不要妨碍控制和数据块,
  推荐放在数据流的开始或结尾。
*/
struct GIF_COMMENT_EX //注释扩展块
{
	BYTE byFlags1;  //扩展块,恒定于0x21
	BYTE byFlags2;  //图形控制扩展块,恒定于0xFE
	// + 多个 Comment Data
	// + Terminator - 标识块终结,固定值0

};

/*这一部分是可选的(需要89a版本),用来绘制一个简单的文本图象,
  这一部分由用来绘制的纯文本数据(7-bit ASCII字符)和控制绘制的
  参数等组成。绘制文本借助于一个文本框(Text Grid)来定义边界,
  在文本框中划分多个单元格,每个字符占用一个单元,绘制时按从左到右、
  从上到下的顺序依次进行,直到最后一个字符或者占满整个文本框(之后的
  字符将被忽略,因此定义文本框的大小时应该注意到是否可以容纳整个文本),
  绘制文本的颜色使用全局颜色列表,没有则可以使用一个已经保存的前一个
  颜色列表。另外,图形文本扩展块也属于图形块(Graphic Rendering Block),
  可以在它前面定义图形控制扩展对它的表现形式进一步修改。
*/
struct GIF_TEXT_EX //图形文本扩展块
{
	BYTE byFlags1;  //扩展块,恒定于0x21
	BYTE byFlags2;  //图形文本控制扩展块,恒定于0x01
	BYTE bySize;    //块大小,固定值12
	WORD wTextLeft; //文本框离逻辑屏幕的左边界距离
	WORD wTextTop;  //文本框离逻辑屏幕的上边界距离
	WORD wTextWidth;//文本框宽度
	WORD wTextHeight;//文本框高度

	BYTE byCellWidth;//单个单元格宽度
	BYTE byCellHeight;//单个单元格宽度
	BYTE byForegroundIndex;//前景色在全局颜色列表中的索引
	BYTE byBlackgroundIndex;//背景色在全局颜色列表中的索引

	// + 多个 Text Data
	// + Terminator - 标识块终结,固定值0

};

/*这是提供给应用程序自己使用的(需要89a版本),应用程序可以在这里定义
  自己的标识、信息等。
*/
struct GIF_APPLICATION_EX
{
	BYTE byFlags1;  //扩展块,恒定于0x21
	BYTE byFlags2;  //应用程序扩展块,固定值0xFF
	BYTE bySize;    //块大小,固定值11
	BYTE byIdentify[8];//应用程序标识符
	BYTE byAuthenticationCode[3];//应用程序鉴别码

	// + 多个  Data
	// + Terminator - 标识块终结,固定值0

};




#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -