📄 ldrawger.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 + -