#ifndef TEXTURES_H #define TEXTURES_H #include #include #include struct texture { SDL_Rect srcrect; /* position in atlas */ SDL_Surface *data; /* original image data */ SDL_Texture *loner_data; /* loner textures store their data directly */ int atlas_index; /* which atlas the texture is in */ int8_t layer; }; struct texture_cache_item { char *key; struct texture value; }; /* use the public API to create and manipulate instances of this structure */ struct texture_cache { /* from context */ SDL_Window *window; SDL_Renderer *renderer; struct texture_cache_item *hash; struct texture_cache_item *loner_hash; stbrp_node *node_buffer; /* used internally by stb_rect_pack */ SDL_Surface **atlas_surfaces; SDL_Texture **atlas_textures; int atlas_index; bool is_dirty; /* current atlas needs to be recreated */ }; void textures_cache_init(struct texture_cache *cache, SDL_Window *window); void textures_cache_deinit(struct texture_cache *cache); /* for debugging */ void textures_dump_atlases(struct texture_cache *cache); /* loads an image if it isn't in the cache, otherwise a no-op. */ /* can be called from anywhere at any time after init, useful if you want to */ /* preload textures you know will definitely be used */ void textures_load(struct texture_cache *cache, char *path); /* repacks the current texture atlas based on the texture cache */ void textures_update_current_atlas(struct texture_cache *cache); /* returns a rect in a texture cache atlas based on a path, for drawing */ /* if the texture is not found, returns a zero-filled rect (so check w or h) */ SDL_Rect textures_get_srcrect(struct texture_cache *cache, char *path); /* returns which atlas the texture in the path is in, starting from 0 */ /* if the texture is not found, returns INT_MIN */ int textures_get_atlas_index(struct texture_cache *cache, char *path); /* returns a pointer to the atlas at `index` */ /* if the index is out of bounds, returns NULL. */ /* you can get the index via texture_get_atlas_index */ SDL_Texture *textures_get_atlas(struct texture_cache *cache, int index); SDL_Texture *textures_get_loner(struct texture_cache *cache, char *path); /* returns the number of atlases in the cache */ size_t textures_get_num_atlases(struct texture_cache *cache); #endif