⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lsys2.cpp

📁 ldraw_DOS游戏开发包
💻 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 + -