#include #include #include "string.hpp" #ifndef DB_LEVEL #define DB_LEVEL 4 #endif #include "db.h" #include "awTexLd.h" #include "chnkload.hpp" #include "chunkpal.hpp" #ifndef CL_SUPPORT_FASTFILE #error "Please #define CL_SUPPORT_FASTFILE to 0 or 1 in projload.hpp" #endif #if CL_SUPPORT_FASTFILE #include "ffstdio.h" #endif #ifndef CL_SUPPORT_ALTTAB #error "Please #define CL_SUPPORT_ALTTAB to 0 or 1 in projload.hpp" #endif #if CL_SUPPORT_ALTTAB #include "alt_tab.h" #endif #include "chnktexi.h" #if !defined(NDEBUG) && defined(_CPPRTTI) #include #else #define dynamic_cast static_cast #endif char const * cl_pszGameMode = NULL; // used to determine if the display is palettized // currently assuming that if this is <= 8 then all // surfaces et. except d3d textures have a global palette extern "C" extern int VideoModeColourDepth; // useful filename handling functions // returns pointer into string pointing to filename without dirname template // C can be char or char const static C * StripPath(C * n) { C * rm = strrchr(n,':'); if (rm) n = rm+1; rm = strrchr(n,'/'); if (rm) n = rm+1; rm = strrchr(n,'\\'); if (rm) n = rm+1; return n; } // removes any .extension from filename by inserting null character static void StripFileExtension(char * n) { char * dotpos = strrchr(n,'.'); if (dotpos) *dotpos = 0; } static char * StripFileExtension(char const * n) { char * nn = new char[strlen(n)+1]; strcpy(nn,n); StripFileExtension(nn); return nn; } // get the directory associated with the riff - free with delete[] static char * RiffBasename(Chunk_With_Children * pEnvDataChunk) { Chunk * pChunk = pEnvDataChunk->lookup_single_child("RIFFNAME"); if (pChunk) { RIF_Name_Chunk * pRifNameChunk = dynamic_cast(pChunk); const char * pszRifName = StripPath(pRifNameChunk->rif_name); char * pszBaseName = new char[strlen(pszRifName)+1]; strcpy(pszBaseName,pszRifName); StripFileExtension(pszBaseName); return pszBaseName; } const char * pszDefault = "empty"; char * pszBaseName = new char [strlen(pszDefault)+1]; strcpy(pszBaseName,pszDefault); return pszBaseName; } #if CL_SUPPORT_FASTFILE static inline bool IsFileInFastFile(char const * pszFileName) { unsigned nLen; return ffreadbuf(pszFileName,&nLen) ? true : false; } #endif static bool DoesFileExist(char const * pszFileName) { DWORD dwFileAttributes = GetFileAttributes(pszFileName); if (0xffffffff == dwFileAttributes || dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) return false; else return true; } static char * GetPath(char * pszFileNameBuf, unsigned nBufSize, ImageDescriptor const & idsc, Chunk_With_Children * pEnvDataChunk, bool bGloballyPalettized) { // set the name char const * pszRawName = StripPath(idsc.filename); char * pszName = new char[strlen(pszRawName)+1]; strcpy(pszName,pszRawName); StripFileExtension(pszName); // load this image char const * pg0ext = ".PG0"; if (!bGloballyPalettized) { char const * dir2 = idsc.flags & IDSCF_SPRITE ? "Sprites\\" : idsc.flags & IDSCF_SUBSHAPE ? SubShps_Directory : ""; char * riffname = RiffBasename(pEnvDataChunk); char const * dir3 = idsc.flags & IDSCF_INCLUDED ? idsc.rifname : riffname; if (nBufSize < strlen(GenTex_Directory)+strlen(dir2)+strlen(dir3)+1+strlen(pszName)+5) { db_log1("CL_LoadImageOnce(): ERROR: buffer not big enough for filename"); pszFileNameBuf = NULL; } else { strcpy(pszFileNameBuf,GenTex_Directory); strcat(pszFileNameBuf,dir2); strcat(pszFileNameBuf,dir3); strcat(pszFileNameBuf,"\\"); strcat(pszFileNameBuf,pszName); strcat(pszFileNameBuf,".BM0"); } delete[] riffname; } else { if (idsc.flags & IDSCF_FIXEDPALETTE) { char const * dir2 = idsc.fixrifname ? *idsc.fixrifname ? idsc.fixrifname : 0 : 0; char const * dir3 = idsc.flags & IDSCF_SPRITE ? "Sprites\\" : ""; char * riffname = RiffBasename(pEnvDataChunk); char const * dir4 = idsc.flags & IDSCF_INCLUDED ? idsc.rifname : riffname; if (nBufSize < strlen(FixTex_Directory)+(dir2 ? strlen(dir2)+1 : 0)+strlen(dir3)+strlen(dir4)+1+strlen(pszName)+5) { db_log1("CL_LoadImageOnce(): ERROR: buffer not big enough for filename"); pszFileNameBuf = NULL; } else { strcpy(pszFileNameBuf,FixTex_Directory); if (dir2) { strcat(pszFileNameBuf,dir2); strcat(pszFileNameBuf,"\\"); } strcat(pszFileNameBuf,dir3); strcat(pszFileNameBuf,dir4); strcat(pszFileNameBuf,"\\"); strcat(pszFileNameBuf,pszName); strcat(pszFileNameBuf,pg0ext); } delete[] riffname; } else { char const * dir1 = cl_pszGameMode ? GameTex_Directory : ToolsTex_Directory; char * dir2 = RiffBasename(pEnvDataChunk); char const * dir4 = idsc.flags & IDSCF_SPRITE ? "Sprites\\" : ""; char const * dir5 = idsc.flags & IDSCF_INCLUDED ? idsc.rifname : 0; if (nBufSize < strlen(dir1)+strlen(dir2)+1+(cl_pszGameMode ? strlen(cl_pszGameMode)+1 : 0)+strlen(dir4)+(dir5 ? strlen(dir5)+1 : 0)+strlen(pszName)+5) { db_log1("CL_LoadImageOnce(): ERROR: buffer not big enough for filename"); pszFileNameBuf = NULL; } else { strcpy(pszFileNameBuf,dir1); strcat(pszFileNameBuf,dir2); strcat(pszFileNameBuf,"\\"); if (cl_pszGameMode) { strcat(pszFileNameBuf,cl_pszGameMode); strcat(pszFileNameBuf,"\\"); } strcat(pszFileNameBuf,dir4); if (dir5) { strcat(pszFileNameBuf,dir5); strcat(pszFileNameBuf,"\\"); } strcat(pszFileNameBuf,pszName); strcat(pszFileNameBuf,pg0ext); } delete[] dir2; } } if (pszFileNameBuf) db_logf4(("\tfile expected to be '%s'",pszFileNameBuf)); delete[] pszName; return pszFileNameBuf; } char * CL_GetImageFileName(char * pszDestBuf, unsigned nBufSize, char const * pszFileName, unsigned fFlagsEtc) { db_assert1(pszFileName); db_assert1(pszDestBuf); db_assert1(nBufSize>0); db_logf4(("CL_LoadImageOnce(): Getting the full pathname for %s",pszFileName)); switch (fFlagsEtc & _LIO_PATHTYPEMASK) { case LIO_ABSOLUTEPATH: db_log4("\t(which is an absolute path)"); if (strlen(pszFileName)", SecondTex_Directory ? SecondTex_Directory : "")); #define _GET_RELATIVE_PATH(pszDirectory,fnDoesExist) \ if (pszDirectory) { \ String str = pszDirectory; \ if (str.length()) { \ int chLast = str.get_at(str.length()-1); \ if (chLast != '\\' && chLast != '/') \ str += '\\'; \ str += pszFileName; \ if (fnDoesExist(str)) { \ if (str.length() < nBufSize) { \ strcpy(pszDestBuf,str); \ return pszDestBuf; \ } else { \ db_log1("CL_LoadImageOnce(): ERROR: buffer not large enough to hold filename"); \ return NULL; /* fail because the buffer isnt big enough */ \ } } } } #if CL_SUPPORT_FASTFILE _GET_RELATIVE_PATH(FirstTex_Directory,IsFileInFastFile) _GET_RELATIVE_PATH(SecondTex_Directory,IsFileInFastFile) #endif #if !defined(CL_SUPPORTONLY_FASTFILE) || !CL_SUPPORTONLY_FASTFILE _GET_RELATIVE_PATH(FirstTex_Directory,DoesFileExist) _GET_RELATIVE_PATH(SecondTex_Directory,DoesFileExist) #endif db_log1("CL_LoadImageOnce(): ERROR: file not found in relative path"); return NULL; case LIO_RIFFPATH: { int enum_id = -1; // may be supported at a later date, valid when pszFileName is NULL bool bGloballyPalettized = VideoModeColourDepth <= 8 && (fFlagsEtc & _LIO_SURFTYPEMASK) != LIO_D3DTEXTURE; db_log4("\t(whose path is determined by the current .RIF file)"); if (!Env_Chunk) { db_log1("CL_LoadImageOnce(): ERROR: no RIF file"); return NULL; } Chunk * pChunk = Env_Chunk->lookup_single_child("REBENVDT"); if (!pChunk) { db_log1("CL_LoadImageOnce(): ERROR: no environment data chunk"); return NULL; } Chunk_With_Children * pEnvDataChunk = dynamic_cast(pChunk); db_assert1(pEnvDataChunk); Environment_Game_Mode_Chunk * pGameModeChunk = NULL; if (cl_pszGameMode) { if (*cl_pszGameMode) { List listGmChunks; pEnvDataChunk->lookup_child("GAMEMODE",listGmChunks); for (LIF itGmChunks(&listGmChunks); !itGmChunks.done(); itGmChunks.next()) { Environment_Game_Mode_Chunk * pGmChunk = dynamic_cast(itGmChunks()); db_assert1(pGmChunk); if (pGmChunk->id_equals(cl_pszGameMode)) { pGameModeChunk = pGmChunk; break; } } if (!pGameModeChunk) db_logf3(("CL_LoadImageOnce(): WARNING: Game Mode '%s' not found",cl_pszGameMode)); } } char * pszName = StripFileExtension(StripPath(pszFileName)); char * pszSubName = 0; if (pszFileName) { if (strchr(pszFileName,'\\')) { pszSubName = new char[strlen(pszFileName)+1]; strcpy(pszSubName,pszFileName); *strchr(pszSubName,'\\')=0; } else if (strchr(pszFileName,'/')) { pszSubName = new char[strlen(pszFileName)+1]; strcpy(pszSubName,pszFileName); *strchr(pszSubName,'/')=0; } } if (pGameModeChunk) { bool bShapeInGm = pszSubName ? false : true; // Get the matching image 'Processor' chunk Chunk * pMiChunk = pGameModeChunk->lookup_single_child("MATCHIMG"); Matching_Images_Chunk * pMatchImageChunk = NULL; if (pMiChunk) { pMatchImageChunk = dynamic_cast(pMiChunk); db_assert1(pMatchImageChunk); } List listRifChildChunks; pGameModeChunk->lookup_child("RIFCHILD",listRifChildChunks); for (LIF itRifChildChunks(&listRifChildChunks); !itRifChildChunks.done(); itRifChildChunks.next()) { RIF_Child_Chunk * pRifChildChunk = dynamic_cast(itRifChildChunks()); db_assert1(pRifChildChunk); if (pszSubName) { if (_stricmp(pszSubName,pRifChildChunk->rifname) && (*pszSubName || *pRifChildChunk->filename)) continue; bShapeInGm = true; } for (LIF itBmpFlags(&pRifChildChunk->bmps); !itBmpFlags.done(); itBmpFlags.next()) { BMP_Flags bmpfTemp(itBmpFlags()); StripFileExtension(bmpfTemp.filename); if (pszFileName ? !_stricmp(pszName,StripPath(bmpfTemp.filename)) : enum_id == bmpfTemp.enum_id) { // select image descriptor ImageDescriptor const idsc ( *pRifChildChunk->filename ? (IDscFlags)((bmpfTemp.flags & ChunkBMPFlag_FixedPalette ? IDSCF_FIXEDPALETTE : IDSCF_0) |IDSCF_INCLUDED) : IDSCF_0, itBmpFlags().filename, *pRifChildChunk->filename ? pRifChildChunk->rifname : 0 ); ImageDescriptor const * pIdsc = &idsc; if (pMatchImageChunk) pIdsc = &pMatchImageChunk->GetLoadImage(idsc); else db_logf3(("CL_LoadImageOnce(): WARNING! no rule to find matching images in game mode '%s'\n",pGameModeChunk->header->mode_identifier)); // load this image if (GetPath(pszDestBuf,nBufSize,*pIdsc,pEnvDataChunk,bGloballyPalettized)) { if (pszSubName) { delete[] pszSubName; } delete[] pszName; return pszDestBuf; } } } } List listExtShapes; pGameModeChunk->lookup_child("SHBMPNAM",listExtShapes); for (LIF itExtShapes(&listExtShapes); !itExtShapes.done(); itExtShapes.next()) { External_Shape_BMPs_Store_Chunk * pShapeBmpsChunk = dynamic_cast(itExtShapes()); db_assert1(pShapeBmpsChunk); if (pszSubName) if (_stricmp(pszSubName,pShapeBmpsChunk->shapename) && *pszSubName) continue; for (LIF itBmpNames(&pShapeBmpsChunk->bmps); !itBmpNames.done(); itBmpNames.next()) { BMP_Name bmpnTemp(itBmpNames()); StripFileExtension(bmpnTemp.filename); if (pszFileName ? !_stricmp(pszName,StripPath(bmpnTemp.filename)) : enum_id == bmpnTemp.enum_id) { // select image descriptor ImageDescriptor const idsc ( (IDscFlags)((bmpnTemp.flags & ChunkBMPFlag_FixedPalette ? IDSCF_FIXEDPALETTE : IDSCF_0) |(pShapeBmpsChunk->GetExtendedData()->flags & GBF_SPRITE ? IDSCF_SPRITE : IDSCF_SUBSHAPE) |IDSCF_INCLUDED), itBmpNames().filename, pShapeBmpsChunk->shapename, bmpnTemp.flags & ChunkBMPFlag_FixedPalette ? pShapeBmpsChunk->rifname : 0 ); ImageDescriptor const * pIdsc = &idsc; if (pMatchImageChunk) pIdsc = &pMatchImageChunk->GetLoadImage(idsc); else db_logf3(("WARNING! no rule to find matching images in game mode %s\n",pGameModeChunk->header->mode_identifier)); // load this image if (GetPath(pszDestBuf,nBufSize,*pIdsc,pEnvDataChunk,bGloballyPalettized)) { if (pszSubName) { delete[] pszSubName; } delete[] pszName; return pszDestBuf; } } } } if (pszSubName) { if (!bShapeInGm) db_logf3(("CL_LoadImageOnce(): WARNING! shape/sprite %s not found in this RIF file\n",pszSubName)); else db_logf3(("CL_LoadImageOnce(): WARNING! shape/sprite %s does not appear to list %s\n",pszSubName,pszName)); } } List listMatchImageChunk; pEnvDataChunk->lookup_child("MATCHIMG",listMatchImageChunk); Matching_Images_Chunk * pMicFix = NULL; Matching_Images_Chunk * pMicNorm = NULL; for (LIF itMatchImageChunk(&listMatchImageChunk); !itMatchImageChunk.done(); itMatchImageChunk.next()) { Matching_Images_Chunk * pMatchImageChunk = dynamic_cast(itMatchImageChunk()); db_assert1(pMatchImageChunk); if (pMatchImageChunk->flags & MICF_FIXEDPALETTE) pMicFix = pMatchImageChunk; else pMicNorm = pMatchImageChunk; } List listShapesSprites; List listShapes; Env_Chunk->lookup_child("REBSHAPE",listShapes); for (LIF itShapes(&listShapes); !itShapes.done(); itShapes.next()) { Shape_Chunk * pShapeChunk = dynamic_cast(itShapes()); db_assert1(pShapeChunk); Chunk * pSxfnChunk = pShapeChunk->lookup_single_child("SHPEXTFL"); if (pSxfnChunk) { Shape_External_File_Chunk * pShpExtFnameChunk = dynamic_cast(pSxfnChunk); db_assert1(pShpExtFnameChunk); listShapesSprites.add_entry(pShpExtFnameChunk); } } Chunk * pSprChunk = Env_Chunk->lookup_single_child("RSPRITES"); if (pSprChunk) { Chunk_With_Children * pSpritesChunk = dynamic_cast(pSprChunk); db_assert1(pSpritesChunk); List listSprHeadChunks; pSpritesChunk->lookup_child("SPRIHEAD",listSprHeadChunks); for (LIF itSprites(&listSprHeadChunks); !itSprites.done(); itSprites.next()) { Chunk_With_Children * pSpriteHead = dynamic_cast(itSprites()); db_assert1(pSpriteHead); listShapesSprites.add_entry(pSpriteHead); } } int bShapeFound = pszSubName ? false : true; for (LIF itShapesSprites(&listShapesSprites); !itShapesSprites.done(); itShapesSprites.next()) { char * pszSubRifName = RiffBasename(itShapesSprites()); if (pszSubName) { if (_stricmp(pszSubRifName,pszSubName)) // must match shapes name exactly { delete[] pszSubRifName; continue; } bShapeFound = true; } Chunk * pBmpLstStChunk = itShapesSprites()->lookup_single_child("BMPLSTST"); if (pBmpLstStChunk) { Bitmap_List_Store_Chunk * pBmpListStoreChunk = dynamic_cast(pBmpLstStChunk); db_assert1(pBmpListStoreChunk); for (LIF itBmpName(&pBmpListStoreChunk->bmps); !itBmpName.done(); itBmpName.next()) { BMP_Name bmpnTemp(itBmpName()); StripFileExtension(bmpnTemp.filename); if (pszFileName ? !_stricmp(pszName,StripPath(bmpnTemp.filename)) : enum_id == bmpnTemp.enum_id) { // select image descriptor char * pszRifName = RiffBasename(pEnvDataChunk); ImageDescriptor const idsc ( (IDscFlags)((bmpnTemp.flags & ChunkBMPFlag_FixedPalette ? IDSCF_FIXEDPALETTE : IDSCF_0) |(pBmpListStoreChunk->GetExtendedData()->flags & GBF_SPRITE ? IDSCF_SPRITE : IDSCF_SUBSHAPE) |IDSCF_INCLUDED), itBmpName().filename, pszSubRifName, bmpnTemp.flags & ChunkBMPFlag_FixedPalette ? pszRifName : 0 ); ImageDescriptor const * pIdsc = &idsc; delete[] pszRifName; if (bmpnTemp.flags & ChunkBMPFlag_FixedPalette) { if (pMicFix) pIdsc = &pMicFix->GetLoadImage(idsc); else db_log3("CL_LoadImageOnce(): WARNING! no rule to find fixed palette matching images in environment data\n"); } else { if (pMicNorm) pIdsc = &pMicNorm->GetLoadImage(idsc); else db_log3("CL_LoadImageOnce(): WARNING! no rule to find matching images in environment data (interface engine?)\n"); } // load this image if (GetPath(pszDestBuf,nBufSize,*pIdsc,pEnvDataChunk,bGloballyPalettized)) { delete[] pszSubRifName; if (pszSubName) { delete[] pszSubName; } delete[] pszName; return pszDestBuf; } } } } delete[] pszSubRifName; } if (pszSubName) { if (!bShapeFound) db_logf3(("CL_LoadImageOnce(): WARNING! shape/sprite %s not found in this RIF file\n",pszSubName)); else db_logf3(("CL_LoadImageOnce(): WARNING! shape/sprite %s does not appear to list %s\n",pszSubName,pszName)); delete[] pszSubName; } // not found in game textures, so look in default else // but only if there is no virtual shape directory { Chunk * pBmpNames = pEnvDataChunk->lookup_single_child("BMPNAMES"); if (pBmpNames) { Global_BMP_Name_Chunk * pGbnc = dynamic_cast(pBmpNames); db_assert1(pGbnc); for (LIF itBmpName(&pGbnc->bmps); !itBmpName.done(); itBmpName.next()) { BMP_Name bmpnTemp(itBmpName()); StripFileExtension(bmpnTemp.filename); if (pszFileName ? !_stricmp(pszName,StripPath(bmpnTemp.filename)) : enum_id == bmpnTemp.enum_id) { // select image descriptor ImageDescriptor const idsc (bmpnTemp.flags & ChunkBMPFlag_FixedPalette ? IDSCF_FIXEDPALETTE : IDSCF_0, itBmpName().filename); ImageDescriptor const * pIdsc = &idsc; if (bmpnTemp.flags & ChunkBMPFlag_FixedPalette) { if (pMicFix) pIdsc = &pMicFix->GetLoadImage(idsc); else db_log3("CL_LoadImageOnce(): WARNING! no rule to find fixed palette matching images in environment data\n"); } else { if (pMicNorm) pIdsc = &pMicNorm->GetLoadImage(idsc); else db_log3("CL_LoadImageOnce(): WARNING! no rule to find matching images in environment data (interface engine?)\n"); } // load this image if (GetPath(pszDestBuf,nBufSize,*pIdsc,pEnvDataChunk,bGloballyPalettized)) { delete[] pszName; return pszDestBuf; } } } } } delete[] pszName; return NULL; } default: // invalid arguments db_log1("CL_LoadImageOnce(): ERROR: invalid parameter passed to CL_GetImageFileName()"); return NULL; } } extern "C" extern void CheckForWindowsMessages(void); int CL_LoadImageOnce(char const * pszFileName, unsigned fFlagsEtc) { // safe to handle windows messages at this point (I think - JCWH) CheckForWindowsMessages(); // get the filename char szBuf[MAX_PATH]; if (!CL_GetImageFileName(szBuf,sizeof szBuf/sizeof szBuf[0],pszFileName,fFlagsEtc)) { db_log1("CL_LoadImageOnce(): ERROR: unable to determine path of file"); return GEI_NOTLOADED; } db_logf4(("\tLoading '%s'",szBuf)); // already loaded ? int iExistingImage = GetExistingImageNum(szBuf); if (GEI_NOTLOADED != iExistingImage) { db_logf4(("\tImage already loaded to image number %d",iExistingImage)); return iExistingImage; } // what flags do we want? unsigned fAwLoad = AW_TLF_DEFAULT; if (fFlagsEtc & LIO_VIDMEM) fAwLoad |= AW_TLF_VIDMEM; if (fFlagsEtc & LIO_TRANSPARENT) fAwLoad |= AW_TLF_TRANSP; if (fFlagsEtc & LIO_CHROMAKEY) fAwLoad |= AW_TLF_CHROMAKEY; if (fFlagsEtc & LIO_LOADMIPMAPS) db_log1("CL_LoadImageOnce(): WARNING: mip maps not supported yet - will not be created/loaded"); // what are we loading into ? switch (fFlagsEtc & _LIO_SURFTYPEMASK) { case LIO_CHIMAGE: { db_log1("CL_LoadImageOnce(): WARNING: having to call LoadImageCH()"); IMAGEHEADER * pImageHdr = GetImageHeader(); db_assert1(pImageHdr); memset(pImageHdr,0,sizeof(IMAGEHEADER)); if (LoadImageCH(szBuf,pImageHdr)) return NumImages-1; else { db_log1("CL_LoadImageOnce(): ERROR: LoadImageCH() failed"); return GEI_NOTLOADED; } } case LIO_DDSURFACE: { #if CL_SUPPORT_FASTFILE unsigned nFastFileLen; void const * pFastFileData = ffreadbuf(szBuf,&nFastFileLen); if (pFastFileData) { db_log4("\tfile is in a fast file"); unsigned nWidth, nHeight; AW_BACKUPTEXTUREHANDLE hBackup = NULL; DDSurface * pSurface = AwCreateSurface ( fFlagsEtc & LIO_RESTORABLE ? "pxfXYB" : "pxfXY", pFastFileData, nFastFileLen, fAwLoad, &nWidth, &nHeight, &hBackup ); if (pSurface) { IMAGEHEADER * pImageHdr = GetImageHeader(); db_assert1(pImageHdr); memset(pImageHdr,0,sizeof(IMAGEHEADER)); pImageHdr->ImageWidth = nWidth; pImageHdr->ImageHeight = nHeight; db_assert1(sizeof pImageHdr->ImageName / sizeof pImageHdr->ImageName[0] > strlen(szBuf)); strcpy(pImageHdr->ImageName,szBuf); pImageHdr->DDSurface = pSurface; pImageHdr->hBackup = hBackup; db_logf4(("\tloaded to image number %d",NumImages-1)); #if CL_SUPPORT_ALTTAB if (fFlagsEtc & LIO_RESTORABLE) #ifdef NDEBUG ATIncludeSurface(pSurface,hBackup); #else { char szDbInf[512]; sprintf(szDbInf,"Name \"%s\" Number %d",szBuf,NumImages-1); ATIncludeSurfaceDb(pSurface,hBackup,szDbInf); } #endif #endif // CL_SUPPORT_ALTTAB return NumImages-1; } else { db_log1("CL_LoadImageOnce(): ERROR copying data to surface"); return GEI_NOTLOADED; } } else #endif // CL_SUPPORT_FASTFILE { #if !defined(CL_SUPPORTONLY_FASTFILE) || !CL_SUPPORTONLY_FASTFILE db_log4("\tloading the actual file"); unsigned nWidth, nHeight; AW_BACKUPTEXTUREHANDLE hBackup = NULL; DDSurface * pSurface = AwCreateSurface ( fFlagsEtc & LIO_RESTORABLE ? "sfXYB" : "sfXY", &szBuf[0], fAwLoad, &nWidth, &nHeight, &hBackup ); if (pSurface) { IMAGEHEADER * pImageHdr = GetImageHeader(); db_assert1(pImageHdr); memset(pImageHdr,0,sizeof(IMAGEHEADER)); pImageHdr->ImageWidth = nWidth; pImageHdr->ImageHeight = nHeight; db_assert1(sizeof pImageHdr->ImageName / sizeof pImageHdr->ImageName[0] > strlen(szBuf)); strcpy(pImageHdr->ImageName,szBuf); pImageHdr->DDSurface = pSurface; pImageHdr->hBackup = hBackup; db_logf4(("\tloaded to image number %d",NumImages-1)); db_logf4(("\t\tsurface:%p",pSurface)); #if CL_SUPPORT_ALTTAB if (fFlagsEtc & LIO_RESTORABLE) #ifdef NDEBUG ATIncludeSurface(pSurface,hBackup); #else { char szDbInf[512]; sprintf(szDbInf,"Name \"%s\" Number %d",szBuf,NumImages-1); ATIncludeSurfaceDb(pSurface,hBackup,szDbInf); } #endif #endif // CL_SUPPORT_ALTTAB return NumImages-1; } else { db_log1("CL_LoadImageOnce(): ERROR copying data to surface"); return GEI_NOTLOADED; } #elif !CL_SUPPORT_FASTFILE #error "CL_SUPPORTONLY_FASTFILE set but CL_SUPPORT_FASTFILE not set" #endif // !CL_SUPPORTONLY_FASTFILE } //db_msg1("THIS CODE SHOULD BE UNREACHABLE"); } case LIO_D3DTEXTURE: { fAwLoad |= AW_TLF_COMPRESS; // required on some cards!! #if CL_SUPPORT_FASTFILE unsigned nFastFileLen; void const * pFastFileData = ffreadbuf(szBuf,&nFastFileLen); if (pFastFileData) { db_log4("\tfile is in a fast file"); unsigned nWidth, nHeight; AW_BACKUPTEXTUREHANDLE hBackup = NULL; D3DTexture * pTexture = AwCreateTexture ( fFlagsEtc & LIO_RESTORABLE ? "pxfWHB" : "pxfWH", pFastFileData, nFastFileLen, fAwLoad, &nWidth, &nHeight, &hBackup ); if (pTexture) { IMAGEHEADER * pImageHdr = GetImageHeader(); db_assert1(pImageHdr); memset(pImageHdr,0,sizeof(IMAGEHEADER)); pImageHdr->ImageWidth = nWidth; pImageHdr->ImageHeight = nHeight; db_assert1(sizeof pImageHdr->ImageName / sizeof pImageHdr->ImageName[0] > strlen(szBuf)); strcpy(pImageHdr->ImageName,szBuf); pImageHdr->D3DTexture = pTexture; pImageHdr->hBackup = hBackup; db_logf4(("\tloaded to image number %d",NumImages-1)); /* KJL 16:05:50 26/02/98 - attempt to get a texture handle */ { int gotTextureHandle = GetTextureHandle(pImageHdr); db_assert1(gotTextureHandle==TRUE); } #if CL_SUPPORT_ALTTAB if (fFlagsEtc & LIO_RESTORABLE) #ifdef NDEBUG ATIncludeTexture(pTexture,hBackup); #else { char szDbInf[512]; sprintf(szDbInf,"Name \"%s\" Number %d",szBuf,NumImages-1); ATIncludeTextureDb(pTexture,hBackup,szDbInf); } #endif #endif // CL_SUPPORT_ALTTAB return NumImages-1; } else { db_log1("CL_LoadImageOnce(): ERROR copying data to texture"); return GEI_NOTLOADED; } } else #endif // CL_SUPPORT_FASTFILE { #if !defined(CL_SUPPORTONLY_FASTFILE) || !CL_SUPPORTONLY_FASTFILE db_log4("\tloading the actual file"); unsigned nWidth, nHeight; AW_BACKUPTEXTUREHANDLE hBackup = NULL; D3DTexture * pTexture = AwCreateTexture ( fFlagsEtc & LIO_RESTORABLE ? "sfWHB" : "sfWH", &szBuf[0], fAwLoad, &nWidth, &nHeight, &hBackup ); if (pTexture) { IMAGEHEADER * pImageHdr = GetImageHeader(); db_assert1(pImageHdr); memset(pImageHdr,0,sizeof(IMAGEHEADER)); pImageHdr->ImageWidth = nWidth; pImageHdr->ImageHeight = nHeight; db_assert1(sizeof pImageHdr->ImageName / sizeof pImageHdr->ImageName[0] > strlen(szBuf)); strcpy(pImageHdr->ImageName,szBuf); pImageHdr->D3DTexture = pTexture; pImageHdr->hBackup = hBackup; db_logf4(("\tloaded to image number %d",NumImages-1)); /* KJL 16:05:50 26/02/98 - attempt to get a texture handle */ { int gotTextureHandle = GetTextureHandle(pImageHdr); db_assert1(gotTextureHandle==TRUE); } #if CL_SUPPORT_ALTTAB if (fFlagsEtc & LIO_RESTORABLE) #ifdef NDEBUG ATIncludeTexture(pTexture,hBackup); #else { char szDbInf[512]; sprintf(szDbInf,"Name \"%s\" Number %d",szBuf,NumImages-1); ATIncludeTextureDb(pTexture,hBackup,szDbInf); } #endif #endif // CL_SUPPORT_ALTTAB return NumImages-1; } else { db_log1("CL_LoadImageOnce(): ERROR copying data to texture"); return GEI_NOTLOADED; } #elif !CL_SUPPORT_FASTFILE #error "CL_SUPPORTONLY_FASTFILE set but CL_SUPPORT_FASTFILE not set" #endif // !CL_SUPPORTONLY_FASTFILE } //db_msg1("THIS CODE SHOULD BE UNREACHABLE"); } default: db_log1("CL_LoadImageOnce(): ERROR: Invalid destination surface specification"); return GEI_NOTLOADED; } }