📄 lsys3.cpp
字号:
//////////////////////////////////////////////////////////////////////////
#include <lsys.h>
#include <dos.h>
#include <stdio.h>
#include <mem.h>
#include <malloc.h>
#include <conio.h>
#include <time.h>
void lFillLine(short x,short y,short len,uchar color);
void lGetLine(short x,short y,short len,char *p);
void lScanLine(short x,short y,short len,char *p);
void lScanLine2(short x,short y,short len,char *p);
void lpixel(short x, short y, uchar color);
uchar lrpixel(short x, short y);
extern "C" void cdecl LModeXShow(char *vbuf,char *source,short len);
extern "C" void cdecl LVGApageX(short page);
extern "C" void cdecl LMemCpy2X(void *dest,void *source,unsigned long len);
static void lwrite_xline(short x,short y,char *sour,short len);
static void lfill_xline(short x,short y,char color,short len);
////////////////////////////////////////////////////////////////////////////
#define SC_INDEX 0x03c4
#define GC_INDEX 0x03ce
void lFillLine(short x,short y,short len,uchar color)
{ uchar p1, p2; int lptr,loff; short l1, l2;
if (y<0||x+len-1<0) return;
if (x<0) { len+=x; x=0; }
if (x>=DrawLen||y>=DrawWid) return;
if (x+len>DrawLen) len=DrawLen-x;
lptr=DrawLb[y]+x;
if (DrawBuf!=VideoBuf) memset(DrawBuf+lptr,color,len);
else
{ switch (GModeData.GMTYPE)
{ case SVGA_TYPE_256: p1=(lptr>>16); p2=(lptr+len-1)>>16;
LVGApageX(p1); loff=lptr&0xffff;
if (p1==p2) memset(DrawBuf+loff,color,len);
else
{ l1=0x10000-loff; l2=len-l1;
memset(DrawBuf+loff,color,l1);
LVGApageX(p2); memset(DrawBuf,color,l2);
} break;
case SVGA_TYPE_X: lfill_xline(x,y,color,len); break;
}
}
}
void lGetLine(short x,short y,short len,char *p)
{ uchar p1, p2; int loff; short l1, l2, i;
register int lptr;
if (y<0||x+len-1<0) return;
if (x<0) { len+=x; for (i=0;i<-x;i++,p++) *p=0; x=0; }
if (x>=DrawLen||y>=DrawWid) return;
if (x+len>DrawLen) len=DrawLen-x;
lptr=DrawLb[y]+x;
if (DrawBuf!=VideoBuf) memcpy(p,DrawBuf+lptr,len);
else
{ switch (GModeData.GMTYPE)
{ case SVGA_TYPE_256: p1=(lptr>>16); p2=(lptr+len-1)>>16;
LVGApageX(p1); loff=lptr&0xffff;
if (p1==p2) memcpy(p,DrawBuf+loff,len);
else
{ l1=0x10000-loff; l2=len-l1;
memcpy(p,DrawBuf+loff,l1); p+=l1;
LVGApageX(p2); memcpy(p,DrawBuf,l2);
} break;
case SVGA_TYPE_X: outp(GC_INDEX,4);
for (i=0;i<len;i++,p++) {
outp(GC_INDEX+1,(x+i)&3);
*p=VideoBuf[(lptr+i)>>2];
} break;
}
}
}
void lScanLine(short x,short y,short len,char *p)
{ uchar p1, p2; int loff; short l1, l2;
register int lptr;
if (y<0||x+len-1<0||len<=0) return;
if (x<0) { len+=x; p-=x; x=0; }
if (x>=DrawLen||y>=DrawWid) return;
if (x+len>DrawLen) len=DrawLen-x;
lptr=DrawLb[y]+x;
if (DrawBuf!=VideoBuf) memcpy(DrawBuf+lptr,p,len);
else
{ switch (GModeData.GMTYPE)
{ case SVGA_TYPE_256: p1=(lptr>>16); p2=(lptr+len-1)>>16;
LVGApageX(p1); loff=lptr&0xffff;
if (p1==p2) memcpy(DrawBuf+loff,p,len);
else
{ l1=0x10000-loff; l2=len-l1;
memcpy(DrawBuf+loff,p,l1); p+=l1;
LVGApageX(p2); memcpy(DrawBuf,p,l2);
} break;
case SVGA_TYPE_X: lwrite_xline(x,y,p,len); break;
}
}
}
void lScanLine2(short x,short y,short len,char *p)
{ uchar p1, p2; int loff; short l1, l2, i;
register int lptr;
if (y<0||x+len-1<0||len<=0) return;
if (x<0) { len+=x; p-=x; x=0; }
if (x>=DrawLen||y>=DrawWid) return;
if (x+len>DrawLen) len=DrawLen-x;
lptr=DrawLb[y]+x;
if (DrawBuf!=VideoBuf) LMemCpy2X(DrawBuf+lptr,p,len);
else
{ switch (GModeData.GMTYPE)
{ case SVGA_TYPE_256: p1=(lptr>>16); p2=(lptr+len-1)>>16;
LVGApageX(p1); loff=lptr&0xffff;
if (p1==p2) LMemCpy2X(DrawBuf+loff,p,len);
else
{ l1=0x10000-loff; l2=len-l1;
LMemCpy2X(DrawBuf+loff,p,l1); p+=l1;
LVGApageX(p2); LMemCpy2X(DrawBuf,p,l2);
} break;
case SVGA_TYPE_X: outp(SC_INDEX,2);
for (i=0;i<len;i++,p++) if (*p) {
outp(SC_INDEX+1, 1<< ((x+i)&3) );
VideoBuf[(lptr+i)>>2]=*p;
} break;
}
}
}
void lpixel(short x, short y, uchar color)
{ register int lptr;
if (x<0||y<0||x>=DrawLen||y>=DrawWid) return;
if (DrawBuf!=VideoBuf) DrawBuf[DrawLb[y]+x]=color;
else
{ if (x>=DrawLen||y>=DrawWid) return;
lptr=LineBase[y]+x;
switch (GModeData.GMTYPE)
{ case SVGA_TYPE_256: LVGApageX(lptr>>16);
VideoBuf[lptr&0xffff]=color;
break;
case SVGA_TYPE_X : outpw(0x3c4,(0x0100<<(x&3))|2);
VideoBuf[lptr>>2]=color;
break;
}
}
}
uchar lrpixel(short x, short y)
{ register int lptr; uchar color;
if (x<0||y<0||x>=DrawLen||y>=DrawWid) return 0;
if (DrawBuf!=VideoBuf) color=DrawBuf[DrawLb[y]+x];
else
{ if (x>=DrawLen||y>=DrawWid) return 0;
lptr=LineBase[y]+x;
switch (GModeData.GMTYPE)
{ case SVGA_TYPE_256: LVGApageX(lptr>>16);
color=VideoBuf[lptr&0xffff];
break;
case SVGA_TYPE_X : outpw(GC_INDEX,((x&3)<<8)|4);
color=VideoBuf[lptr>>2];
break;
}
}
return color;
}
static void lwrite_xline(short x,short y,char *sour,short len)
{ short i;
char *dest=VideoBuf+y*(GModeData.LEN>>2);
outp(SC_INDEX,2);
while ( (x&3) && (len>0) ) {
outp(SC_INDEX+1,1<<(x&3));
dest[x>>2]=*sour;
x++; sour++; len--;
}
if ( len>=4 ) {
i=len-(len&3);
LModeXShow(dest+(x>>2),sour,i);
x+=i; sour+=i;
} outp(SC_INDEX,2); len&=3;
while ( len>0 ) {
outp(SC_INDEX+1,1<<(x&3));
dest[x>>2]=*sour;
sour++; x++; len--;
}
}
static void lfill_xline(short x,short y,char color,short len)
{ short i,j;
char *dest=VideoBuf+y*(GModeData.LEN>>2);
outp(SC_INDEX,2);
while ( (x&3) && (len>0) ) {
outp(SC_INDEX+1,1<<(x&3));
dest[x>>2]=color;
x++; len--;
}
if ( len>=4 ) {
i=len>>2;
outp(SC_INDEX+1,0x0f);
for (j=0;j<i;j++) dest[(x>>2)+j]=color;
x+=(i<<2);
} outp(SC_INDEX,2); len&=3;
while ( len>0 ) {
outp(SC_INDEX+1,1<<(x&3));
dest[x>>2]=color;
x++; len--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -