src/font.c

Wed, 02 Jul 2025 23:21:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 02 Jul 2025 23:21:17 +0200
changeset 174
0009b982bc7d
parent 154
4dff9cc488fe
permissions
-rw-r--r--

resolve TODOs regarding input.h

a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array

11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2023 Mike Becker. All rights reserved.
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
106
895f92cff6b8 bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
28 #include "ascension/error.h"
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "ascension/context.h"
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
30 #include "ascension/filesystem.h"
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
31 #include "ascension/ui/font.h"
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
33 #include <assert.h>
128
c36170c76a2b add UI scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
34 #include <math.h>
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
35 #include <cx/array_list.h>
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
36
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
37 void asc_font(enum AscFontStyle style, int size) {
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
38 asc_context.active_font.style = style;
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
39 asc_context.active_font.size = size;
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
40 }
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
41
149
560772519ff9 resolve east-west conflict
Mike Becker <universe@uap-core.de>
parents: 128
diff changeset
42 static const char *asc_font_filename(enum AscFontStyle style) {
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 switch (style) {
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 case ASC_FONT_REGULAR:
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
45 return "OpenSans-Regular.ttf";
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 case ASC_FONT_BOLD:
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
47 return "OpenSans-Bold.ttf";
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 case ASC_FONT_ITALIC:
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
49 return "OpenSans-Italic.ttf";
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 case ASC_FONT_BOLD_ITALIC:
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
51 return "OpenSans-BoldItalic.ttf";
83
f7ce0db6f72b implement view matrix in sprite shader
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
52 default:
f7ce0db6f72b implement view matrix in sprite shader
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
53 assert(false);
f7ce0db6f72b implement view matrix in sprite shader
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
54 return NULL;
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 }
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 }
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
58 struct asc_font_cache_entry {
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
59 AscFont font;
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
60 TTF_Font *ttf;
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
61 };
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
62
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
63 static CxList *asc_font_cache;
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
64
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
65 static void asc_font_unload(struct asc_font_cache_entry *entry) {
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
66 TTF_CloseFont(entry->ttf);
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
67 asc_dprintf("Closed font size %u, style %u", entry->font.size, entry->font.style);
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
68 }
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
69
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
70 void asc_font_cache_init(void) {
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
71 assert(asc_font_cache == NULL);
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
72 asc_font_cache = cxArrayListCreateSimple(
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
73 sizeof(struct asc_font_cache_entry), 16
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
74 );
67
0b96fe6d6b5e update to recent snapshot of UCX 3.1
Mike Becker <universe@uap-core.de>
parents: 66
diff changeset
75 cxDefineDestructor(asc_font_cache, asc_font_unload);
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
76 }
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
77
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
78 void asc_font_cache_destroy(void) {
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
79 assert(asc_font_cache != NULL);
76
eb16be99b0ad update to newest versions of uwproj and ucx
Mike Becker <universe@uap-core.de>
parents: 67
diff changeset
80 cxListFree(asc_font_cache);
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
81 }
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
82
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
83 TTF_Font *asc_font_load(AscFont font) {
128
c36170c76a2b add UI scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
84 // apply the UI scaling factor first to get the actual font size
154
4dff9cc488fe add auto-scaling of UI depending on screen resolution - resolves #682
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
85 const float ui_scale = asc_active_window->ui_scale;
4dff9cc488fe add auto-scaling of UI depending on screen resolution - resolves #682
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
86 if (ui_scale != 1.f) {
4dff9cc488fe add auto-scaling of UI depending on screen resolution - resolves #682
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
87 font.size = (int) roundf((float) font.size * ui_scale);
128
c36170c76a2b add UI scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
88 }
c36170c76a2b add UI scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
89
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
90 CxIterator iter = cxListIterator(asc_font_cache);
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
91 cx_foreach(struct asc_font_cache_entry*, cache, iter) {
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
92 if (cache->font.style == font.style && cache->font.size == font.size) {
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
93 return cache->ttf;
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 }
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 }
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
97 struct asc_font_cache_entry entry;
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
98 entry.font = font;
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
99 const char *font_name = asc_font_filename(font.style);
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
100 cxmutstr fpath = asc_filesystem_combine_paths(cx_strcast(asc_context.font_path), cx_str(font_name));
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
101 asc_dprintf("Load font from %" CX_PRIstr, CX_SFMT(fpath));
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
102 entry.ttf = TTF_OpenFont(fpath.ptr, font.size);
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
103 cx_strfree(&fpath);
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
104 if (entry.ttf == NULL) {
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
105 asc_error("Failed to load font %s: %s", font_name, TTF_GetError());
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
106 return NULL;
65
9c44c55d327a consistently refer to windows by ID - fixes #381
Mike Becker <universe@uap-core.de>
parents: 48
diff changeset
107 } else {
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
108 cxListAdd(asc_font_cache, &entry);
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
109 asc_dprintf("Loaded font size %d, style %d from %s", font.size, font.style, font_name);
66
8297afa1c29c replaces broken font cache with improved cache - fixes #387
Mike Becker <universe@uap-core.de>
parents: 65
diff changeset
110 return entry.ttf;
11
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 }
d83af80eb09b add font management
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 }

mercurial