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

📄 lsys3.cpp

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