Cleanup FontDesc struct and implementation
This commit is contained in:
parent
46c3bdea67
commit
f2a33a567b
|
@ -45,17 +45,8 @@ static int f_load(lua_State *L) {
|
||||||
luaL_error(L, "failed to load font");
|
luaL_error(L, "failed to load font");
|
||||||
}
|
}
|
||||||
|
|
||||||
FontDesc *font_desc = lua_newuserdata(L, sizeof(FontDesc));
|
FontDesc *font_desc = lua_newuserdata(L, font_desc_alloc_size(filename));
|
||||||
// FIXME: implement font_desc initialization in fontdesc.c
|
font_desc_init(font_desc, filename, size, font_options);
|
||||||
int filename_sz = strlen(filename) + 1;
|
|
||||||
font_desc->filename = malloc(filename_sz);
|
|
||||||
memcpy(font_desc->filename, filename, filename_sz);
|
|
||||||
font_desc->size = size;
|
|
||||||
font_desc->options = font_options;
|
|
||||||
font_desc->tab_size = 4;
|
|
||||||
font_desc->fonts_scale_length = 0;
|
|
||||||
font_desc->recent_font_scale_index = 0; /* No need to initialize. */
|
|
||||||
|
|
||||||
luaL_setmetatable(L, API_TYPE_FONT);
|
luaL_setmetatable(L, API_TYPE_FONT);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,33 @@
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
#include "fontdesc.h"
|
#include "fontdesc.h"
|
||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
|
|
||||||
|
|
||||||
|
int font_desc_alloc_size(const char *filename) {
|
||||||
|
return offsetof(FontDesc, filename) + strlen(filename) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void font_desc_init(FontDesc *font_desc, const char *filename, float size, unsigned int font_options) {
|
||||||
|
memcpy(font_desc->filename, filename, strlen(filename) + 1);
|
||||||
|
font_desc->size = size;
|
||||||
|
font_desc->options = font_options;
|
||||||
|
font_desc->tab_size = 4;
|
||||||
|
font_desc->cache_length = 0;
|
||||||
|
font_desc->cache_last_index = 0; /* Normally no need to initialize. */
|
||||||
|
}
|
||||||
|
|
||||||
|
void font_desc_free(FontDesc *font_desc) {
|
||||||
|
for (int i = 0; i < font_desc->cache_length; i++) {
|
||||||
|
ren_free_font(font_desc->cache[i].font);
|
||||||
|
}
|
||||||
|
font_desc->cache_length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void font_desc_set_tab_size(FontDesc *font_desc, int tab_size) {
|
void font_desc_set_tab_size(FontDesc *font_desc, int tab_size) {
|
||||||
font_desc->tab_size = tab_size;
|
font_desc->tab_size = tab_size;
|
||||||
for (int i = 0; i < font_desc->fonts_scale_length; i++) {
|
for (int i = 0; i < font_desc->cache_length; i++) {
|
||||||
ren_set_font_tab_size(font_desc->fonts_scale[i].font, tab_size);
|
ren_set_font_tab_size(font_desc->cache[i].font, tab_size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,42 +35,34 @@ int font_desc_get_tab_size(FontDesc *font_desc) {
|
||||||
return font_desc->tab_size;
|
return font_desc->tab_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void font_desc_free(FontDesc *font_desc) {
|
|
||||||
for (int i = 0; i < font_desc->fonts_scale_length; i++) {
|
|
||||||
ren_free_font(font_desc->fonts_scale[i].font);
|
|
||||||
}
|
|
||||||
font_desc->fonts_scale_length = 0;
|
|
||||||
free(font_desc->filename);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void load_scaled_font(FontDesc *font_desc, int index, int scale) {
|
static void load_scaled_font(FontDesc *font_desc, int index, int scale) {
|
||||||
RenFont *font = ren_load_font(font_desc->filename, scale * font_desc->size, font_desc->options);
|
RenFont *font = ren_load_font(font_desc->filename, scale * font_desc->size, font_desc->options);
|
||||||
font_desc->fonts_scale[index].font = font;
|
font_desc->cache[index].font = font;
|
||||||
font_desc->fonts_scale[index].scale = scale;
|
font_desc->cache[index].scale = scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenFont *font_desc_get_font_at_scale(FontDesc *font_desc, int scale) {
|
RenFont *font_desc_get_font_at_scale(FontDesc *font_desc, int scale) {
|
||||||
int index = -1;
|
int index = -1;
|
||||||
for (int i = 0; i < font_desc->fonts_scale_length; i++) {
|
for (int i = 0; i < font_desc->cache_length; i++) {
|
||||||
if (font_desc->fonts_scale[i].scale == scale) {
|
if (font_desc->cache[i].scale == scale) {
|
||||||
index = i;
|
index = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
index = font_desc->fonts_scale_length;
|
index = font_desc->cache_length;
|
||||||
if (index < FONT_SCALE_ARRAY_MAX) {
|
if (index < FONT_CACHE_ARRAY_MAX) {
|
||||||
load_scaled_font(font_desc, index, scale);
|
load_scaled_font(font_desc, index, scale);
|
||||||
font_desc->fonts_scale_length = index + 1;
|
font_desc->cache_length = index + 1;
|
||||||
} else {
|
} else {
|
||||||
// FIXME: should not print into the stderr or stdout.
|
// FIXME: should not print into the stderr or stdout.
|
||||||
fprintf(stderr, "Warning: max array of font scale reached.\n");
|
fprintf(stderr, "Warning: max array of font scale reached.\n");
|
||||||
index = (font_desc->recent_font_scale_index == 0 ? 1 : 0);
|
index = (font_desc->cache_last_index == 0 ? 1 : 0);
|
||||||
ren_free_font(font_desc->fonts_scale[index].font);
|
ren_free_font(font_desc->cache[index].font);
|
||||||
load_scaled_font(font_desc, index, scale);
|
load_scaled_font(font_desc, index, scale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
font_desc->recent_font_scale_index = index;
|
font_desc->cache_last_index = index;
|
||||||
return font_desc->fonts_scale[index].font;
|
return font_desc->cache[index].font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,27 +3,27 @@
|
||||||
|
|
||||||
typedef struct RenFont RenFont;
|
typedef struct RenFont RenFont;
|
||||||
|
|
||||||
// FIXME: find a better name for the struct below
|
struct FontInstance {
|
||||||
struct FontScaled {
|
|
||||||
RenFont *font;
|
RenFont *font;
|
||||||
short int scale;
|
short int scale;
|
||||||
};
|
};
|
||||||
typedef struct FontScaled FontScaled;
|
typedef struct FontInstance FontInstance;
|
||||||
|
|
||||||
#define FONT_SCALE_ARRAY_MAX 2
|
#define FONT_CACHE_ARRAY_MAX 2
|
||||||
|
|
||||||
struct FontDesc {
|
struct FontDesc {
|
||||||
char *filename;
|
|
||||||
float size;
|
float size;
|
||||||
unsigned int options;
|
unsigned int options;
|
||||||
short int tab_size;
|
short int tab_size;
|
||||||
// FIXME: find a better name for the array below
|
FontInstance cache[FONT_CACHE_ARRAY_MAX];
|
||||||
FontScaled fonts_scale[FONT_SCALE_ARRAY_MAX];
|
short int cache_length;
|
||||||
short int fonts_scale_length;
|
short int cache_last_index; /* More recently used instance. */
|
||||||
short int recent_font_scale_index; /* More recently scale used. */
|
char filename[0];
|
||||||
};
|
};
|
||||||
typedef struct FontDesc FontDesc;
|
typedef struct FontDesc FontDesc;
|
||||||
|
|
||||||
|
void font_desc_init(FontDesc *font_desc, const char *filename, float size, unsigned int font_options);
|
||||||
|
int font_desc_alloc_size(const char *filename);
|
||||||
int font_desc_get_tab_size(FontDesc *font_desc);
|
int font_desc_get_tab_size(FontDesc *font_desc);
|
||||||
void font_desc_set_tab_size(FontDesc *font_desc, int tab_size);
|
void font_desc_set_tab_size(FontDesc *font_desc, int tab_size);
|
||||||
void font_desc_free(FontDesc *font_desc);
|
void font_desc_free(FontDesc *font_desc);
|
||||||
|
|
Loading…
Reference in New Issue