📄 lsys2.cpp
字号:
/***************************************************************************
* For MemBufs Blitting *
***************************************************************************/
#include <lsys.h>
#include <mem.h>
#include <conio.h>
void lClearSurface(LSURFACE *SFACE,char color);
char lBlitFast(LSURFACE *tsface,short tx,short ty,short sx1,short sy1,
short sx2,short sy2,LSURFACE *ssface,short blit_mode);
char lOutToScr(LSURFACE *sface,short tx,short ty,short sx1,short sy1,
short sx2,short sy2);
////////////////////////////////////////////////////////////////////////////
#define SC_INDEX 0x03c4
extern "C" void cdecl LBlit1X(char *source,char *dest,int ds,int dd,short len,short wid);
extern "C" void cdecl LBlit2X(char *source,char *dest,int ds,int dd,short len,short wid);
extern "C" void cdecl LModeXShow(char *vbuf,char *source,short len);
extern "C" void cdecl LVGApageX(short page);
short lsys_modex_view_step=2;
void lClearSurface(LSURFACE *SFACE,char color)
{ long count=SFACE->len;
count*=SFACE->wid;
memset(SFACE->memory,color,count);
}
char lBlitFast(LSURFACE *tsface,short tx,short ty,short sx1,short sy1,
short sx2,short sy2,LSURFACE *ssface,short blit_mode)
{ short wlen, wwid, d_d, d_s;
int *index1=(ssface->index),*index2=(tsface->index),i;
char *sour,*dest;
if (ssface->mode==NULL||tsface->mode==NULL) return 0;
if (ssface->mode==LSM_SCREEN||tsface->mode==LSM_SCREEN) return 0;
if (sx1>sx2) { i=sx1; sx1=sx2; sx2=i; }
if (sy1>sy2) { i=sy1; sy1=sy2; sy2=i; }
if (sx2<0||sy2<0) return 0;
if (sx1<0) { tx-=sx1; sx1=0; } if (sy1<0) { ty-=sy1; sy1=0; }
if (tx+sx2-sx1>tsface->len-1) sx2=sx1+(tsface->len-tx)-1;
if (ty+sy2-sy1>tsface->wid-1) sy2=sy1+(tsface->wid-ty)-1;
if (tx<0) { sx1-=tx; tx=0; } if (ty<0) { sy1-=ty; ty=0; }
if (sx2>=ssface->len) sx2=ssface->len-1;
if (sy2>=ssface->wid) sy2=ssface->wid-1;
if (sx1>=ssface->len||sy1>=ssface->wid||sx1>sx2||sy1>sy2||
tx>=tsface->len||ty>=tsface->wid) return 0;
if (ssface->index) sour=ssface->memory+index1[sy1]+sx1;
else sour=ssface->memory+(ssface->len)*sy1+sx1;
if (tsface->index) dest=tsface->memory+index2[ty]+tx;
else dest=tsface->memory+(tsface->len)*ty+tx;
wlen=sx2-sx1+1; wwid=sy2-sy1+1;
d_d=tsface->len-wlen; d_s=ssface->len-wlen;
if (blit_mode==0) LBlit1X(sour,dest,d_s,d_d,wlen,wwid);
else LBlit2X(sour,dest,d_s,d_d,wlen,wwid);
return 1;
}
char lOutToScr(LSURFACE *ssface,short tx,short ty,short sx1,short sy1,
short sx2,short sy2)
{ short wlen, wwid, tlen=GModeData.LEN, twid=GModeData.WID, xstep, k;
int *index1=ssface->index,*index2=LineBase,i,j,size;
char *sour,*dest,p1,p2,*x_sour;
long lptr, loff, l1;
if (ssface->mode==NULL) return 0;
if (sx1>sx2) { i=sx1; sx1=sx2; sx2=i; }
if (sy1>sy2) { i=sy1; sy1=sy2; sy2=i; }
if (sx2<0||sy2<0) return 0;
if (sx1<0) { tx-=sx1; sx1=0; } if (sy1<0) { ty-=sy1; sy1=0; }
if (tx+sx2-sx1>tlen-1) sx2=sx1+(tlen-tx)-1;
if (ty+sy2-sy1>twid-1) sy2=sy1+(twid-ty)-1;
if (tx<0) { sx1-=tx; tx=0; } if (ty<0) { sy1-=ty; ty=0; }
if (sx2>=ssface->len) sx2=ssface->len-1;
if (sy2>=ssface->wid) sy2=ssface->wid-1;
if (sx1>=ssface->len||sy1>=ssface->wid||sx1>sx2||sy1>sy2||
tx>=tlen||ty>=twid) return 0;
if (index1) sour=ssface->memory+index1[sy1]+sx1;
else sour=ssface->memory+(ssface->len)*sy1+sx1;
if (index2) dest=VideoBuf+index2[ty]+tx;
else dest=VideoBuf+(tlen)*ty+tx;
wlen=sx2-sx1+1; wwid=sy2-sy1+1; size=(long)tlen*twid;
switch (GModeData.GMTYPE)
{ case SVGA_TYPE_256:
if (size<0x10000) {
if (tx==0&&wlen==tlen&&ssface->len==tlen) memcpy(dest,sour,(int)wlen*wwid);
else for (j=0;j<wwid;j++,dest+=tlen,sour+=ssface->len) memcpy(dest,sour,wlen);
} else
{ lptr=dest-VideoBuf;
for (j=0;j<wwid;j++,sour+=ssface->len,lptr+=tlen) {
p1=(lptr>>16); p2=(lptr+wlen-1)>>16;
LVGApageX(p1); loff=lptr&0xffff;
if (p1==p2) memcpy(VideoBuf+loff,sour,wlen);
else
{ l1=0x10000-loff; memcpy(VideoBuf+loff,sour,l1);
LVGApageX(p2); memcpy(VideoBuf,sour+l1,wlen-l1);
}
}
}
break;
case SVGA_TYPE_X :
if (ssface->len==wlen && tx==0 &&wlen==tlen)
{ xstep = lsys_modex_view_step;
dest=VideoBuf+((ty*tlen+tx)>>2);
for (j=0;j<wwid-xstep;j+=xstep,sour+=(ssface->len*xstep),
dest+=( (tlen>>2)*xstep ) )
LModeXShow(dest,sour,wlen*xstep);
for (;j<wwid;j++,sour+=ssface->len,dest+=(tlen>>2))
LModeXShow(dest,sour,wlen);
} else
{ dest=VideoBuf+ty*(tlen>>2);
for (j=0;j<wwid;j++,sour+=ssface->len,dest+=(tlen>>2))
{ outp(SC_INDEX,2); k=tx; x_sour=sour; l1=wlen;
while ( (k&3) && (l1>0) ) {
outp(SC_INDEX+1,1<<(k&3));
dest[k>>2]=*x_sour;
k++; x_sour++; l1--;
}
if ( l1>=4 ) {
i=l1-(l1&3);
LModeXShow(dest+(k>>2),x_sour,i);
k+=i; x_sour+=i;
} outp(SC_INDEX,2); l1&=3;
while ( l1>0 ) {
outp(SC_INDEX+1,1<<(k&3));
dest[k>>2]=*x_sour;
x_sour++; k++; l1--;
}
}
}
break;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -