/* ** try to save entry as BitMap .BMP */ static Bool XTRbmpSave(Int16 *pinsrX,Int16 *pinsrY,struct WADDIR *entry, PICTYPE type,const char *DataDir,const char *dir,struct WADINFO *info,IMGTYPE Picture,Bool WSafe, cusage_t *cusage) { Bool res; Int32 start=entry->start; Int32 size =entry->size; char *name=entry->name; char *buffer; char *extens=NULL; if(size<8L) return FALSE; switch(Picture) { case PICGIF: extens="GIF";break; case PICBMP: extens="BMP";break; case PICPPM: extens="PPM";break; case PICTGA: extens="TGA";break; default: Bug("EX47", "Invalid img type %d", (int) Picture); } res = MakeFileName(file,DataDir,dir,"",name,extens); if((WSafe==TRUE)&&(res==TRUE)) { Warning("EX48", "Will not overwrite file %s",file); return TRUE; } buffer=(char *)Malloc(size); WADRseek(info,start); WADRreadBytes(info,buffer,size); res = PICsaveInFile(file,type,buffer,size,pinsrX,pinsrY,Picture, name, cusage); if(res==TRUE)Detail("EX49", "Saved picture as %s", fname (file)); Free(buffer); return res; }
/* ** try to save entry */ static bool XTRbmpSave(int16_t * pinsrX, int16_t * pinsrY, struct WADDIR *entry, PICTYPE type, const char *DataDir, const char *dir, struct WADINFO *info, IMGTYPE Picture, bool WSafe, cusage_t * cusage) { bool res; int32_t start = entry->start; int32_t size = entry->size; char *name = entry->name; char *buffer; char *extens = NULL; if (size < 8L) return false; switch (Picture) { #ifdef HAVE_LIBPNG case PICPNG: extens = "PNG"; break; #endif case PICGIF: extens = "GIF"; break; case PICBMP: extens = "BMP"; break; case PICPPM: extens = "PPM"; break; default: Bug("EX47", "Invalid img type %d", (int) Picture); } res = MakeFileName(file, DataDir, dir, "", name, extens); if (res && WSafe) { Warning("EX48", "Will not overwrite file %s", file); return true; } buffer = (char *) Malloc(size); WADRseek(info, start); WADRreadBytes(info, buffer, size); res = PICsaveInFile(file, type, buffer, size, pinsrX, pinsrY, Picture, name, cusage); if (res) Detail("EX49", "Saved picture as %s", fname(file)); free(buffer); return res; }
void XTRgetEntry(const char *doomwad, const char *DataDir, const char *wadin, const char *entry, IMGTYPE Picture,SNDTYPE Sound,Bool fullSND, char trnR, char trnG, char trnB) { static struct WADINFO pwad; static struct WADINFO iwad; static char Name[8]; Int16 e; char *Entry; Int32 Entrysz; char *Colors=NULL; Int16 insrX,insrY; char *extens=NULL; Bool Found=FALSE; Normalise(Name,entry); iwad.ok=0; WADRopenR(&iwad,doomwad); /*find PLAYPAL*/ e=WADRfindEntry(&iwad,palette_lump); if(e>=0) Colors=WADRreadEntry(&iwad,e,&Entrysz); else ProgError("GE00", "%s: no %s lump in the iwad", fname (iwad.filename), lump_name (palette_lump)); WADRclose(&iwad); pwad.ok=0; WADRopenR(&pwad,wadin); e=WADRfindEntry(&pwad,palette_lump); if(e>=0) { Free(Colors); Colors=WADRreadEntry(&pwad,e,&Entrysz); } COLinit(trnR,trnG,trnB,Colors,(Int16)Entrysz, pwad.filename, palette_lump); Free(Colors); e=WADRfindEntry(&pwad,Name); if(e<0) ProgError("GE01", "%s: %s: lump not found", fname (pwad.filename), lump_name (entry)); Phase("GE02", "%s: %s: extracting", fname (wadin), lump_name (entry)); Entry=WADRreadEntry(&pwad,e,&Entrysz); /*try graphic*/ if(Found!=TRUE) if(Entrysz>8) { switch(Picture) { case PICGIF: extens="GIF";break; case PICBMP: extens="BMP";break; case PICPPM: extens="PPM";break; case PICTGA: extens="TGA";break; default: Bug("GE03", "Invalid img type %d", (int) Picture); } MakeFileName(file,DataDir,"","",Name,extens); if(PICsaveInFile(file,PGRAPH,Entry,Entrysz,&insrX,&insrY,Picture, Name, NULL) ==TRUE) { Info("GE04", "Picture insertion point is (%d,%d)",insrX,insrY); Found=TRUE; } /* FIXME try wall as well ? */ else if((Entrysz==0x1000)||(Entrysz==0x1040)) { if(PICsaveInFile(file,PFLAT,Entry,Entrysz,&insrX,&insrY,Picture, Name, NULL) ==TRUE) { Found=TRUE; } } else if(Entrysz==64000L) { if(PICsaveInFile(file,PLUMP,Entry,Entrysz,&insrX,&insrY,Picture, Name, NULL) ==TRUE) { Found=TRUE; } } } if (Found!=TRUE) if (peek_i16_le (Entry) == 3) if (Entrysz >= 8 + peek_i32_le (Entry + 4)) { /*save as sound*/ switch(Sound) { case SNDAU: extens="AU";break; case SNDWAV: extens="WAV";break; case SNDVOC: extens="VOC";break; default: Bug("GE05", "Invalid snd type %d", (int) Sound); } MakeFileName(file,DataDir,"","",Name,extens); SNDsaveSound(file,Entry,Entrysz,Sound,fullSND, Name); Found=TRUE; } if(Found!=TRUE) { /*save as lump*/ MakeFileName(file,DataDir,"","",Name,"LMP"); WADRsaveEntry(&pwad,e,file); } Free(Entry); WADRclose(&pwad); }