annotate nuklear_ui/font_mac.m @ 1559:098c11aaf8f0

Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
author Michael Pavone <pavone@retrodev.com>
date Wed, 04 Apr 2018 00:01:17 -0700
parents b4914d92308b
children 18ffa9caa00c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #import <AppKit/AppKit.h>
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stddef.h>
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include "../paths.h"
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include "../util.h"
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "sfnt.h"
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7 sfnt_table *find_font_in_dir(char *path, char *prefix, const char *ps_name)
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 size_t num_entries;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 dir_entry *entries = get_dir_list(path, &num_entries);
1559
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
11 size_t prefix_len = prefix ? strlen(prefix) : 0;
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12 sfnt_table *selected = NULL;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 for (size_t i = 0; i < num_entries && !selected; i++)
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 char *ext = path_extension(entries[i].name);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 if (!ext || (strcasecmp(ext, "ttf") && strcasecmp(ext, "ttc") && strcasecmp(ext, "dfont"))) {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 //not a truetype font, ignore
1559
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
18 printf("Skipping %s because of its extension\n", entries[i].name);
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 free(ext);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 continue;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 free(ext);
1559
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
23 if (!prefix || !strncasecmp(entries[i].name, prefix, prefix_len)) {
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 char *full_path = path_append(path, entries[i].name);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 FILE *f = fopen(full_path, "rb");
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 if (f)
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 long font_size = file_size(f);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 uint8_t *blob = malloc(font_size);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 if (font_size == fread(blob, 1, font_size, f))
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 sfnt_container *sfnt = load_sfnt(blob, font_size);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 if (sfnt) {
1559
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
34 printf("Examining font file %s\n", entries[i].name);
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 for (uint8_t j = 0; j < sfnt->num_fonts && !selected; j++)
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 char *cur_ps = sfnt_name(sfnt->tables + j, SFNT_POSTSCRIPT);
1559
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
38 printf("\t%s\n", cur_ps);
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 if (!strcmp(cur_ps, ps_name)) {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 selected = sfnt->tables + j;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 free(cur_ps);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 } else {
1559
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
45 printf("Failed to load %s as sfnt containern\n", entries[i].name);
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 free(blob);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 } else {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 free(blob);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 fclose(f);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 free(full_path);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 return selected;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 uint8_t *default_font(uint32_t *size_out)
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 NSFont *sys = [NSFont systemFontOfSize:0];
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 NSString *name = [sys fontName];
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 const char *ps_name = [name UTF8String];
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 const unsigned char *prefix_start = (const unsigned char *)ps_name;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 while(*prefix_start && (
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 *prefix_start < '0' ||
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 (*prefix_start > 'z' && *prefix_start <= 0x80) ||
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 (*prefix_start > 'Z' && *prefix_start < 'a') ||
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 (*prefix_start > '9' && *prefix_start < 'A')
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 ))
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 prefix_start++;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 if (!*prefix_start) {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 //Didn't find a suitable starting character, just start from the beginning
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 prefix_start = (const unsigned char *)ps_name;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 const unsigned char *prefix_end = (const unsigned char *)prefix_start + 1;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 while (*prefix_end && *prefix_end >= 'a')
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 prefix_end++;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 char *prefix = malloc(prefix_end - prefix_start + 1);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 memcpy(prefix, prefix_start, prefix_end - prefix_start);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 prefix[prefix_end-prefix_start] = 0;
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 //check /Library/Fonts first
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 sfnt_table *selected = find_font_in_dir("/Library/Fonts", (char *)prefix, ps_name);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 if (!selected) {
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 selected = find_font_in_dir("/System/Library/Fonts", (char *)prefix, ps_name);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 if (!selected) {
1559
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
92 puts("Check using prefix failed, exhaustively checking fonts");
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
93 selected = find_font_in_dir("/Library/Fonts", NULL, ps_name);
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
94 }
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
95 if (!selected) {
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
96 selected = find_font_in_dir("/System/Library/Fonts", NULL, ps_name);
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
97 }
098c11aaf8f0 Fix silly bug in handling of Mac Roman font names. Make Mac font search more exhaustive if the faster prefix check fails. Added a bunch of debug printfs in case those aren't sufficient to get things working on other machines
Michael Pavone <pavone@retrodev.com>
parents: 1537
diff changeset
98 if (!selected) {
1537
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 fatal_error("Failed to find system font %s using prefix %s\n", ps_name, prefix);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 free(prefix);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 return sfnt_flatten(selected, size_out);
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 }
b4914d92308b Added OSX implementation of default_font
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104