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

| 
							高中各年级课程推荐 | ||||
| 
							年级 | 
							学期 | 
							课程名称 | 
							课程试听 | |
| 高一 | 
							高一(上)、(下)同步复习 | 语文 | ||
| 英语 | ||||
| 数学 | ||||
| 数学(期中串讲) | ||||
| 数学(期末串讲) | ||||
| 数学拔高 | ||||
| 物理 | ||||
| 化学 | ||||
| 生物(一) | ||||
| 地理 | ||||
| 历史 | ||||
| 政治 | ||||
| 
							高中专项突破课 | 语文写作 | |||
| 英语阅读理解 | ||||
| 英语写作 | ||||
| 英语完形填空 | ||||
| 物理功和能量 | ||||
| 高二 | 
							高二(上)、(下)同步复习 | 语文 | ||
| 英语 | ||||
| 数学(理) | ||||
| 数学拔高(理) | ||||
| 数学(文) | ||||
| 数学拔高(文) | ||||
| 物理 | ||||
| 数学(期中串讲) | ||||
| 数学(期末串讲)(理) | ||||
| 数学(期末串讲)(文) | ||||
| 化学 | ||||
| 生物(一) | ||||
| 生物(二) | ||||
| 生物(三) | ||||
| 地理 | ||||
| 历史 | ||||
| 政治 | ||||
| 高三 | 
							高考第一轮复习 | 语文 | ||
| 英语 | ||||
| 数学(理) | ||||
| 数学拔高(理) | ||||
| 数学(文) | ||||
| 数学拔高(文) | ||||
| 物理 | ||||
| 物理拔高 | ||||
| 化学 | ||||
| 生物 | ||||
| 地理 | ||||
| 政治 | ||||
| 历史(韩校版) | ||||
| 历史(李晓风版) | ||||
| 
							高考第二轮复习 | 数学(理) | |||
| 数学(文) | ||||
| 英语 | ||||
| 物理 | ||||
| 化学 | ||||
| 地理 | ||||
| 
							高考第三轮冲刺串讲 | 语数英串讲(理) | |||
| 语数英串讲(文) | ||||
| 物化生串讲 | ||||
| 史地政串讲 | ||||
| 
							高考试题精讲 | 数学(理) | |||
| 英语 | ||||
| 化学 | ||||
| 物理 | ||||
| 2021高考研究2021高考策略(理) | ||||
| 2021高考研究2021高考策略(文) | ||||
Copyright © 2005-2020 Ttshopping.Net. All Rights Reserved .         |
云南省公安厅:53010303502006 滇ICP备16003680号-9
本网大部分资源来源于会员上传,除本网组织的资源外,版权归原作者所有,如有侵犯版权,请立刻和本网联系并提供证据,本网将在三个工作日内改正。

