summaryrefslogtreecommitdiff
path: root/3dc/win95/CHNKTEXI.CPP
diff options
context:
space:
mode:
Diffstat (limited to '3dc/win95/CHNKTEXI.CPP')
-rw-r--r--3dc/win95/CHNKTEXI.CPP940
1 files changed, 0 insertions, 940 deletions
diff --git a/3dc/win95/CHNKTEXI.CPP b/3dc/win95/CHNKTEXI.CPP
deleted file mode 100644
index 640f011..0000000
--- a/3dc/win95/CHNKTEXI.CPP
+++ /dev/null
@@ -1,940 +0,0 @@
-#include <windows.h>
-#include <string.h>
-#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 <typeinfo.h>
-#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 <class C> // 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<RIF_Name_Chunk *>(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)<nBufSize)
- {
- strcpy(pszDestBuf,pszFileName);
- return pszDestBuf;
- }
- else
- {
- db_log1("CL_LoadImageOnce(): ERROR: buffer not large enough to hold filename");
- return NULL;
- }
- case LIO_RELATIVEPATH:
- db_logf4(("\t(which is a path relative to %s or %s)",
- FirstTex_Directory ? FirstTex_Directory : "<not-specified>",
- SecondTex_Directory ? SecondTex_Directory : "<not-specified>"));
- #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<Chunk_With_Children *>(pChunk);
- db_assert1(pEnvDataChunk);
-
- Environment_Game_Mode_Chunk * pGameModeChunk = NULL;
- if (cl_pszGameMode)
- {
- if (*cl_pszGameMode)
- {
- List<Chunk *> listGmChunks;
- pEnvDataChunk->lookup_child("GAMEMODE",listGmChunks);
-
- for (LIF<Chunk *> itGmChunks(&listGmChunks); !itGmChunks.done(); itGmChunks.next())
- {
- Environment_Game_Mode_Chunk * pGmChunk = dynamic_cast<Environment_Game_Mode_Chunk *>(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<Matching_Images_Chunk *>(pMiChunk);
- db_assert1(pMatchImageChunk);
- }
-
- List<Chunk *> listRifChildChunks;
- pGameModeChunk->lookup_child("RIFCHILD",listRifChildChunks);
-
- for (LIF<Chunk *> itRifChildChunks(&listRifChildChunks); !itRifChildChunks.done(); itRifChildChunks.next())
- {
- RIF_Child_Chunk * pRifChildChunk = dynamic_cast<RIF_Child_Chunk *>(itRifChildChunks());
- db_assert1(pRifChildChunk);
-
- if (pszSubName)
- {
- if (_stricmp(pszSubName,pRifChildChunk->rifname) && (*pszSubName || *pRifChildChunk->filename))
- continue;
- bShapeInGm = true;
- }
-
- for (LIF<BMP_Flags> 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<Chunk *> listExtShapes;
- pGameModeChunk->lookup_child("SHBMPNAM",listExtShapes);
-
- for (LIF<Chunk *> itExtShapes(&listExtShapes); !itExtShapes.done(); itExtShapes.next())
- {
- External_Shape_BMPs_Store_Chunk * pShapeBmpsChunk = dynamic_cast<External_Shape_BMPs_Store_Chunk *>(itExtShapes());
- db_assert1(pShapeBmpsChunk);
-
- if (pszSubName)
- if (_stricmp(pszSubName,pShapeBmpsChunk->shapename) && *pszSubName)
- continue;
-
- for (LIF<BMP_Name> 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<Chunk *> listMatchImageChunk;
- pEnvDataChunk->lookup_child("MATCHIMG",listMatchImageChunk);
-
- Matching_Images_Chunk * pMicFix = NULL;
- Matching_Images_Chunk * pMicNorm = NULL;
-
- for (LIF<Chunk *> itMatchImageChunk(&listMatchImageChunk); !itMatchImageChunk.done(); itMatchImageChunk.next())
- {
- Matching_Images_Chunk * pMatchImageChunk = dynamic_cast<Matching_Images_Chunk *>(itMatchImageChunk());
- db_assert1(pMatchImageChunk);
- if (pMatchImageChunk->flags & MICF_FIXEDPALETTE)
- pMicFix = pMatchImageChunk;
- else
- pMicNorm = pMatchImageChunk;
- }
-
- List<Chunk_With_Children *> listShapesSprites;
-
- List<Chunk *> listShapes;
- Env_Chunk->lookup_child("REBSHAPE",listShapes);
- for (LIF<Chunk *> itShapes(&listShapes); !itShapes.done(); itShapes.next())
- {
- Shape_Chunk * pShapeChunk = dynamic_cast<Shape_Chunk *>(itShapes());
- db_assert1(pShapeChunk);
- Chunk * pSxfnChunk = pShapeChunk->lookup_single_child("SHPEXTFL");
- if (pSxfnChunk)
- {
- Shape_External_File_Chunk * pShpExtFnameChunk = dynamic_cast<Shape_External_File_Chunk *>(pSxfnChunk);
- db_assert1(pShpExtFnameChunk);
- listShapesSprites.add_entry(pShpExtFnameChunk);
- }
- }
- Chunk * pSprChunk = Env_Chunk->lookup_single_child("RSPRITES");
- if (pSprChunk)
- {
- Chunk_With_Children * pSpritesChunk = dynamic_cast<Chunk_With_Children *>(pSprChunk);
- db_assert1(pSpritesChunk);
-
- List<Chunk *> listSprHeadChunks;
- pSpritesChunk->lookup_child("SPRIHEAD",listSprHeadChunks);
-
- for (LIF<Chunk *> itSprites(&listSprHeadChunks); !itSprites.done(); itSprites.next())
- {
- Chunk_With_Children * pSpriteHead = dynamic_cast<Chunk_With_Children *>(itSprites());
- db_assert1(pSpriteHead);
- listShapesSprites.add_entry(pSpriteHead);
- }
- }
-
- int bShapeFound = pszSubName ? false : true;
-
- for (LIF<Chunk_With_Children *> 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<Bitmap_List_Store_Chunk *>(pBmpLstStChunk);
- db_assert1(pBmpListStoreChunk);
-
- for (LIF<BMP_Name> 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<Global_BMP_Name_Chunk *>(pBmpNames);
- db_assert1(pGbnc);
-
- for (LIF<BMP_Name> 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;
- }
-}
-