forked from libretro/RetroArch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfont_driver.h
201 lines (162 loc) · 5.66 KB
/
font_driver.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2017 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __FONT_DRIVER_H__
#define __FONT_DRIVER_H__
#include <stdint.h>
#include <boolean.h>
#include <retro_common_api.h>
#include "../retroarch.h"
#include "video_defines.h"
RETRO_BEGIN_DECLS
/* All coordinates and offsets are top-left oriented.
*
* This is a texture-atlas approach which allows text to
* be drawn in a single draw call.
*
* It is up to the code using this interface to actually
* generate proper vertex buffers and upload the atlas texture to GPU. */
struct font_glyph
{
unsigned width;
unsigned height;
/* Texel coordinate offset for top-left pixel of this glyph. */
unsigned atlas_offset_x;
unsigned atlas_offset_y;
/* When drawing this glyph, apply an offset to
* current X/Y draw coordinate. */
int draw_offset_x;
int draw_offset_y;
/* Advance X/Y draw coordinates after drawing this glyph. */
int advance_x;
int advance_y;
};
struct font_atlas
{
uint8_t *buffer; /* Alpha channel. */
unsigned width;
unsigned height;
bool dirty;
};
struct font_params
{
float x;
float y;
float scale;
/* Drop shadow color multiplier. */
float drop_mod;
/* Drop shadow offset.
* If both are 0, no drop shadow will be rendered. */
int drop_x, drop_y;
/* Drop shadow alpha */
float drop_alpha;
/* ABGR. Use the macros. */
uint32_t color;
bool full_screen;
enum text_alignment text_align;
};
struct font_line_metrics
{
float height;
float ascender;
float descender;
};
typedef struct font_renderer
{
void *(*init)(void *data, const char *font_path,
float font_size, bool is_threaded);
void (*free)(void *data, bool is_threaded);
void (*render_msg)(void *userdata,
void *data, const char *msg,
const struct font_params *params);
const char *ident;
const struct font_glyph *(*get_glyph)(void *data, uint32_t code);
void (*bind_block)(void *data, void *block);
void (*flush)(unsigned width, unsigned height, void *data);
int (*get_message_width)(void *data, const char *msg, unsigned msg_len_full, float scale);
bool (*get_line_metrics)(void* data, struct font_line_metrics **metrics);
} font_renderer_t;
typedef struct font_renderer_driver
{
void *(*init)(const char *font_path, float font_size);
struct font_atlas *(*get_atlas)(void *data);
/* Returns NULL if no glyph for this code is found. */
const struct font_glyph *(*get_glyph)(void *data, uint32_t code);
void (*free)(void *data);
const char *(*get_default_font)(void);
const char *ident;
bool (*get_line_metrics)(void* data, struct font_line_metrics **metrics);
} font_renderer_driver_t;
typedef struct
{
const font_renderer_t *renderer;
void *renderer_data;
float size;
} font_data_t;
/* font_path can be NULL for default font. */
int font_renderer_create_default(
const font_renderer_driver_t **drv,
void **handle,
const char *font_path, unsigned font_size);
void font_driver_render_msg(void *data,
const char *msg, const void *params, void *font_data);
void font_driver_bind_block(void *font_data, void *block);
int font_driver_get_message_width(void *font_data, const char *msg, unsigned len, float scale);
void font_driver_flush(unsigned width, unsigned height, void *font_data);
void font_driver_free(void *font_data);
font_data_t *font_driver_init_first(
void *video_data,
const char *font_path,
float font_size,
bool threading_hint,
bool is_threaded,
enum font_driver_render_api api);
void font_driver_init_osd(
void *video_data,
const void *video_info_data,
bool threading_hint,
bool is_threaded,
enum font_driver_render_api api);
void font_driver_free_osd(void);
int font_driver_get_line_height(void *font_data, float scale);
int font_driver_get_line_ascender(void *font_data, float scale);
int font_driver_get_line_descender(void *font_data, float scale);
int font_driver_get_line_centre_offset(void *font_data, float scale);
extern font_renderer_t gl_raster_font;
extern font_renderer_t gl_core_raster_font;
extern font_renderer_t gl1_raster_font;
extern font_renderer_t d3d_xdk1_font;
extern font_renderer_t d3d_win32_font;
extern font_renderer_t ps2_font;
extern font_renderer_t vita2d_vita_font;
extern font_renderer_t ctr_font;
extern font_renderer_t wiiu_font;
extern font_renderer_t vulkan_raster_font;
extern font_renderer_t metal_raster_font;
extern font_renderer_t d3d10_font;
extern font_renderer_t d3d11_font;
extern font_renderer_t d3d12_font;
extern font_renderer_t caca_font;
extern font_renderer_t gdi_font;
extern font_renderer_t vga_font;
extern font_renderer_t sixel_font;
extern font_renderer_t switch_font;
extern font_renderer_driver_t stb_font_renderer;
extern font_renderer_driver_t stb_unicode_font_renderer;
extern font_renderer_driver_t freetype_font_renderer;
extern font_renderer_driver_t coretext_font_renderer;
extern font_renderer_driver_t bitmap_font_renderer;
RETRO_END_DECLS
#endif