mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-22 17:49:43 +01:00
Add name->idx hashmap in FontContainer
This makes find_font_by_name() not O(n). It's not really a big deal, because there won't be many fonts, but it'd make a function in the next commit (finding the given fallback font for each font by name) O(n^2). It's easy enough to add the hashmap.
This commit is contained in:
parent
6cf63359d3
commit
7a06b61f5d
1 changed files with 24 additions and 7 deletions
|
@ -14,6 +14,11 @@
|
||||||
#include "Vlogging.h"
|
#include "Vlogging.h"
|
||||||
#include "XMLUtils.h"
|
#include "XMLUtils.h"
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include <c-hashmap/map.h>
|
||||||
|
}
|
||||||
|
|
||||||
// Sigh... This is the second forward-declaration, we need to put this in a header file
|
// Sigh... This is the second forward-declaration, we need to put this in a header file
|
||||||
SDL_Texture* LoadImage(const char *filename, const TextureLoadType loadtype);
|
SDL_Texture* LoadImage(const char *filename, const TextureLoadType loadtype);
|
||||||
|
|
||||||
|
@ -52,6 +57,7 @@ struct FontContainer
|
||||||
{
|
{
|
||||||
uint8_t count;
|
uint8_t count;
|
||||||
Font* fonts;
|
Font* fonts;
|
||||||
|
hashmap* map_name_idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PrintFlags
|
struct PrintFlags
|
||||||
|
@ -227,6 +233,12 @@ static uint8_t load_font(FontContainer* container, const char* name)
|
||||||
f->glyph_w = 8;
|
f->glyph_w = 8;
|
||||||
f->glyph_h = 8;
|
f->glyph_h = 8;
|
||||||
|
|
||||||
|
if (container->map_name_idx == NULL)
|
||||||
|
{
|
||||||
|
container->map_name_idx = hashmap_create();
|
||||||
|
}
|
||||||
|
hashmap_set(container->map_name_idx, f->name, SDL_strlen(f->name), f_idx);
|
||||||
|
|
||||||
bool white_teeth = false;
|
bool white_teeth = false;
|
||||||
|
|
||||||
tinyxml2::XMLDocument doc;
|
tinyxml2::XMLDocument doc;
|
||||||
|
@ -390,14 +402,17 @@ static uint8_t load_font(FontContainer* container, const char* name)
|
||||||
static bool find_font_by_name(FontContainer* container, const char* name, uint8_t* idx)
|
static bool find_font_by_name(FontContainer* container, const char* name, uint8_t* idx)
|
||||||
{
|
{
|
||||||
// Returns true if font found (and idx is set), false if not found
|
// Returns true if font found (and idx is set), false if not found
|
||||||
|
if (container->map_name_idx == NULL)
|
||||||
for (uint8_t i = 0; i < container->count; i++)
|
|
||||||
{
|
{
|
||||||
if (SDL_strcmp(name, container->fonts[i].name) == 0)
|
// No fonts yet...
|
||||||
{
|
return false;
|
||||||
*idx = i;
|
}
|
||||||
return true;
|
|
||||||
}
|
uintptr_t i;
|
||||||
|
if (hashmap_get(container->map_name_idx, (char*) name, SDL_strlen(name), &i))
|
||||||
|
{
|
||||||
|
*idx = i;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -563,6 +578,8 @@ void unload_font(Font* f)
|
||||||
|
|
||||||
void unload_font_container(FontContainer* container)
|
void unload_font_container(FontContainer* container)
|
||||||
{
|
{
|
||||||
|
VVV_freefunc(hashmap_free, container->map_name_idx);
|
||||||
|
|
||||||
for (uint8_t i = 0; i < container->count; i++)
|
for (uint8_t i = 0; i < container->count; i++)
|
||||||
{
|
{
|
||||||
unload_font(&container->fonts[i]);
|
unload_font(&container->fonts[i]);
|
||||||
|
|
Loading…
Reference in a new issue