Mercurial > hg > dmlib
view dmres.h @ 526:f7df57cafdd9
Add support for Interpaint (unpacked) and Doodle (unpacked) hires formats.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 22 Nov 2012 01:07:45 +0200 |
parents | 3d9c044ec08d |
children | b60220fd1669 |
line wrap: on
line source
/* * DMLib * -- Resource management * Programmed and designed by Matti 'ccr' Hamalainen * (C) Copyright 2011-2012 Tecnic Software productions (TNSP) */ #ifndef DMRES_H #define DMRES_H #include "dmlib.h" #ifdef DM_USE_PACKFS #include <zlib.h> #include "dmpack.h" #endif #ifdef __cplusplus extern "C" { #endif /* Constants */ enum { DMPRUNE_ATIME = 0x0001, DMPRUNE_MTIME = 0x0002, }; enum { DRF_USE_PACK = 0x0001, DRF_PRELOAD_ALL = 0x0002, DRF_PRELOAD_RES = 0x0004, }; enum { DMF_PRELOAD_RAW = 0x0001, // Preload raw data DMF_PRELOAD_RES = 0x0002, // Perform resource preloading (not DMF_PERSIST = 0x0004, // Persist loaded resource (only freed at shutdown/explicit prune) DMF_STREAM = 0x0008, // This resource is streamed (UNSUPPORTED FOR NOW) DMF_MASK = 0x0fff, DMF_LOADED_RAW = 0x1000, // Raw data has been loaded DMF_LOADED_RES = 0x2000, // Resource has been loaded }; /* Typedefs and structures */ struct DMResourceLib; struct DMResourceDataOps; struct DMResourceOps; struct DMResource; typedef struct DMResource { // Timestamps (in seconds from time()) int mtime, // When resource was loaded atime; // Last accessed (dmres_ref()/unref) int refcount; // Reference count int flags; // Resource flags (DMF_*) char *filename; size_t dataSize; // Size of data off_t dataOffset; // Current offset in data Uint8 *data; // Pointer to data int error; // Error code struct DMResourceOps *fops; // Pointer to file handling functions struct struct DMResourceLib *lib; struct DMResource *next, *prev; void *rdata; size_t rdataSize; struct DMResourceDataOps *rops; FILE * fh; } DMResource; typedef struct DMResourceDataOps { BOOL (*probe)(DMResource *res, const char *fext); int (*load)(DMResource *res); void (*free)(DMResource *res); } DMResourceDataOps; typedef struct DMResourceLib { int flags; char *resPath; DMResource *resources, *preload; DMMutex *mutex; #ifdef DM_USE_PACKFS char *packFilename; DMPackFile *packFile; #endif } DMResourceLib; typedef struct DMResourceOps { int (*ferror)(DMResource *); int (*fseek)(DMResource *, const off_t, const int); off_t (*fsize)(DMResource *); off_t (*ftell)(DMResource *); BOOL (*feof)(DMResource *); int (*fgetc)(DMResource *); int (*fputc)(int, DMResource *); size_t (*fread)(void *, const size_t, const size_t, DMResource *); size_t (*fwrite)(void *, const size_t, const size_t, DMResource *); int (*fopen)(DMResource *); void (*fclose)(DMResource *); int (*preload)(DMResource *); } DMResourceOps; /* Functions */ int dmres_init(DMResourceLib **lib, const char *filename, const char *path, const int flags, int (*classifier)(DMResource *)); int dmres_close(DMResourceLib *lib); void dmres_prune(DMResourceLib *lib, int agems, int flags); int dmres_preload(DMResourceLib *lib, BOOL start, int *loaded, int *total); void dmres_flags_to_symbolic(char *str, size_t size, int flags); int dmres_symbolic_to_flags(const char *str); int dmres_load_resfile(DMResourceLib *lib, const char *filename); int dmres_write_resfile(DMResourceLib *lib, const char *filename); DMResource * dmres_new(DMResourceLib *lib, const char *filename, int flags, size_t size); void dmres_free(DMResource *node); void dmres_insert(DMResourceLib *lib, DMResource * node); void dmres_delete(DMResourceLib *lib, DMResource * node); DMResource * dmres_find(DMResourceLib *lib, const char *filename); int dmres_ref(DMResource *); int dmres_unref(DMResource *); // Opening and closing resources DMResource * dmf_open(DMResourceLib *lib, const char *); DMResource * dmf_create_memio(DMResourceLib *lib, const char *, Uint8 *buf, size_t len); #ifdef DM_USE_STDIO DMResource * dmf_create_stdio(const char *filename, const char *mode); DMResource * dmf_create_stdio_stream(FILE *); #endif void dmf_close(DMResource *); // Basic resource access functions int dmferror(DMResource *); int dmfseek(DMResource *, const off_t, const int); off_t dmfsize(DMResource *); off_t dmftell(DMResource *); BOOL dmfeof(DMResource *); int dmfgetc(DMResource *); int dmfputc(int, DMResource *); size_t dmfread(void *, const size_t, const size_t, DMResource *); size_t dmfwrite(void *, const size_t, const size_t, DMResource *); char * dmfgets(char *s, int size, DMResource * f); // Helper functions for endianess based reading etc int dmf_read_str(DMResource *, Uint8 *, size_t); BOOL dmf_read_byte(DMResource *, Uint8 *); BOOL dmf_read_be16(DMResource *, Uint16 *); BOOL dmf_read_be32(DMResource *, Uint32 *); BOOL dmf_read_le16(DMResource *, Uint16 *); BOOL dmf_read_le32(DMResource *, Uint32 *); #ifdef DM_HAVE_64BIT BOOL dmf_read_be64(DMResource *, Uint64 *); BOOL dmf_read_le64(DMResource *, Uint64 *); #endif #ifdef __cplusplus } #endif #endif // DMRES_H