probably fix linux font loading

master
Alex Baines 2020-05-16 13:19:25 +01:00
parent 36bb5f8db0
commit 2cc4a8f0a7
1 changed files with 17 additions and 78 deletions

View File

@ -94,7 +94,7 @@
#define function static #define function static
#undef Cursor #undef Cursor
#include <fontconfig/fontconfig.h> //#include <fontconfig/fontconfig.h>
#define internal static #define internal static
#include <GL/glx.h> #include <GL/glx.h>
@ -158,7 +158,7 @@ struct Linux_Vars {
int xfixes_selection_event; int xfixes_selection_event;
XIM xim; XIM xim;
XIC xic; XIC xic;
FcConfig* fontconfig; //FcConfig* fontconfig;
XkbDescPtr xkb; XkbDescPtr xkb;
Linux_Input_Chunk input; Linux_Input_Chunk input;
@ -567,88 +567,27 @@ graphics_fill_texture_sig(){
//////////////////////////// ////////////////////////////
internal Face_Description internal Face*
linux_find_font(Face_Description* desc) { font_make_face(Arena* arena, Face_Description* description, f32 scale_factor) {
Face_Description result = *desc;
char* name = strndupa((char*)desc->font.file_name.str, desc->font.file_name.size);
double size;
const char* style;
{
Face_Load_Parameters* p = &desc->parameters;
size = p->pt_size;
if(p->bold && p->italic) {
style = "Bold Italic";
} else if(p->bold) {
style = "Bold";
} else if(p->italic) {
style = "Italic";
} else {
style = "Regular";
}
}
FcPattern *pattern = FcPatternBuild(0,
FC_POSTSCRIPT_NAME, FcTypeString, name,
FC_SIZE, FcTypeDouble, size,
FC_FONTFORMAT, FcTypeString, "TrueType",
FC_STYLE, FcTypeString, (FcChar8*)style,
NULL);
if(!pattern) {
return result;
}
if (FcConfigSubstitute(linuxvars.fontconfig, pattern, FcMatchPattern)){
FcDefaultSubstitute(pattern);
FcResult res;
FcPattern *font = FcFontMatch(linuxvars.fontconfig, pattern, &res);
if (!font){
return result;
}
FcChar8 *filename = 0;
FcPatternGetString(font, FC_FILE, 0, &filename);
if(filename) {
LINUX_FN_DEBUG("FONTCONFIG FILENAME = %s\n", filename);
result.font.file_name = push_u8_stringf(&linuxvars.frame_arena, "%s", filename);
}
FcPatternDestroy(font);
}
FcPatternDestroy(pattern);
return result;
}
internal Face_Description local_description = *description;
font_make_face_sig() { String_Const_u8* name = &local_description.font.file_name;
Face* result = ft__font_make_face(arena, description, scale_factor); // if description->font.file_name is a relative path, prepend the font directory.
if(string_get_character(*name, 0) != '/') {
// if it failed to load the font directly, try via fontconfig. String_Const_u8 binary = system_get_path(arena, SystemPath_Binary);
if(!result) { *name = push_u8_stringf(arena, "%.*sfonts/%.*s", string_expand(binary), string_expand(*name));
Face_Description desc2 = {};
desc2.parameters = description->parameters;
desc2.font.file_name = string_front_of_path(description->font.file_name);
printf("FONT %.*s\n", string_expand(desc2.font.file_name));
desc2 = linux_find_font(&desc2);
result = ft__font_make_face(arena, &desc2, scale_factor);
} }
Face* result = ft__font_make_face(arena, &local_description, scale_factor);
if(!result) { if(!result) {
// is this fatal? 4ed.cpp:277 (caller) does not check for null. // is this fatal? 4ed.cpp:277 (caller) does not check for null.
String_Const_u8 s = description->font.file_name;
char msg[4096]; char msg[4096];
snprintf(msg, sizeof(msg), "Unable to load font: %.*s", (int)s.size, s.str); snprintf(msg, sizeof(msg), "Unable to load font: %.*s", string_expand(*name));
system_error_box(msg); system_error_box(msg);
} }
return(result); return(result);
} }
@ -1809,7 +1748,7 @@ main(int argc, char **argv){
linuxvars.clipboard_arena = make_arena_system(); linuxvars.clipboard_arena = make_arena_system();
render_target.arena = make_arena_system(KB(256)); render_target.arena = make_arena_system(KB(256));
linuxvars.fontconfig = FcInitLoadConfigAndFonts(); //linuxvars.fontconfig = FcInitLoadConfigAndFonts();
linuxvars.cursor_show = MouseCursorShow_Always; linuxvars.cursor_show = MouseCursorShow_Always;
linuxvars.prev_cursor_show = MouseCursorShow_Always; linuxvars.prev_cursor_show = MouseCursorShow_Always;