Mac Italics and Bold

master
Allen Webster 2017-11-20 15:05:14 -05:00
parent 2017068cbf
commit a85ddda2a7
3 changed files with 92 additions and 11 deletions

View File

@ -338,7 +338,36 @@ global u32 system_font_method = SystemFontMethod_FilePath;
internal internal
Sys_Font_Path(name, parameters){ Sys_Font_Path(name, parameters){
// TODO(allen) b32 italic = (parameters != 0 && parameters->italics);
b32 bold = (parameters != 0 && parameters->bold);
i32 pt_size = 12;
if (parameters != 0){
pt_size = parameters->pt_size;
}
OSX_Font_Match match = osx_get_font_match(name, pt_size, italic, bold);
Font_Path path = {0};
if (match.path != 0){
Partition *part = &shared_vars.font_scratch;
path.temp = begin_temp_memory(part);
i32 len = str_size(match.path);
char *buffer = push_array(part, char, len + 1);
if (buffer == 0){
sysshared_partition_grow(part, l_round_up_i32(len + 1, KB(4)));
buffer = push_array(part, char, len + 1);
}
if (buffer != 0){
push_align(part, 8);
memcpy(buffer, match.path, len + 1);
path.len = len;
path.name = buffer;
}
}
return(path);
} }
Sys_Font_Data_Not_Used; Sys_Font_Data_Not_Used;

View File

@ -726,6 +726,8 @@ osx_timer_seconds(void){
return(result); return(result);
} }
NSFontManager *font_manager = 0;
NSString *get_font_path(NSFont *font){ NSString *get_font_path(NSFont *font){
CFStringRef name = (CFStringRef)[font fontName]; CFStringRef name = (CFStringRef)[font fontName];
CGFloat size = [font pointSize]; CGFloat size = [font pointSize];
@ -735,9 +737,60 @@ NSString *get_font_path(NSFont *font){
return(path); return(path);
} }
OSX_Font_Match
osx_get_font_match(char *name, i32 pt_size, b32 italic, b32 bold){
if (font_manager == 0){
font_manager = [NSFontManager sharedFontManager];
}
NSString *name_string = [NSString stringWithUTF8String:name];
NSFontTraitMask trait_mask = 0;
if (italic){
trait_mask = (trait_mask | NSItalicFontMask);
}
NSInteger weight = 5;
if (bold){
weight = 9;
}
b32 used_base_file = false;
NSFont *font = [font_manager
fontWithFamily: name_string
traits: trait_mask
weight: weight
size:(float)pt_size];
if (font == nil){
font = [font_manager
fontWithFamily: name_string
traits: 0
weight: 5
size:(float)pt_size];
used_base_file = true;
}
OSX_Font_Match match = {0};
if (font != nil){
NSString *path = get_font_path(font);
char *path_c = 0;
if (path != nil){
path_c = (char*)[path UTF8String];
}
if (path_c != 0){
match.path = path_c;
match.used_base_file = used_base_file;
}
}
return(match);
}
OSX_Loadable_Fonts OSX_Loadable_Fonts
osx_list_loadable_fonts(void){ osx_list_loadable_fonts(void){
NSFontManager *font_manager = [NSFontManager sharedFontManager]; if (font_manager == 0){
font_manager = [NSFontManager sharedFontManager];
}
NSArray<NSString*> *fonts = [font_manager availableFontFamilies]; NSArray<NSString*> *fonts = [font_manager availableFontFamilies];
OSX_Loadable_Fonts result = {0}; OSX_Loadable_Fonts result = {0};
@ -768,15 +821,6 @@ osx_list_loadable_fonts(void){
result.paths[i] = path_c; result.paths[i] = path_c;
} }
#if 0
for (int i = 0; i < count; ++i){
char *name = result.names[i];
char *path = result.paths[i];
fprintf(stdout, "found: %s\nat: %s\n", name, path);
fflush(stdout);
}
#endif
return(result); return(result);
} }

View File

@ -62,6 +62,11 @@ typedef struct OSX_Loadable_Fonts{
i32 count; i32 count;
} OSX_Loadable_Fonts; } OSX_Loadable_Fonts;
typedef struct OSX_Font_Match{
char *path;
b32 used_base_file;
} OSX_Font_Match;
// In C++ layer. // In C++ layer.
extern OSX_Objective_C_Vars osx_objc; extern OSX_Objective_C_Vars osx_objc;
@ -135,6 +140,9 @@ osx_close_app(void);
external f32 external f32
osx_timer_seconds(void); osx_timer_seconds(void);
external OSX_Font_Match
osx_get_font_match(char *name, i32 pt_size, b32 italic, b32 bold);
external OSX_Loadable_Fonts external OSX_Loadable_Fonts
osx_list_loadable_fonts(void); osx_list_loadable_fonts(void);