annotate libmlk-core/mlk/core/font.c @ 547:c7664b679a95

misc: remove error codes for now
author David Demelier <markand@malikania.fr>
date Mon, 06 Mar 2023 20:03:00 +0100
parents 338a4436e255
children 6271599928d4
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 *
445
773a082f0b91 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 437
diff changeset
4 * Copyright (c) 2020-2023 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"
423
63ebfa352ae1 core: use err.h in font
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
25 #include "err.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
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
31 mlk_font_open(struct mlk_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)))
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 521
diff changeset
37 return mlk_errf("%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
521
338a4436e255 core: doxygenize font
David Demelier <markand@malikania.fr>
parents: 501
diff changeset
43 mlk_font_openmem(struct mlk_font *font,
338a4436e255 core: doxygenize font
David Demelier <markand@malikania.fr>
parents: 501
diff changeset
44 const void *buffer,
338a4436e255 core: doxygenize font
David Demelier <markand@malikania.fr>
parents: 501
diff changeset
45 size_t buflen,
338a4436e255 core: doxygenize font
David Demelier <markand@malikania.fr>
parents: 501
diff changeset
46 unsigned int size)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 {
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
48 assert(font);
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
49 assert(buffer);
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
50
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 SDL_RWops *ops;
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
53 if (!(ops = SDL_RWFromConstMem(buffer, buflen)) ||
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
54 (!(font->handle = TTF_OpenFontRW(ops, 1, size))))
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 521
diff changeset
55 return mlk_errf("%s", SDL_GetError());
339
979960e65f76 js: add font bindings
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
56
979960e65f76 js: add font bindings
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
57 return 0;
979960e65f76 js: add font bindings
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
58 }
979960e65f76 js: add font bindings
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
59
979960e65f76 js: add font bindings
David Demelier <markand@malikania.fr>
parents: 320
diff changeset
60 int
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
61 mlk_font_ok(const struct mlk_font *font)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 {
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
63 return font && font->handle;
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
64 }
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
65
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
66 int
472
bc5483849614 core: texture -> mlk_texture
David Demelier <markand@malikania.fr>
parents: 461
diff changeset
67 mlk_font_render(struct mlk_font *font, struct mlk_texture *tex, const char *text, unsigned long color)
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
68 {
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
69 assert(mlk_font_ok(font));
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 assert(text);
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 SDL_Color fg = {
461
d7874f11565f core: color -> mlk_color
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
73 .r = MLK_COLOR_R(color),
d7874f11565f core: color -> mlk_color
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
74 .g = MLK_COLOR_G(color),
d7874f11565f core: color -> mlk_color
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
75 .b = MLK_COLOR_B(color),
d7874f11565f core: color -> mlk_color
David Demelier <markand@malikania.fr>
parents: 451
diff changeset
76 .a = MLK_COLOR_A(color)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 };
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
78 SDL_Surface *surface;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
79 SDL_Surface *(*func)(TTF_Font *, const char *, SDL_Color);
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
81 switch (font->style) {
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
82 case MLK_FONT_STYLE_ANTIALIASED:
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
83 func = TTF_RenderUTF8_Blended;
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 default:
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
86 func = TTF_RenderUTF8_Solid;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
87 break;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
88 }
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 if (!(surface = func(font->handle, text, fg)))
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 521
diff changeset
91 return mlk_errf("%s", SDL_GetError());
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
92
501
23559c7ccf47 core: make sure everything start with mlk
David Demelier <markand@malikania.fr>
parents: 486
diff changeset
93 return mlk__texture_from_surface(tex, surface);
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 }
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
96 unsigned int
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
97 mlk_font_height(const struct mlk_font *font)
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
98 {
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
99 assert(mlk_font_ok(font));
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
100
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
101 return TTF_FontHeight(font->handle);
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
102 }
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
103
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
104 int
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
105 mlk_font_query(const struct mlk_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
106 {
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
107 assert(mlk_font_ok(font));
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
108 assert(text);
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
109
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
110 if (w)
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
111 *w = 0;
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
112 if (h)
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
113 *h = 0;
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
114
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
115 if (TTF_SizeUTF8(font->handle, text, (int *)w, (int *)h) != 0)
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 521
diff changeset
116 return mlk_errf("%s", SDL_GetError());
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
117
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
118 return 0;
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
119 }
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
120
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 void
451
90a097b1aa0f core: font -> mlk_font
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
122 mlk_font_finish(struct mlk_font *font)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
124 assert(font);
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
125
521
338a4436e255 core: doxygenize font
David Demelier <markand@malikania.fr>
parents: 501
diff changeset
126 if (font->handle) {
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
127 TTF_CloseFont(font->handle);
521
338a4436e255 core: doxygenize font
David Demelier <markand@malikania.fr>
parents: 501
diff changeset
128 font->handle = NULL;
338a4436e255 core: doxygenize font
David Demelier <markand@malikania.fr>
parents: 501
diff changeset
129 }
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }