注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

简约男人

简约,不能简单

 
 
 

日志

 
 
关于我

一个过分渴望被理解的人其实就是一个软弱的人, 勇往直前的力量来自斩钉截铁的决心,不是来自别人的理解.

网易考拉推荐

DOS下真彩色图形编程  

2009-10-03 13:10:53|  分类: 我的软件作品 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

自己多方查阅资料写了个所谓的SVGA小型图形库

参考资料、本库、示例代码的下载地址http://download.csdn.net/source/1712857

示例程序绘制出的图像

DOS下真彩色图形编程 - tr0217 - 简约男人

SVGA小型图形库使用说明

    说它是个图形库肯定是夸大其词了。因为提供的接口实在太少了,实用性也不强,只能在学习是拿来做辅助使用。我确实把它称作库了,是由于“给您一个画点函数,您就能描绘整个世界!”

    编写这个图形库目的是为了方便从TC开始学习编程的同学们学习计算机图形学。因为AMD、INTEL高于奔腾D E2180的cpu型号不支持tc中的图形库。其原因是,计算机显示图形的底层实现标准VBE已经改变了好几次,继续对很旧的不再使用的标准提供支持是没有必要的。

    TC对图形的显示原理是,在内存中划分一部分作为显存,写入这部分内存的数据会被CPU转换位显示信号发送给显示器。初始化图形界面其实就是加载显存的内存镜像,即返回操作这片内存的句柄(其实就是个far指针)。TC中初始化图形界面的显存很不标准,相对于VBE标准来说,尤其是调色板区。因为当时还没有统一的标准,所以会出现多种图形驱动。可以看到TC包含了许多的.BGI图形驱动文件。

    现在使用的驱动一般都是高级的VGA。编写TC的图形程序,一般都是初始化为或者注册EGAVGA图形驱动器。这种驱动器只有12色。并且已经不被许多硬件支持了。

    AMD和INTEL的新版CPU不支持TC的绘图程序,以前让我困惑了好久,一直未得到解决。一次偶然的机会了解到VBE标准,及硬件显示原理。又看了《DOS下的VGA编程》。还有‘孙靖’的那篇《开发自己的图形包》的文章。重新把‘孙靖’的代码架构(这个词用在这有些自大,呵呵)了一番,浅浅地添加了几个接口,增加了几个图形模式,就做出了这个所谓的SVGA小型图形驱动器。

    本图形库是通过VBE提供的标准调用中断完成图形模式的。并且本图形库工作在实模式下,即对显存的访问只靠BIOS的支持。所以调用本库的程序不要在windows下直接双击运行。如果您这样做了将会造成蓝屏提示内存完全崩溃或者在显示器上显示一幅图象后机器真死了。直接对内存的访问会破坏操作系统对内存的划分,导致操作系统不能使用一些或者全部的内存资源,从而造成蓝屏或者进程死锁(结果就是死机)。

    所以要想在windows下使用本图形库,必须要有第三方的软件的支持。第三方软件需要提供本库所访问的实际内存的虚拟,使其运行时不破坏操作系统的内存结构。其次就是完成对显存的操作到频显的转换。我们使用的这个第三方软件称作DOSBOX,是一款开源免费的软件。我估计其存在的理由就是为了给编写图形驱动的程序员们在windows下查看效果调试程序以支持。

    DOSBOX的使用很简单。双击DOSBOX会打开两个窗口,一个命令提示符窗口,该窗口用于显示DOSBOX的信息;一个windows风格的窗口,在该窗口里可以执行所有的DOS命令,及DOSBOX的命令。DOSBOX要访问某个驱动器需要先挂载某个驱动器,就像有些或者老版本的linux一样。挂载就是完成硬件的驱动及标记。在windows下插入U盘或者移动磁盘操作系统自动完成驱动及标记。所以使用windows的人员对挂载没有概念。DOSBOX的挂载命令:mount 需挂载驱动器 目标路径。比如:要将D盘挂载到E:\下,就在windows风格的窗口下输入命令:mount d e:\ 然后回车。退出DOSBOX输入exit,这和命令提示符一样。

    本图形库提供的图形模式有:

    G320X200X256
    G640X480X256
    G800X600X256
    G1024X768X256

    G640X480X16B
    G640X480X24B
    G800X600X16B
    G800X600X24B
    G1024X768X24B

    以上字符串中第一个数代表的水平分辨率,第二个代表竖直分辨率,第三个除256代表颜色数外其余代表颜色深度。


    本图形库提供的结构有:
*==================    图形模式架构方法   ==================*/

/* 获取当前模式     */            
INT16   GetSVGAMode();

/* 设置图形模式     */
BOOL    SetSVGAMode(INT16 vmode);

/* 换页函数         */
void    SelectPage(register UINT8 page);


上两个函数是为内部实现用的,客户可以不必使用。在此列出来只是为了让使用者对该库的实现有一个初步的了解。


/* 图形初始化       */
void    InitSVGA(INT16 vmode);

/* 回到原来模式     */
void    ExitSVGA();

/*清屏*/
void    ClrScreen();

/*设置调色板*/
在256色模式下有用,不然结果未知。
void    SetPalette(const RGBQUAD * bmiColors ,INT16 QuadSize);



/*=================  基本图形绘制方法   =======================*/

注意: y代表纵坐标,x代表很坐标;坐标值具有c语言中数组的特性从(0,0)开始,到(maxx-1,maxy-1);调用函数时注意数据类型的匹配问题。

    下面几个函数看似实现了重载,其实不然TC的C语言是没有重载特性的,本库通过全局函数变量实现了类似重载。以便能够更方便的使用接口。

/*8位色画点函数*/
void    Dot(INT16 x, INT16 y, UINT8 color);

/*16位色画点函数*/
void    Dot(INT16 x, INT16 y, UINT16 color);

/* 24位色画点函数 */
void    Dot(INT16 x, INT16 y, UINT32 color);

    填充水平线,主要是为比较快速的显示位图提供的。之所以不是快速,是由于C语言中的普通指针所能操作内存和数组不能超过65536字节。这是由于BIOS对内存的管理是65536字节分为一页的。需要从文件中读一行画一行,外围存储设备毕竟是低速设备,文件的读写不会太快。

    或许你会说可以用far或huge指针但是这两个指针的特性一般人不了解,包括本人在内。因为TC毕竟是过时的东西了。没有也没必要深入的学习。C语言的简单易学,TC编译器支持的C语言的特性之多,以及TC对C语言的扩展;现在还学C语言还是有意义的,对了解微机原理就很有帮助。

/*8位色填充水平线*/
void  HorizontalFillLine(const UINT8 * iml,INT16 x,INT16 y,INT16 width);

/*16位色填充水平线*/
void  HorizontalFillLine(const UINT16 * iml,INT16 x,INT16 y,INT16 width);

/*24位色填充水平线*/
    调用该函数显示位图,只能显示一左边四分之一,右边四分之三显示的很混乱。如果您有兴趣可否帮忙看看,如果您知道了,请不吝告知。
void  HorizontalFillLine(const UINT32 * iml,INT16 x,INT16 y,INT16 width);

/*8位色画水平线*/
void  HorizontalLine(INT16 x,INT16 y,INT16 width,UINT8 color);

/*16位色画水平线*/
void  HorizontalLine(INT16 x,INT16 y,INT16 width,UINT16 color);

/*24位色画水平线*/
void  HorizontalLine(INT16 x,INT16 y,INT16 width,UINT32 color);



/*显示一副位图*/
    该函数用来显示,比较小的8位色位图,几乎不需要时间。如果位图过大则会重复而混乱的显示。这就是TC对普通指针和数组的限制。用来显示高位颜色的图像很混乱。如果您有兴趣可否帮忙看看,如果您知道了,请不吝告知。
void  DrawImage(const UINT8 * img,INT16 x,INT16 y,INT16 imW,INT16 imH);

/* 画线函数     */
void    Line(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT32 color);

/* 画矩形函数   */
void    Rect(INT16 x0, INT16 y0, INT16 x1, INT16 y1, UINT32 color);

/* 画矩形块函数 */   
void    Rectfill(INT16 x0, INT16 y0, INT16 x1, INT16 y1,UINT32 color);

/* 画圆函数     */
void    Circle(INT16 x, INT16 y, UINT16 r, UINT32 color);

/* 画实心圆函数 */
void    Circlefill(INT16 x1, INT16 y1, UINT16 r, UINT32 color);

    本文中不可避免会有错误,如果您发现了,请不吝告知。

 

本图形模式还可以继续添加 
      图形  100h  640*400*256  
      图形  101h  640*480*256  
      图形  102h  800*600*16  
      图形  103h  800*600*256  
      图形  104h  1024*768*16  
      图形  105h  1024*768*256  
      图形  106h  1280*1024*16  
      图形  107h  1280*1024*256  
      文本  108h  80*60*16  
      文本  109h  132*25*16  
      文本  10Ah  132*43*16  
      文本  10Bh  132*50*16  
      文本  10Ch  132*60*16  
      图形  10Dh  320*200*32K  
      图形  10Eh  320*200*64K  
      图形  10Fh  320*200*16M  
      图形  110h  640*480*32K  
      图形  111h  640*488*64K  
      图形  112h  640*480*16M  
      图形  113h  800*600*32K  
      图形  114h  800*600*64K  
      图形  115h  800*600*16M  
      图形  116h  1024*768*32K  
      图形  117h  1024*768*64K  
      图形  118h  1024*768*16M  
      图形  119h  1280*1024*32K  
      图形  11Ah  1280*1024*64K  
      图形  10Bh  1280*1024*16M

  评论这张
 
阅读(964)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017