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

📄 ldrawger.cpp

📁 ldraw_DOS游戏开发包
💻 CPP
字号:
#include <ldraw.h>
#include <mem.h>
#include <stdio.h>
#include <stdlib.h>

short lLoadLpcImage(TLpcImage *lpc,char *fname,long offset);
void  lDestroyLpc(TLpcImage *lpc);
char *lGetLpcImage(TLpcImage *lpc,short page,short index);
char *lLoadLpcUnit(short index,char *fname,long offset);
///////////////////////////////////////////////////////////////////////
short lLoadLpcImage(TLpcImage *lpc,char *fname,long offset)
{ FILE *f; 
  short len,wid,i,p,mem=1;
  char flag_str[4],data[4];
  long Size,Addr;

  if ((f=fopen(fname,"rb"))==NULL) return LERR_NOTFIND;

  fseek(f,offset,SEEK_SET);
  fread(flag_str,1,4,f);
  if (memcmp(flag_str,"LPIC",4)) { 
     fclose(f);
     return LERR_FILEERR;
  }

  fseek(f,10+offset,SEEK_SET); 
  fread(&(lpc->count),2,1,f);
  fseek(f,12+(long)lpc->count*4+256*3+offset,SEEK_SET); 
  fread(&(lpc->pageCount),2,1,f);
 
  lpc->pal=new RGB[256];
  lpc->pageList=new short[lpc->pageCount];
  lpc->LpcImage=new char*[lpc->count];
  
  if ( (!lpc->LpcImage) || (!lpc->pal) || (!lpc->pageList) ) 
  {  if (lpc->LpcImage) delete lpc->LpcImage;
     if (lpc->pal)      delete lpc->pal;
     if (lpc->pageList) delete lpc->pageList;
     fclose(f);
     return LERR_NOMEM;
  }
  fseek(f,12+(long)lpc->count*4+offset,SEEK_SET);
  fread(lpc->pal,1,256*3,f); fgetc(f); fgetc(f);
  fread(lpc->pageList,1,(lpc->pageCount)*2,f);
  for (i=0;i<lpc->count;i++) lpc->LpcImage[i]=NULL;
  for (i=0,p=12;i<lpc->count;i++,p+=4) 
   { fseek(f,p+offset,SEEK_SET); fread(&Addr,4,1,f);
     fseek(f,Addr+offset,SEEK_SET); fread(data,4,1,f);
     lgetSize(&len,&wid,data); 
     Size=len; Size=Size*wid+8; 
     lpc->LpcImage[i]=new char[Size];
     if (!lpc->LpcImage[i]) mem=0;
     if (mem) {
        memcpy(lpc->LpcImage[i],data,4);
        fread(lpc->LpcImage[i]+4,1,Size-4,f);
     }
   }
  fclose(f);
  if (!mem) {
    return LERR_NOMEM;
  }
  return LERR_NONE;
}
void  lDestroyLpc(TLpcImage *lpc)
{ short i;
  if (!lpc) return;
  if (lpc->pal)       delete lpc->pal;
  if (lpc->pageList)  delete lpc->pageList;
  if (lpc->LpcImage) {
     for (i=0;i<lpc->count;i++) 
       if (lpc->LpcImage[i]) delete lpc->LpcImage[i];
     delete lpc->LpcImage;
  }
  lpc->pal=NULL; lpc->pageList=NULL; lpc->LpcImage=NULL;
  lpc->count=0;  lpc->pageCount=0;
}
char *lGetLpcImage(TLpcImage *lpc,short page,short index)
{ short id;
  if (!lpc) return NULL;
  if ((lpc->count)<=0||page>=(lpc->pageCount)) return NULL;
  id=lpc->pageList[page]+index;
  if (id>=(lpc->count)) return NULL;
  if (page==0) return lpc->LpcImage[id];
  if (page<(lpc->pageCount-1)&&id>=lpc->pageList[page+1]) return NULL;
  return lpc->LpcImage[id];
}
short lGetLpcIndex(TLpcImage *lpc,short page,short index)
{ short id;
  if (!lpc) return -1;
  if ((lpc->count)<=0||page>=(lpc->pageCount)) return -1;
  id=lpc->pageList[page]+index;
  if (id>=(lpc->count)) return -1;
  if (page==0) return id;
  if (page<(lpc->pageCount-1)&&id>=lpc->pageList[page+1]) return -1;
  return id;
}
char *lLoadLpcUnit(short index,char *fname,long offset)
{ FILE *f; short Len,Wid,Max; long Size=0,Addr;
  char *img;
 
  if ((f=fopen(fname,"rb"))==NULL) { img=NULL; return 0; }
  fseek(f,10+offset,SEEK_SET); fread(&Max,2,1,f);
  if (index>=Max) { fclose(f); img=NULL; return 0; }
  fseek(f,12+(index<<2)+offset,SEEK_SET); fread(&Addr,4,1,f);
  fseek(f,Addr+offset,SEEK_SET); fread(&Len,2,1,f); fread(&Wid,2,1,f);
  Size=Len; Size=Size*Wid+8; img=new char[Size];
  if (!img) { fclose(f); return 0; }
  fseek(f,Addr+offset,SEEK_SET); fread(img,Size,1,f); fclose(f);
  return img;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -