I'm working on it.
This is my class:
class spriteObj{
public:
spriteObj();
~spriteObj();
spriteObj* searchSprite(int,int);
BITMAP* img;
int groupNo, imgNo;
int x, y;
PALETTE ownPal;
bool samePal;
bool hasPreviousCopy;
spriteObj* next;
};
And the code is there:
<code>
spriteObj::spriteObj(){
x=y=0;
groupNo=imgNo=0;
img=NULL;
next=NULL;
hasPreviousCopy=false;
}
spriteObj::~spriteObj(){
if(img!=NULL&&!hasPreviousCopy)destroy_bitmap(img);
if(next!=NULL)delete next;
}
spriteObj* spriteObj::searchSprite(int inGroupNo, int inImgNo){
if(groupNo==inGroupNo&&imgNo==inImgNo) return this;
if(next!=NULL)return next->searchSprite(inGroupNo,inImgNo);
return NULL;
}
spriteObj* load_sff(char* directory, const char* filename){
FILE* infile;
char newFilename[256];
strcpy(newFilename,directory);
strcpy(newFilename+strlen(directory),filename);
spriteObj* Head=NULL;
char signature[12];
char ver[4];
int noOfGroup;
int noOfImg;
int offsetOfFirstFile;
int sizeOfSubheader;
char palType;
char blank[3];
char comment[476];
int offsetOfNextSubfile;
int subfileLength;
int xCoord,yCoord;
int unsigned groupNo;
int unsigned imgNo;
int unsigned indexOfPreviousCopy;
bool samePal;
char imgBlank[14];
PALETTE pal;
int xmin,ymin,width,height,bpp,bytes_per_line;
BITMAP *tmpBitMap;
int sizeCount;
bool gotPal=false;
PALETTE previousPal;
_fmode=O_BINARY;
if((infile=fopen(newFilename,"r"))!=NULL){
printf("loadinf file %s...\n",newFilename);
fread(signature,12,1,infile);
fread(ver,4,1,infile);
fread(&noOfGroup,4,1,infile);
fread(&noOfImg,4,1,infile);
fread(&offsetOfFirstFile,4,1,infile);
fread(&sizeOfSubheader,4,1,infile);
fread(&palType,1,1,infile);
fread(blank,3,1,infile);
for(int i=0;i<476;i++)comment<i>=getc(infile);
/*printf("\nsignture: %s\n", signature);
printf("version: %d%d%d%d\n", ver[0], ver[1], ver[2], ver[3]);
printf("no of group: %d\n", noOfGroup);
printf("no of img: %d\n", noOfImg);
printf("offset of first subheader: %d\n", offsetOfFirstFile);
printf("size of subheader: %d\n", sizeOfSubheader);
printf("palette type: %d\n", palType);
printf("blank: %s\n", blank);
printf("comment: %s\n", comment);*/
Head = new spriteObj;
spriteObj* current = Head;
for(int i=0;i<noOfImg;i++){
tmpBitMap=NULL;
xmin=ymin=width=height=bytes_per_line=0;
xCoord=yCoord=groupNo=imgNo=indexOfPreviousCopy=0;
fread(&offsetOfNextSubfile,4,1,infile);
fread(&subfileLength,4,1,infile);
fread(&xCoord,2,1,infile);
if(xCoord&0x00008000)xCoord-=65536;
fread(&yCoord,2,1,infile);
if(yCoord&0x00008000)yCoord-=65536;;
fread(&groupNo,2,1,infile);
fread(&imgNo,2,1,infile);
fread(&indexOfPreviousCopy,2,1,infile);
fread(&samePal,1,1,infile);
fread(blank,13,1,infile);
sizeCount=subfileLength;
if(/*indexOfPreviousCopy==0*/subfileLength!=0){
for(int i=0;i<4;i++)fgetc(infile);
fread(&xmin,2,1,infile);
fread(&ymin,2,1,infile);
fread(&width,2,1,infile);
fread(&height,2,1,infile);
width+=1-xmin;
height+=1-ymin;
for(int i=0;i<53;i++)fgetc(infile);
bpp=fgetc(infile)*8;
fread(&bytes_per_line,2,1,infile);
for(int i=0;i<60;i++)fgetc(infile);
tmpBitMap = create_bitmap_ex(bpp,width-xmin+1,height-ymin+1);
sizeCount-=128;
if(bpp == 8){
for(int liney=0;liney<height;liney++){
int linex=0, linexx=0;
while(linex<bytes_per_line){
char ch=fgetc(infile);
sizeCount--;
int c=0;
if(0xc0 == (0xc0&ch)){
c=(ch&0x3f);
ch=fgetc(infile);
sizeCount--;
}else c=1;
while (c--) {
if (linex < tmpBitMap->w)
tmpBitMap->line[liney][linex] = ch;
linex++;
}
}
}
if(!samePal){
while(sizeCount>0){
fgetc(infile);
sizeCount--;
if(sizeCount==768){
for(int i=0;i<256;i++){
current->ownPal<i>.r=(int)fgetc(infile)/4;
current->ownPal<i>.g=(int)fgetc(infile)/4;
current->ownPal<i>.b=(int)fgetc(infile)/4;
sizeCount-=3;
}
current->ownPal[0].r=63;
current->ownPal[0].g=0;
current->ownPal[0].b=63;
if(!gotPal||palType==0){
previousPal=current->ownPal;
gotPal=true;
}
break;
}
}
}else{
current->ownPal = previousPal;
}
}
}else{
spriteObj* tmpPointer=Head;
for(int i=0;i<indexOfPreviousCopy&&tmpPointer->next!=NULL;i++){
tmpPointer=tmpPointer->next;
}
tmpBitMap = tmpPointer->img;
current->ownPal = tmpPointer->ownPal;
current->hasPreviousCopy = true;
}
if(palType==1)for(;sizeCount>0;sizeCount--)fgetc(infile);
else if(samePal){fgetc(infile);sizeCount--;}
/* printf("\noffset of next subfile: %d\n", offsetOfNextSubfile);
printf("subfile length: %d\n", subfileLength);
printf("axis x coord: %d\n", xCoord);
printf("axis y coord: %d\n", yCoord);
printf("group no.: %d\n", groupNo);
printf("image no.: %d\n", imgNo);
printf("index of previous copy: %d\n", indexOfPreviousCopy);
printf("same palette: %s\n", (samePal)?"true":"false");
printf("xmin: %d\n",xmin);
printf("ymin: %d\n",xmin);
printf("width: %d\n",width);
printf("height: %d\n",height);
printf("bpp: %d\n",bpp);
printf("bytes_per_line: %d\n",bytes_per_line);
printf("byte leave: %d\n", sizeCount);
system("PAUSE"); */
current->x = xCoord;
current->y = yCoord;
current->img = tmpBitMap;
current->groupNo = groupNo;
current->imgNo = imgNo;
current->next = new spriteObj;
current = current->next;
}
fclose(infile);
current = Head;
if(current->next != NULL){
while(current->next->next != NULL)current=current->next;
delete current->next;
current->next = NULL;
}
}else printf("\ncan't open file %s\n",newFilename);
_fmode=O_TEXT;
printf("load finish.\n");
return Head;
}
<code>
This work fine for 8bits pcx since the newest version doesn't support 16bits sprites.