www.pudn.com > cwin.rar > HLINE.C
/*-----------------------------------------------------------
函数 hline : 横线
-----------------------------------------------------------*/
#include
void _Cdecl _H_Line(x,y,len,color,pattern)
int x; /* 横线左端列坐标(以象素为单位) */
int y; /* 横线左端行坐标(以象素为单位) */
int len; /* 横线长度(以象素为单位) */
int color; /* 线颜色 */
unsigned char pattern; /* 线型 */
{
register char far *addr;
unsigned mask=pattern;
register int i;
/*-- 计算线左端在显示存储器中的地址 ---*/
addr = MK_FP(0xa000,(y+_ScreenTop)*_ScreenWidth+x/8);
/*-- 置显示寄存器组标志为"忙" ---------*/
_VideoBusy = YES;
/*-- 设置显示寄存器组 -----------------*/
outportb(0x3ce,0);
outportb(0x3cf,color);
outportb(0x3ce,1);
outportb(0x3cf,0x0f);
/*-- 如果线局限于一个字节内则直接输出 -*/
if( x%8 && (x+len)/8 == x/8)
{
mask = (pattern>>x%8) & (pattern<<(8-(x+len)%8));
outportb(0x3ce,0x08);
outportb(0x3cf,mask);
*(addr) &= 0xff;
}
else
{
/*-- 如果线左端不满一个字节 -------*/
if(x%8)
{
mask=pattern>>x%8;
outportb(0x3ce,0x08);
outportb(0x3cf,mask);
*(addr)&=0xff;
addr++;
len-=8-x%8;
x=x/8*8+8;
}
/*-- 如果线长大于1个字节 ----------*/
if((x+len)/8 > x/8)
{
outportb(0x3ce,0x08);
outportb(0x3cf,pattern);
for(i=0;i