计算机理论

计算机网络
计算机理论
计算机应用
电子商务

本类阅读TOP10

·Frontpage网页制作
·C#做的ASP.NET登錄篇
·C语言实现串行通信接口程序
·Foxpro DBF数据库转换成SQL Server 6.5表的几种方法
·企业信息化的新选择——Intranet
·动态哈夫曼编码的改进
·论计算机网络中服务的概念
·Visual C++中的开放数据库连接技术
·关于烟汽应用计算机信息技术加强企业管理的调查报告
·Solaris下PRO*C和OCI程序设计分析与比较

分类导航
演讲致辞党团范文
心得体会领导讲话
经验介绍事迹材料
总结汇报计划方案
常用范文写作指南
证券金融银行管理
债务市场保险租赁
金融研究证券投资
财务管理投资决策
财务分析融资决策
财务管理市场营销
会计审计会计审计
成本会计管理会计
CPA行业管理学
战略竞争旅游管理学
成本管理管理学理论
物流管理人力资源管理
财政税收财政政策
财税法规税务研讨
税收理论国债研究
财政研究经济学
中国经济经济学理论
新经济学产业经济
国际经济经济学相关
地方经济发展战略
国际贸易公共管理
公共政策行政管理
经济管理企业战略
管理理论市场营销
企业研究企业文化
文化类西方文化
传统文化社会学相关
艺术学美学
音乐影视
艺术理论社会学
伦理道德环境保护
人口问题农村研究
教育学历史学
教育学国学
理工科理科相关
统计学物理学
工业设计交通
土建水利学材料工程学
电子学通信学
化工计算机
计算机网络计算机理论
计算机应用电子商务
文学外国语
人物研究哲学
哲学相关思想哲学
科技哲学中国哲学
西方哲学逻辑学
政治政治相关
民族主义资本主义
社会主义马克思主义
法律行政法
法学理论司法制度
经济法民法
医学医学
临床医学药学
其他文秘
公务员考试最新资讯
考试资料复习指导
面试指南教育教学
SVGA图像处理

作者:未知 来源:应用文写作网 加入时间:2005-12-29 月光软件站


   SVGA彩色图形卡是一种超级VGA卡,它不仅具有640×480×16色图像显示模式,而且具有640×480×256色图像显示模式。
Microsoft C/C++7.0提供了丰富的图形库函数,尤其是提供了对SVGA卡所能设置的高分辨率图像模式的支持,利用丰富的图形库函数进行组合,就可以完成各种需要的功能。例如图像处理,动画编程,界面制作等。这一点对编程者来说无疑是十分方便的。
然而遗憾的是许多图形库函数在一些特定的显示模式(如-VERS256COLOR(0x0101)方式(640×480×256)等256色模式)下却无法正常工作,例如使用例程-getimage()和-putimage()时常会出现死机和不能正常工作(出现雪花或不进行任何操作)等现象。用-grstatus()函数检测调用函数的状态时,返回图形错误或警告信息,常见的有图形错误(-1)和不支持请求的视频方式(-2)等,而这些函数在VGA下工作正常。
根据VESA图形标准,在图像模式下,SVGA的Video buffer(视频缓冲区)是顺序的链结构,且图像数据是按行序顺序存放的,一个像素(屏幕上的一个点)用存储器的一个字节(256色)表示。视频存储器按字节连续寻址,与主机内存采用映射方式通讯,一次只能读写64KB的视频存储器,通过改变段偏移量(I/O操作)来寻址不同的段,即实现对全部视频存储器的操作。
同时,直接访问SVGA的寄存器进行读写操作,充分利用硬件的支持可以大大加快图形的处理速度。实践表明,其运行速度明显优于图形库中提供的函数(以-getimage()和-putimage()为例快30倍)。
笔者通过对视频存储器(Video buffer)的直接访问实现了256色图像显示模式下图像块的读写功能。下面附上在VESA标准的0x0101(256)图像显示模式下-getimage()和-putimage()两个函数的源程序,该源程序是用Microsoft C/C++7.0编写的。这两个函数在Compaq 486及兼容机上运行通过。
-getimage()和-putimage()两个函数的参数类型说明及意义与Microsoft C/C++7.0中相应函数的参数类型说明及意义相同。
/* 将图像存储到缓冲区中 */
void-getimage256(x1,y1,x2,y2,image)
short x1,y1,x2,y2;
char-huge *image;
{
char-far*buf,-huge *q;
long u;
short m,n,i,j,block;
m=abs(x2-x1)+1;
n=abs(y2-y1)+1;
(short)*image=m;
(short)*(image+2)=n;/* 保留图像的高度与宽度 */
q=image+4;
u=min(x1,x2);
u+=min(y1,y2) * 640L;
block=(short)(u/65536L);
u-=block*65536L;/* 计算偏移量 */
-FP-SEG(buf)=0xA000;
-FP-OFF(buf)=u;
-outp(0x3c4,14),
-outp(0x3C5,block^2);/* 设置页寄存器 */
for (i=0; i<n; i++, q+=m) {/* 行循环 */
-memcpy(q, buf, m);
u+=640;
if(u<65536L) buf+=640;
else {/* 当一行不在同一段时 */
u-=65536L;
-FP-SEG(buf)=0xA000;
-FP-OFF(buf)=0;
block++;
-outp(0x3C4,14);
-outp(0x3C5,block^2);
if(m>640-u)-memcpy(q+640-u,buf,(size-t)(m-640+u));
-FP-OFF(buf)=u;
}
}
}
/* 在缓冲区中搜索图像 */
void-putimage256(x,y,image,action)
short x,y,action;/* 参数action表示图像写方式 */
char-huge * image;
{
char-far *buf,-huge*q;
long u;
short m, n, j, i, block, mm;
-memcpy(&mm, image, 2);
if ((x+mm)>640) m=640-x;
else m=mm;
-memcpy(&n, image+2, 2);
if (y+n>480) n=480-n;/* 取图像的高度和宽度,并进行边界处理 */
q=image+4;
u=x;
u+=y*640L;
block=(short) (u/65536L);
u-=block*65536L;
-FP-SEG(buf)=0xA000;
-FP-OFF(buf)=u;
-outp(0x3C4, 14);
-outp(0x3C5, block^2);
for (i=0; i<n; i++,q+=mm) {
if (action==-GPSET) -memcpy(buf, q, m);
else if(action==-GOR)for (j=0;j<m; j++) * (buf+j)|=(*(q+j));
else if(action==-GAND)for (j=0;j<m; j++) * (buf+j)&=(* (q+j));
else if(action==-GXOR)for (j=0;j<m; j++) * (buf+j)^=(* (q+j));
else if(action==-GPRESET)for (j=0;j<m; j++) * (buf+j)=~(* (q+j));
u+=640;
if(u<65536L) buf+=640;
else {
u-=65536L;
-FP-SEG(buf)=0xA000;
-FP-OFF(buf)=0;
block++;
-outp(0x3C4, 14);
-outp(0x3C5, block^2);
if (m>640-u) {
if (action==-GPSET) -memcpy(buf,q+640-u, (size-t)(m-640+u));
else if(action==-GOR)
for(j=0;j<m-640+u;j++) *(buf+j)|=(*(q+640-u+j));
else if(action==-GAND)
for(j=0;j<m-640+u;j++) * (buf+j)&=(*(q+640-u+j));
else if (action==-GXOR)
for(j=0;j<m-640+u;j++) * (buf+j)^=(*(q+640-u+j));
else if(action==-GPRESET)
for(j=0;j<m-640+u;j++) * (buf+j)=~(* (q+640-u+j));
}
-FP-OFF(buf)=u;
}
}


作者:畅哲峰 


相关文章

相关软件