Improved user font initialization in allegro5 backend

This commit is contained in:
Andrew Kravchuk 2020-06-06 09:50:00 +03:00
parent 74db09cdab
commit 539f477781
No known key found for this signature in database
GPG Key ID: B8A851BA50F6285F

View File

@ -33,7 +33,8 @@ NK_API void nk_allegro5_del_image(struct nk_image* image);
/* Fonts. We wrap normal allegro fonts in some nuklear book keeping */
NK_API NkAllegro5Font* nk_allegro5_font_create_from_file(const char *file_name, int font_size, int flags);
NK_API void nk_allegro5_font_del(NkAllegro5Font *font);
NK_API struct nk_user_font* nk_allegro5_font(NkAllegro5Font *allegro5font);
/* NOTE : just use NkAllegro5Font instead of nk_user_font,
since the former just extends the latter*/
NK_API void nk_allegro5_font_set_font(NkAllegro5Font *font);
#endif
@ -53,7 +54,6 @@ NK_API void nk_allegro5_font_set_font(NkAllegro5Font *font);
struct NkAllegro5Font {
struct nk_user_font nk;
int height;
ALLEGRO_FONT *font;
};
@ -95,6 +95,23 @@ NK_API void nk_allegro5_del_image(struct nk_image* image)
free(image);
}
static float
nk_allegro5_font_get_text_width(nk_handle handle, float height, const char *text, int len)
{
NkAllegro5Font *font = (NkAllegro5Font*)handle.ptr;
if (!font || !text) {
return 0;
}
/* We must copy into a new buffer with exact length null-terminated
as nuklear uses variable size buffers and al_get_text_width doesn't
accept a length, it infers length from null-termination
(which is unsafe API design by allegro devs!) */
char strcpy[len+1];
strncpy((char*)&strcpy, text, len);
strcpy[len] = '\0';
return al_get_text_width(font->font, strcpy);
}
/* Flags are identical to al_load_font() flags argument */
NK_API NkAllegro5Font*
nk_allegro5_font_create_from_file(const char *file_name, int font_size, int flags)
@ -118,34 +135,9 @@ nk_allegro5_font_create_from_file(const char *file_name, int font_size, int flag
fprintf(stdout, "Unable to load font file: %s\n", file_name);
return NULL;
}
font->height = al_get_font_line_height(font->font);
return font;
}
static float
nk_allegro5_font_get_text_width(nk_handle handle, float height, const char *text, int len)
{
NkAllegro5Font *font = (NkAllegro5Font*)handle.ptr;
if (!font || !text) {
return 0;
}
/* We must copy into a new buffer with exact length null-terminated
as nuklear uses variable size buffers and al_get_text_width doesn't
accept a length, it infers length from null-termination
(which is unsafe API design by allegro devs!) */
char strcpy[len+1];
strncpy((char*)&strcpy, text, len);
strcpy[len] = '\0';
return al_get_text_width(font->font, strcpy);
}
NK_API struct nk_user_font*
nk_allegro5_font(NkAllegro5Font *allegro5font)
{
struct nk_user_font *font = &allegro5font->nk;
font->userdata = nk_handle_ptr(allegro5font);
font->height = (float)allegro5font->height;
font->width = nk_allegro5_font_get_text_width;
font->nk.userdata = nk_handle_ptr(font);
font->nk.height = (float)al_get_font_line_height(font->font);
font->nk.width = nk_allegro5_font_get_text_width;
return font;
}
@ -153,9 +145,6 @@ NK_API void
nk_allegro5_font_set_font(NkAllegro5Font *allegro5font)
{
struct nk_user_font *font = &allegro5font->nk;
font->userdata = nk_handle_ptr(allegro5font);
font->height = (float)allegro5font->height;
font->width = nk_allegro5_font_get_text_width;
nk_style_set_font(&allegro5.ctx, font);
}
@ -475,9 +464,6 @@ nk_allegro5_init(NkAllegro5Font *allegro5font, ALLEGRO_DISPLAY *dsp,
}
struct nk_user_font *font = &allegro5font->nk;
font->userdata = nk_handle_ptr(allegro5font);
font->height = (float)allegro5font->height;
font->width = nk_allegro5_font_get_text_width;
allegro5.dsp = dsp;
allegro5.width = width;