annotate libmlk-core/core/font.c @ 290:9948e288925b

rpg: add support for items in battle
author David Demelier <markand@malikania.fr>
date Fri, 08 Jan 2021 12:56:10 +0100
parents 71b3b7036de7
children 196264679079
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 *
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
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
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
30 bool
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
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
39 return true;
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
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
42 bool
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)) ||
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
51 (!(font->handle = TTF_OpenFontRW(ops, true, 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
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
54 return true;
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
154
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
57 void
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
58 font_shallow(struct font *dst, const struct font *src)
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
59 {
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
60 assert(dst);
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
61 assert(src);
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
62
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
63 memcpy(dst, src, sizeof (*src));
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
64 }
2252f9efac9a ui: remove style from debug_report, closes #2499
David Demelier <markand@malikania.fr>
parents: 144
diff changeset
65
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
66 bool
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
67 font_ok(const struct font *font)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 {
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
69 return font && font->handle;
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
70 }
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
71
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
72 bool
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
73 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
74 {
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
75 assert(font_ok(font));
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 assert(text);
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 SDL_Color fg = {
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
79 .r = COLOR_R(color),
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
80 .g = COLOR_G(color),
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
81 .b = COLOR_B(color),
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 169
diff changeset
82 .a = COLOR_A(color)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 };
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
84 SDL_Surface *surface;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
85 SDL_Surface *(*func)(TTF_Font *, const char *, SDL_Color);
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
87 switch (font->style) {
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
88 case FONT_STYLE_ANTIALIASED:
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
89 func = TTF_RenderUTF8_Blended;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
90 break;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
91 default:
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
92 func = TTF_RenderUTF8_Solid;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
93 break;
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
94 }
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
95
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
96 if (!(surface = func(font->handle, text, fg)))
169
eb0a7ab71023 misc: extreme cleanup, closes #2506
David Demelier <markand@malikania.fr>
parents: 159
diff changeset
97 return errorf("%s", SDL_GetError());
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
98
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
99 return texture_from_surface(tex, surface);
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 }
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
102 unsigned int
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
103 font_height(const struct font *font)
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
104 {
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
105 assert(font_ok(font));
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
106
79
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
107 return TTF_FontHeight(font->handle);
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
108 }
8f95462ac5f8 core: create a debugging API, closes #2469 @2h
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
109
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
110 bool
159
e05a792f6910 ui: make message less clever and provide spacing field
David Demelier <markand@malikania.fr>
parents: 154
diff changeset
111 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
112 {
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
113 assert(font_ok(font));
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
114 assert(text);
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
115
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
116 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
117 return errorf("%s", SDL_GetError());
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
118
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
119 return true;
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
120 }
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
121
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 void
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
123 font_finish(struct font *font)
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 {
39
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
125 assert(font);
9d1421c09dfb core: add more utilities to improve code simplicity
David Demelier <markand@malikania.fr>
parents: 11
diff changeset
126
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
127 if (font->handle)
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 79
diff changeset
128 TTF_CloseFont(font->handle);
144
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
129
28d9bb62fcb1 core: add font_box function, closes #2495
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
130 memset(font, 0, sizeof (*font));
10
c91c3272101b core: implement fonts, closes #2444
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 }