当前位置: 查字典论文网 >> SVGA图像处理

SVGA图像处理

格式:DOC 上传日期:2013-12-18 11:17:22
SVGA图像处理
时间:2013-12-18 11:17:22     小编:

SVGA图像处理 SVGA图像处理 SVGA图像处理 SVGA彩色图形卡是一种超级VGA卡,它不仅具有640×480×16色图像显示模式,而且具有640×480×256色图像显示模式。

Microsoft C/C++7.0提供了丰富的图形库函数,尤其是提供了对SVGA卡所能设置的高分辨率图像模式的支持,利用丰富的图形库函数进行组合,就可以完成各种需要的功能。例如图像处理,动画编程,界面制作等。这一点对编程者来说无疑是十分方便的。根据VESA图形标准,在图像模式下,SVGA的Video buffer(视频缓冲区)是顺序的链结构,且图像数据是按行序顺序存放的,一个像素(屏幕上的一个点)用存储器的一个字节(256色)表示。视频存储器按字节连续寻址,与主机内存采用映射方式通讯,一次只能读写64KB的视频存储器,通过改变段偏移量(I/O操作)来寻址不同的段,即实现对全部视频存储器的操作。

同时,直接访问SVGA的寄存器进行读写操作,充分利用硬件的支持可以大大加快图形的处理速度。实践表明,其运行速度明显优于图形库中提供的函数(以-getimage()和-putimage()为例快30倍)。-getimage()和-putimage()两个函数的参数类型说明及意义与Microsoft C/C++7.0中相应函数的参数类型说明及意义相同。

/* 将图像存储到缓冲区中 */short x1,y1,x2,y2;

char-huge *image;

{

char-far*buf,-huge *q;

long u;

short m,n,i,j,block;

m=abs(x2-x

1)+1;

n=abs(y2-y

1)+1;

(short)*image=m;

(short)*(image+

2)=n;/* 保留图像的高度与宽度 */

q=image+4;u+=min(y1,y

2) * 640L;

block=(short)(u/65536L);

u-=block*65536L;/* 计算偏移量 */

-FP-SEG(buf)=0xA000;

-FP-OFF(buf)=u;

-outp(0x3c4,

1

4),

-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,

1

4);

-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)>6

40) m=640-x;

else m=mm;

-memcpy(&n, image+2,

2);

if (y+n>4

80) 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,

1

4);

-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,

1

4);

-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;

}

}

}

全文阅读已结束,如果需要下载本文请点击

下载此文档

相关推荐 更多