0
|
1 /* ============================================================================
|
|
2 * Freetype GL - A C OpenGL Freetype engine
|
|
3 * Platform: Any
|
|
4 * WWW: http://code.google.com/p/freetype-gl/
|
|
5 * ----------------------------------------------------------------------------
|
|
6 * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved.
|
|
7 *
|
|
8 * Redistribution and use in source and binary forms, with or without
|
|
9 * modification, are permitted provided that the following conditions are met:
|
|
10 *
|
|
11 * 1. Redistributions of source code must retain the above copyright notice,
|
|
12 * this list of conditions and the following disclaimer.
|
|
13 *
|
|
14 * 2. Redistributions in binary form must reproduce the above copyright
|
|
15 * notice, this list of conditions and the following disclaimer in the
|
|
16 * documentation and/or other materials provided with the distribution.
|
|
17 *
|
|
18 * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR
|
|
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
21 * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28 *
|
|
29 * The views and conclusions contained in the software and documentation are
|
|
30 * those of the authors and should not be interpreted as representing official
|
|
31 * policies, either expressed or implied, of Nicolas P. Rougier.
|
|
32 * ============================================================================
|
|
33 */
|
|
34 #ifndef __TEXTURE_FONT_H__
|
|
35 #define __TEXTURE_FONT_H__
|
|
36
|
|
37 #include <stdlib.h>
|
|
38
|
|
39 #ifdef __cplusplus
|
|
40 extern "C" {
|
|
41 #endif
|
|
42
|
|
43 #include "vector.h"
|
|
44 #include "texture-atlas.h"
|
|
45
|
|
46 /**
|
|
47 * @file texture-font.h
|
|
48 * @author Nicolas Rougier (Nicolas.Rougier@inria.fr)
|
|
49 *
|
|
50 * @defgroup texture-font Texture font
|
|
51 *
|
|
52 * Texture font.
|
|
53 *
|
|
54 * Example Usage:
|
|
55 * @code
|
|
56 * #include "texture-font.h"
|
|
57 *
|
|
58 * int main( int arrgc, char *argv[] )
|
|
59 * {
|
|
60 * return 0;
|
|
61 * }
|
|
62 * @endcode
|
|
63 *
|
|
64 * @{
|
|
65 */
|
|
66
|
|
67
|
|
68
|
|
69 /**
|
|
70 * A structure that hold a kerning value relatively to a charcode.
|
|
71 *
|
|
72 * This structure cannot be used alone since the (necessary) right charcode is
|
|
73 * implicitely held by the owner of this structure.
|
|
74 */
|
|
75 typedef struct
|
|
76 {
|
|
77 /**
|
|
78 * Left character code in the kern pair.
|
|
79 */
|
|
80 wchar_t charcode;
|
|
81
|
|
82 /**
|
|
83 * Kerning value (in fractional pixels).
|
|
84 */
|
|
85 float kerning;
|
|
86
|
|
87 } kerning_t;
|
|
88
|
|
89
|
|
90
|
|
91
|
|
92 /*
|
|
93 * Glyph metrics:
|
|
94 * --------------
|
|
95 *
|
|
96 * xmin xmax
|
|
97 * | |
|
|
98 * |<-------- width -------->|
|
|
99 * | |
|
|
100 * | +-------------------------+----------------- ymax
|
|
101 * | | ggggggggg ggggg | ^ ^
|
|
102 * | | g:::::::::ggg::::g | | |
|
|
103 * | | g:::::::::::::::::g | | |
|
|
104 * | | g::::::ggggg::::::gg | | |
|
|
105 * | | g:::::g g:::::g | | |
|
|
106 * offset_x -|-------->| g:::::g g:::::g | offset_y |
|
|
107 * | | g:::::g g:::::g | | |
|
|
108 * | | g::::::g g:::::g | | |
|
|
109 * | | g:::::::ggggg:::::g | | |
|
|
110 * | | g::::::::::::::::g | | height
|
|
111 * | | gg::::::::::::::g | | |
|
|
112 * baseline ---*---------|---- gggggggg::::::g-----*-------- |
|
|
113 * / | | g:::::g | |
|
|
114 * origin | | gggggg g:::::g | |
|
|
115 * | | g:::::gg gg:::::g | |
|
|
116 * | | g::::::ggg:::::::g | |
|
|
117 * | | gg:::::::::::::g | |
|
|
118 * | | ggg::::::ggg | |
|
|
119 * | | gggggg | v
|
|
120 * | +-------------------------+----------------- ymin
|
|
121 * | |
|
|
122 * |------------- advance_x ---------->|
|
|
123 */
|
|
124
|
|
125 /**
|
|
126 * A structure that describe a glyph.
|
|
127 */
|
|
128 typedef struct
|
|
129 {
|
|
130 /**
|
|
131 * Wide character this glyph represents
|
|
132 */
|
|
133 wchar_t charcode;
|
|
134
|
|
135 /**
|
|
136 * Glyph id (used for display lists)
|
|
137 */
|
|
138 unsigned int id;
|
|
139
|
|
140 /**
|
|
141 * Glyph's width in pixels.
|
|
142 */
|
|
143 size_t width;
|
|
144
|
|
145 /**
|
|
146 * Glyph's height in pixels.
|
|
147 */
|
|
148 size_t height;
|
|
149
|
|
150 /**
|
|
151 * Glyph's left bearing expressed in integer pixels.
|
|
152 */
|
|
153 int offset_x;
|
|
154
|
|
155 /**
|
|
156 * Glyphs's top bearing expressed in integer pixels.
|
|
157 *
|
|
158 * Remember that this is the distance from the baseline to the top-most
|
|
159 * glyph scanline, upwards y coordinates being positive.
|
|
160 */
|
|
161 int offset_y;
|
|
162
|
|
163 /**
|
|
164 * For horizontal text layouts, this is the horizontal distance (in
|
|
165 * fractional pixels) used to increment the pen position when the glyph is
|
|
166 * drawn as part of a string of text.
|
|
167 */
|
|
168 float advance_x;
|
|
169
|
|
170 /**
|
|
171 * For vertical text layouts, this is the vertical distance (in fractional
|
|
172 * pixels) used to increment the pen position when the glyph is drawn as
|
|
173 * part of a string of text.
|
|
174 */
|
|
175 float advance_y;
|
|
176
|
|
177 /**
|
|
178 * First normalized texture coordinate (x) of top-left corner
|
|
179 */
|
|
180 float s0;
|
|
181
|
|
182 /**
|
|
183 * Second normalized texture coordinate (y) of top-left corner
|
|
184 */
|
|
185 float t0;
|
|
186
|
|
187 /**
|
|
188 * First normalized texture coordinate (x) of bottom-right corner
|
|
189 */
|
|
190 float s1;
|
|
191
|
|
192 /**
|
|
193 * Second normalized texture coordinate (y) of bottom-right corner
|
|
194 */
|
|
195 float t1;
|
|
196
|
|
197 /**
|
|
198 * A vector of kerning pairs relative to this glyph.
|
|
199 */
|
|
200 vector_t * kerning;
|
|
201
|
|
202 /**
|
|
203 * Glyph outline type (0 = None, 1 = line, 2 = inner, 3 = outer)
|
|
204 */
|
|
205 int outline_type;
|
|
206
|
|
207 /**
|
|
208 * Glyph outline thickness
|
|
209 */
|
|
210 float outline_thickness;
|
|
211
|
|
212 } texture_glyph_t;
|
|
213
|
|
214
|
|
215
|
|
216 /**
|
|
217 * Texture font structure.
|
|
218 */
|
|
219 typedef struct
|
|
220 {
|
|
221 /**
|
|
222 * Vector of glyphs contained in this font.
|
|
223 */
|
|
224 vector_t * glyphs;
|
|
225
|
|
226 /**
|
|
227 * Atlas structure to store glyphs data.
|
|
228 */
|
|
229 texture_atlas_t * atlas;
|
|
230
|
|
231 /**
|
|
232 * Font filename
|
|
233 */
|
|
234 char * filename;
|
|
235
|
|
236 /**
|
|
237 * Font size
|
|
238 */
|
|
239 float size;
|
|
240
|
|
241 /**
|
|
242 * Whether to use autohint when rendering font
|
|
243 */
|
|
244 int hinting;
|
|
245
|
|
246 /**
|
|
247 * Outline type (0 = None, 1 = line, 2 = inner, 3 = outer)
|
|
248 */
|
|
249 int outline_type;
|
|
250
|
|
251 /**
|
|
252 * Outline thickness
|
|
253 */
|
|
254 float outline_thickness;
|
|
255
|
|
256 /**
|
|
257 * Whether to use our own lcd filter.
|
|
258 */
|
|
259 int filtering;
|
|
260
|
|
261 /**
|
|
262 * Whether to use kerning if available
|
|
263 */
|
|
264 int kerning;
|
|
265
|
|
266 /**
|
|
267 * LCD filter weights
|
|
268 */
|
|
269 unsigned char lcd_weights[5];
|
|
270
|
|
271 /**
|
|
272 * This field is simply used to compute a default line spacing (i.e., the
|
|
273 * baseline-to-baseline distance) when writing text with this font. Note
|
|
274 * that it usually is larger than the sum of the ascender and descender
|
|
275 * taken as absolute values. There is also no guarantee that no glyphs
|
|
276 * extend above or below subsequent baselines when using this distance.
|
|
277 */
|
|
278 float height;
|
|
279
|
|
280 /**
|
|
281 * This field is the distance that must be placed between two lines of
|
|
282 * text. The baseline-to-baseline distance should be computed as:
|
|
283 * ascender - descender + linegap
|
|
284 */
|
|
285 float linegap;
|
|
286
|
|
287 /**
|
|
288 * The ascender is the vertical distance from the horizontal baseline to
|
|
289 * the highest 'character' coordinate in a font face. Unfortunately, font
|
|
290 * formats define the ascender differently. For some, it represents the
|
|
291 * ascent of all capital latin characters (without accents), for others it
|
|
292 * is the ascent of the highest accented character, and finally, other
|
|
293 * formats define it as being equal to bbox.yMax.
|
|
294 */
|
|
295 float ascender;
|
|
296
|
|
297 /**
|
|
298 * The descender is the vertical distance from the horizontal baseline to
|
|
299 * the lowest 'character' coordinate in a font face. Unfortunately, font
|
|
300 * formats define the descender differently. For some, it represents the
|
|
301 * descent of all capital latin characters (without accents), for others it
|
|
302 * is the ascent of the lowest accented character, and finally, other
|
|
303 * formats define it as being equal to bbox.yMin. This field is negative
|
|
304 * for values below the baseline.
|
|
305 */
|
|
306 float descender;
|
|
307
|
|
308 /**
|
|
309 * The position of the underline line for this face. It is the center of
|
|
310 * the underlining stem. Only relevant for scalable formats.
|
|
311 */
|
|
312 float underline_position;
|
|
313
|
|
314 /**
|
|
315 * The thickness of the underline for this face. Only relevant for scalable
|
|
316 * formats.
|
|
317 */
|
|
318 float underline_thickness;
|
|
319
|
|
320 } texture_font_t;
|
|
321
|
|
322
|
|
323
|
|
324 /**
|
|
325 * This function creates a new texture font from given filename and size. The
|
|
326 * texture atlas is used to store glyph on demand. Note the depth of the atlas
|
|
327 * will determine if the font is rendered as alpha channel only (depth = 1) or
|
|
328 * RGB (depth = 3) that correspond to subpixel rendering (if available on your
|
|
329 * freetype implementation).
|
|
330 *
|
|
331 * @param atlas A texture atlas
|
|
332 * @param filename A font filename
|
|
333 * @param size Size of font to be created (in points)
|
|
334 *
|
|
335 * @return A new empty font (no glyph inside yet)
|
|
336 *
|
|
337 */
|
|
338 texture_font_t *
|
|
339 texture_font_new( texture_atlas_t * atlas,
|
|
340 const char * filename,
|
|
341 const float size );
|
|
342
|
|
343
|
|
344 /**
|
|
345 * Delete a texture font. Note that this does not delete the glyph from the
|
|
346 * texture atlas.
|
|
347 *
|
|
348 * @param self a valid texture font
|
|
349 */
|
|
350 void
|
|
351 texture_font_delete( texture_font_t * self );
|
|
352
|
|
353
|
|
354 /**
|
|
355 * Request a new glyph from the font. If it has not been created yet, it will
|
|
356 * be.
|
|
357 *
|
|
358 * @param self A valid texture font
|
|
359 * @param charcode Character codepoint to be loaded.
|
|
360 *
|
|
361 * @return A pointer on the new glyph or 0 if the texture atlas is not big
|
|
362 * enough
|
|
363 *
|
|
364 */
|
|
365 texture_glyph_t *
|
|
366 texture_font_get_glyph( texture_font_t * self,
|
|
367 wchar_t charcode );
|
|
368
|
|
369
|
|
370 /**
|
|
371 * Request the loading of several glyphs at once.
|
|
372 *
|
|
373 * @param self a valid texture font
|
|
374 * @param charcodes character codepoints to be loaded.
|
|
375 *
|
|
376 * @return Number of missed glyph if the texture is not big enough to hold
|
|
377 * every glyphs.
|
|
378 */
|
|
379 size_t
|
|
380 texture_font_load_glyphs( texture_font_t * self,
|
|
381 const wchar_t * charcodes );
|
|
382
|
|
383 /**
|
|
384 * Get the kerning between two horizontal glyphs.
|
|
385 *
|
|
386 * @param self a valid texture glyph
|
|
387 * @param charcode codepoint of the peceding glyph
|
|
388 *
|
|
389 * @return x kerning value
|
|
390 */
|
|
391 float
|
|
392 texture_glyph_get_kerning( const texture_glyph_t * self,
|
|
393 const wchar_t charcode );
|
|
394
|
|
395
|
|
396 /**
|
|
397 * Creates a new empty glyph
|
|
398 *
|
|
399 * @return a new empty glyph (not valid)
|
|
400 */
|
|
401 texture_glyph_t *
|
|
402 texture_glyph_new( void );
|
|
403
|
|
404 /** @} */
|
|
405
|
|
406
|
|
407 #ifdef __cplusplus
|
|
408 }
|
|
409 #endif
|
|
410
|
|
411 #endif /* __TEXTURE_FONT_H__ */
|
|
412
|