#ifndef _texcache_h_
# define _texcache_h_

#ifdef USE_OPENGL

#define TEXCACHEMAGIC "QLZ1"
#define GLTEXCACHEADSIZ 8192
#define TEXCACHEHASHSIZE 1024

enum texcacherr_t
{
    TEXCACHERR_NOERROR,
    TEXCACHERR_OUTOFMEMORY,
    TEXCACHERR_BUFFERUNDERRUN,
    TEXCACHERR_DEDXT,
    TEXCACHERR_COMPTEX,
    TEXCACHERR_GETTEXLEVEL,
    TEXCACHEERRORS
};

struct texcacheitem_t
{
    char name[BMAX_PATH];
    int32_t offset;
    int32_t len;
    struct texcacheitem_t *next;
};

typedef struct texcacheitem_t texcacheindex;

typedef struct {
    int32_t filehandle, filepos, numentries;
    FILE *index;
    pthtyp *list[GLTEXCACHEADSIZ];
    texcacheindex *firstindex, *currentindex, *ptrs[MAXTILES<<1];
    hashtable_t hashes;
    struct {
        uint8_t *ptr;
        size_t size;
        // Set to 1 when we failed (re)allocating space for the memcache or failing to
        // read into it (which would presumably generate followup errors spamming the
        // log otherwise):
        int32_t noalloc;
    } memcache;
} globaltexcache;

extern globaltexcache texcache;

extern char TEXCACHEFILE[BMAX_PATH];

extern void texcache_freeptrs(void);
extern void texcache_syncmemcache(void);
extern void texcache_init(void);
extern void texcache_clearmemcache(void);
extern int32_t texcache_loadoffsets(void);
extern int32_t texcache_readdata(void *dest, int32_t len);
extern pthtyp *texcache_fetch(int32_t dapicnum, int32_t dapalnum, int32_t dashade, int32_t dameth);
extern int32_t texcache_loadskin(const texcacheheader *head, int32_t *doalloc, GLuint *glpic, int32_t *xsiz, int32_t *ysiz);
extern int32_t texcache_loadtile(const texcacheheader *head, int32_t *doalloc, pthtyp *pth);
extern void texcache_writetex(const char *fn, int32_t len, int32_t dameth, char effect, texcacheheader *head);
extern int32_t texcache_readtexheader(const char *fn, int32_t len, int32_t dameth, char effect, texcacheheader *head, int32_t modelp);
extern void texcache_openfiles(void);
extern void texcache_setupmemcache(void);
extern void texcache_checkgarbage(void);
extern void texcache_setupindex(void);

#endif
#endif