annotate src/libmlk-core/core/font.c @ 320:8f9937403749

misc: improve loading of data
author David Demelier <markand@malikania.fr>
date Fri, 01 Oct 2021 20:30:00 +0200
parents libmlk-core/core/font.c@d01e83210ca2
children 979960e65f76
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * font.c -- basic font management
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
314
d01e83210ca2 misc: update years
David Demelier <markand@malikania.fr>
parents: 298
diff changeset
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
154
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
20 #include <string.h>
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <SDL_ttf.h>
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
11
d1cdb90d9558 core: implement color manipulation, closes #2446
David Demelier <markand@malikania.fr>
parents: 10
diff changeset
24 #include "color.h"
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
25 #include "error.h"
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include "font.h"
113
c5dcf51f5f1e core: fix implicit declaration
David Demelier <markand@malikania.fr>
parents: 111
diff changeset
27 #include "texture_p.h"
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
28 #include "util.h"
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
30 int
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
31 font_open(struct font *font, const char *path, unsigned int size)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 {
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
33 assert(font);
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 assert(path);
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
36 if (!(font->handle = TTF_OpenFont(path, size)))
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 159
diff changeset
37 return errorf("%s", SDL_GetError());
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
38
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
39 return 0;
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 }
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
42 int
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
43 font_openmem(struct font *font, const void *buffer, size_t buflen, unsigned int size)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 {
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
45 assert(font);
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
46 assert(buffer);
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
47
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 SDL_RWops *ops;
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
49
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
50 if (!(ops = SDL_RWFromConstMem(buffer, buflen)) ||
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
51 (!(font->handle = TTF_OpenFontRW(ops, 1, size))))
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 159
diff changeset
52 return errorf("%s", SDL_GetError());
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
54 return 0;
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 }
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
57 int
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
58 font_ok(const struct font *font)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 {
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
60 return font && font->handle;
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
61 }
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
62
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
63 int
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
64 font_render(struct font *font, struct texture *tex, const char *text, unsigned int color)
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
65 {
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
66 assert(font_ok(font));
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 assert(text);
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 SDL_Color fg = {
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
70 .r = COLOR_R(color),
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
71 .g = COLOR_G(color),
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
72 .b = COLOR_B(color),
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
73 .a = COLOR_A(color)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 };
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
75 SDL_Surface *surface;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
76 SDL_Surface *(*func)(TTF_Font *, const char *, SDL_Color);
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
78 switch (font->style) {
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
79 case FONT_STYLE_ANTIALIASED:
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
80 func = TTF_RenderUTF8_Blended;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
81 break;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
82 default:
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
83 func = TTF_RenderUTF8_Solid;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
84 break;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
85 }
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
86
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
87 if (!(surface = func(font->handle, text, fg)))
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 159
diff changeset
88 return errorf("%s", SDL_GetError());
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
89
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
90 return texture_from_surface(tex, surface);
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 }
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
93 unsigned int
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
94 font_height(const struct font *font)
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
95 {
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
96 assert(font_ok(font));
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
97
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
98 return TTF_FontHeight(font->handle);
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
99 }
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
100
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
101 int
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
102 font_query(const struct font *font, const char *text, unsigned int *w, unsigned int *h)
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
103 {
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
104 assert(font_ok(font));
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
105 assert(text);
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
106
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
107 if (w)
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
108 *w = 0;
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
109 if (h)
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
110 *h = 0;
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
111
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
112 if (TTF_SizeUTF8(font->handle, text, (int *)w, (int *)h) != 0)
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 159
diff changeset
113 return errorf("%s", SDL_GetError());
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
114
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
115 return 0;
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
116 }
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
117
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 void
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
119 font_finish(struct font *font)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
121 assert(font);
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
122
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
123 if (font->handle)
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
124 TTF_CloseFont(font->handle);
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
125
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
126 memset(font, 0, sizeof (*font));
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 }