annotate src/texture-font.c @ 0:785057719d9b

Import.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 05 Aug 2013 12:25:43 +0300
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /* ===========================================================================
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * Freetype GL - A C OpenGL Freetype engine
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * Platform: Any
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 * WWW: http://code.google.com/p/freetype-gl/
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 * ----------------------------------------------------------------------------
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 * Copyright 2011,2012 Nicolas P. Rougier. All rights reserved.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 * Redistribution and use in source and binary forms, with or without
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9 * modification, are permitted provided that the following conditions are met:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11 * 1. Redistributions of source code must retain the above copyright notice,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12 * this list of conditions and the following disclaimer.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14 * 2. Redistributions in binary form must reproduce the above copyright
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
15 * notice, this list of conditions and the following disclaimer in the
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
16 * documentation and/or other materials provided with the distribution.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
17 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
18 * THIS SOFTWARE IS PROVIDED BY NICOLAS P. ROUGIER ''AS IS'' AND ANY EXPRESS OR
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
20 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
21 * EVENT SHALL NICOLAS P. ROUGIER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
28 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
29 * The views and conclusions contained in the software and documentation are
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
30 * those of the authors and should not be interpreted as representing official
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
31 * policies, either expressed or implied, of Nicolas P. Rougier.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
32 * ============================================================================
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
33 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
34 #include <ft2build.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
35 #include FT_FREETYPE_H
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 #include FT_STROKER_H
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
37 // #include FT_ADVANCES_H
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
38 #include FT_LCD_FILTER_H
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
39 #include <stdint.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
40 #include <stdlib.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
41 #include <stdio.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
42 #include <assert.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
43 #include <math.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
44 #include <wchar.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
45 #include "platform.h"
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
46 #include "texture-font.h"
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
47
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
48 #undef __FTERRORS_H__
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
49 #define FT_ERRORDEF( e, v, s ) { e, s },
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
50 #define FT_ERROR_START_LIST {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
51 #define FT_ERROR_END_LIST { 0, 0 } };
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
52 const struct {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
53 int code;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
54 const char* message;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
55 } FT_Errors[] =
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
56 #include FT_ERRORS_H
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
57
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
58
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
59
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
60
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
61 // ------------------------------------------------- texture_font_load_face ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
62 int
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
63 texture_font_load_face( FT_Library * library,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64 const char * filename,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
65 const float size,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
66 FT_Face * face )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
67 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
68 size_t hres = 64;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
69 FT_Error error;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
70 FT_Matrix matrix = { (int)((1.0/hres) * 0x10000L),
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
71 (int)((0.0) * 0x10000L),
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
72 (int)((0.0) * 0x10000L),
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
73 (int)((1.0) * 0x10000L) };
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
74
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
75 assert( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
76 assert( filename );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
77 assert( size );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
78
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
79 /* Initialize library */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
80 error = FT_Init_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
81 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
82 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
83 fprintf(stderr, "FT_Error (0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
84 FT_Errors[error].code, FT_Errors[error].message);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
85 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
86 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
87
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
88 /* Load face */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
89 error = FT_New_Face( *library, filename, 0, face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
90 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
91 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
92 fprintf( stderr, "FT_Error (line %d, code 0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
93 __LINE__, FT_Errors[error].code, FT_Errors[error].message);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
94 FT_Done_FreeType( *library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
95 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
96 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
97
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
98 /* Select charmap */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
99 error = FT_Select_Charmap( *face, FT_ENCODING_UNICODE );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
100 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
101 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
102 fprintf( stderr, "FT_Error (line %d, code 0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
103 __LINE__, FT_Errors[error].code, FT_Errors[error].message );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
104 FT_Done_Face( *face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
105 FT_Done_FreeType( *library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
106 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
107 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
108
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
109 /* Set char size */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
110 error = FT_Set_Char_Size( *face, (int)(size*64), 0, 72*hres, 72 );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
111 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
112 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
113 fprintf( stderr, "FT_Error (line %d, code 0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
114 __LINE__, FT_Errors[error].code, FT_Errors[error].message );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
115 FT_Done_Face( *face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
116 FT_Done_FreeType( *library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
117 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
118 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
119
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
120 /* Set transform matrix */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
121 FT_Set_Transform( *face, &matrix, NULL );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
122
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
123 return 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
124 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
125
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
126
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
127 // ------------------------------------------------------ texture_glyph_new ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
128 texture_glyph_t *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
129 texture_glyph_new( void )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
130 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
131 texture_glyph_t *self = (texture_glyph_t *) malloc( sizeof(texture_glyph_t) );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
132 if( self == NULL)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
134 fprintf( stderr,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
135 "line %d: No more memory for allocating data\n", __LINE__ );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
136 exit( EXIT_FAILURE );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
137 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138 self->id = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139 self->width = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 self->height = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141 self->outline_type = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142 self->outline_thickness = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
143 self->offset_x = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
144 self->offset_y = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
145 self->advance_x = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146 self->advance_y = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
147 self->s0 = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
148 self->t0 = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
149 self->s1 = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
150 self->t1 = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
151 self->kerning = vector_new( sizeof(kerning_t) );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
152 return self;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
155
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
156 // --------------------------------------------------- texture_glyph_delete ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
157 void
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
158 texture_glyph_delete( texture_glyph_t *self )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
159 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
160 assert( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
161 vector_delete( self->kerning );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 free( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
163 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
164
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
165 // ---------------------------------------------- texture_glyph_get_kerning ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
166 float
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
167 texture_glyph_get_kerning( const texture_glyph_t * self,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
168 const wchar_t charcode )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
169 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
170 size_t i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
171
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
172 assert( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
173 for( i=0; i<vector_size(self->kerning); ++i )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
174 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
175 kerning_t * kerning = (kerning_t *) vector_get( self->kerning, i );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
176 if( kerning->charcode == charcode )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
178 return kerning->kerning;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
179 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
180 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
181 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
182 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
183
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
184
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
185 // ------------------------------------------ texture_font_generate_kerning ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
186 void
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
187 texture_font_generate_kerning( texture_font_t *self )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
188 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
189 size_t i, j;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
190 FT_Library library;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
191 FT_Face face;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
192 FT_UInt glyph_index, prev_index;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
193 texture_glyph_t *glyph, *prev_glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
194 FT_Vector kerning;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
195
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
196 assert( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
197
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
198 /* Load font */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
199 if( !texture_font_load_face( &library, self->filename, self->size, &face ) )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
200 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
201 return;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
202 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
203
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
204 /* For each glyph couple combination, check if kerning is necessary */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
205 /* Starts at index 1 since 0 is for the special backgroudn glyph */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
206 for( i=1; i<self->glyphs->size; ++i )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
207 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
208 glyph = *(texture_glyph_t **) vector_get( self->glyphs, i );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
209 glyph_index = FT_Get_Char_Index( face, glyph->charcode );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
210 vector_clear( glyph->kerning );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
211
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
212 for( j=1; j<self->glyphs->size; ++j )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
213 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
214 prev_glyph = *(texture_glyph_t **) vector_get( self->glyphs, j );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
215 prev_index = FT_Get_Char_Index( face, prev_glyph->charcode );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
216 FT_Get_Kerning( face, prev_index, glyph_index, FT_KERNING_UNFITTED, &kerning );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
217 // printf("%c(%d)-%c(%d): %ld\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218 // prev_glyph->charcode, prev_glyph->charcode,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
219 // glyph_index, glyph_index, kerning.x);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
220 if( kerning.x )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
221 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
222 // 64 * 64 because of 26.6 encoding AND the transform matrix used
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
223 // in texture_font_load_face (hres = 64)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
224 kerning_t k = {prev_glyph->charcode, kerning.x / (float)(64.0f*64.0f)};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
225 vector_push_back( glyph->kerning, &k );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
226 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
227 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
228 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
229 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
230 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
231 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
232
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
233
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
234 // ------------------------------------------------------- texture_font_new ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
235 texture_font_t *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
236 texture_font_new( texture_atlas_t * atlas,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
237 const char * filename,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
238 const float size)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
239 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
240 texture_font_t *self = (texture_font_t *) malloc( sizeof(texture_font_t) );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
241 FT_Library library;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
242 FT_Face face;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
243 FT_Size_Metrics metrics;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
244
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
245 assert( filename );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
246 assert( size );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
247
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
248 if( self == NULL)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
249 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
250 fprintf( stderr,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
251 "line %d: No more memory for allocating data\n", __LINE__ );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
252 exit( EXIT_FAILURE );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
253 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
254 self->glyphs = vector_new( sizeof(texture_glyph_t *) );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
255 self->atlas = atlas;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
256 self->height = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
257 self->ascender = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
258 self->descender = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
259 self->filename = strdup( filename );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
260 self->size = size;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
261 self->outline_type = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
262 self->outline_thickness = 0.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
263 self->hinting = 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
264 self->kerning = 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
265 self->filtering = 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
266 // FT_LCD_FILTER_LIGHT is (0x00, 0x55, 0x56, 0x55, 0x00)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 // FT_LCD_FILTER_DEFAULT is (0x10, 0x40, 0x70, 0x40, 0x10)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 self->lcd_weights[0] = 0x10;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269 self->lcd_weights[1] = 0x40;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
270 self->lcd_weights[2] = 0x70;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
271 self->lcd_weights[3] = 0x40;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
272 self->lcd_weights[4] = 0x10;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
273
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
274 /* Get font metrics at high resolution */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
275
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
276 if( !texture_font_load_face( &library, self->filename, self->size*100, &face ) )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
277 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
278 return self;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
279 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
280
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
281 // 64 * 64 because of 26.6 encoding AND the transform matrix used
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
282 // in texture_font_load_face (hres = 64)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
283 self->underline_position = face->underline_position / (float)(64.0f*64.0f) * self->size;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
284 self->underline_position = round( self->underline_position );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
285 if( self->underline_position > -2 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
286 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
287 self->underline_position = -2.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
288 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
289
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
290 self->underline_thickness = face->underline_thickness / (float)(64.0f*64.0f) * self->size;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
291 self->underline_thickness = round( self->underline_thickness );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
292 if( self->underline_thickness < 1 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
293 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
294 self->underline_thickness = 1.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
295 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
296
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
297 metrics = face->size->metrics;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
298 self->ascender = (metrics.ascender >> 6) / 100.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
299 self->descender = (metrics.descender >> 6) / 100.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
300 self->height = (metrics.height >> 6) / 100.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
301 self->linegap = self->height - self->ascender + self->descender;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
302 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
303 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
304
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
305 /* -1 is a special glyph */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
306 texture_font_get_glyph( self, -1 );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
307
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
308 return self;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
309 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
310
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
311
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
312 // ---------------------------------------------------- texture_font_delete ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
313 void
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
314 texture_font_delete( texture_font_t *self )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
315 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
316 size_t i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
317 texture_glyph_t *glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
318
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
319 assert( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
320
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
321 if( self->filename )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
322 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
323 free( self->filename );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
324 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
325
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
326
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
327 for( i=0; i<vector_size( self->glyphs ); ++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
328 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
329 glyph = *(texture_glyph_t **) vector_get( self->glyphs, i );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
330 texture_glyph_delete( glyph);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
331 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
332
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
333 vector_delete( self->glyphs );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
334 free( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
335 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
336
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
337
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
338 // ----------------------------------------------- texture_font_load_glyphs ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
339 size_t
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
340 texture_font_load_glyphs( texture_font_t * self,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
341 const wchar_t * charcodes )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
342 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
343 size_t i, x, y, width, height, depth, w, h;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
344 FT_Library library;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
345 FT_Error error;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
346 FT_Face face;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
347 FT_Glyph ft_glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
348 FT_GlyphSlot slot;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
349 FT_Bitmap ft_bitmap;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
350
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
351 FT_UInt glyph_index;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
352 texture_glyph_t *glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
353 ivec4 region;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
354 size_t missed = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
355
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
356 assert( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
357 assert( charcodes );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
358
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
359
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
360 width = self->atlas->width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
361 height = self->atlas->height;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
362 depth = self->atlas->depth;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
363
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
364 if( !texture_font_load_face( &library, self->filename, self->size, &face ) )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
365 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
366 return wcslen(charcodes);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
367 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
368
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
369 /* Load each glyph */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
370 for( i=0; i<wcslen(charcodes); ++i )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
371 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
372 FT_Int32 flags = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
373 int ft_bitmap_width = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
374 int ft_bitmap_rows = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
375 int ft_bitmap_pitch = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
376 int ft_glyph_top = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
377 int ft_glyph_left = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
378 glyph_index = FT_Get_Char_Index( face, charcodes[i] );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
379 // WARNING: We use texture-atlas depth to guess if user wants
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
380 // LCD subpixel rendering
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
381
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
382 if( self->outline_type > 0 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
383 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
384 flags |= FT_LOAD_NO_BITMAP;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
385 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
386 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
387 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
388 flags |= FT_LOAD_RENDER;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
389 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
390
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
391 if( !self->hinting )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
392 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
393 flags |= FT_LOAD_NO_HINTING | FT_LOAD_NO_AUTOHINT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
394 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
395 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
396 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
397 flags |= FT_LOAD_FORCE_AUTOHINT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
398 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
399
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
400
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
401 if( depth == 3 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
402 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
403 FT_Library_SetLcdFilter( library, FT_LCD_FILTER_LIGHT );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
404 flags |= FT_LOAD_TARGET_LCD;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
405 if( self->filtering )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
406 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
407 FT_Library_SetLcdFilterWeights( library, self->lcd_weights );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
408 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
409 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
410 error = FT_Load_Glyph( face, glyph_index, flags );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
411 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
412 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
413 fprintf( stderr, "FT_Error (line %d, code 0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
414 __LINE__, FT_Errors[error].code, FT_Errors[error].message );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
415 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
416 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
417 return wcslen(charcodes)-i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
418 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
419
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
420
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
421 if( self->outline_type == 0 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
422 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
423 slot = face->glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
424 ft_bitmap = slot->bitmap;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
425 ft_bitmap_width = slot->bitmap.width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
426 ft_bitmap_rows = slot->bitmap.rows;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
427 ft_bitmap_pitch = slot->bitmap.pitch;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
428 ft_glyph_top = slot->bitmap_top;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
429 ft_glyph_left = slot->bitmap_left;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
430 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
431 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
432 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
433 FT_Stroker stroker;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
434 FT_BitmapGlyph ft_bitmap_glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
435 error = FT_Stroker_New( library, &stroker );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
436 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
437 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
438 fprintf(stderr, "FT_Error (0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
439 FT_Errors[error].code, FT_Errors[error].message);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
440 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
441 FT_Stroker_Done( stroker );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
442 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
443 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
444 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
445 FT_Stroker_Set( stroker,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
446 (int)(self->outline_thickness *64),
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
447 FT_STROKER_LINECAP_ROUND,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
448 FT_STROKER_LINEJOIN_ROUND,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
449 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
450 error = FT_Get_Glyph( face->glyph, &ft_glyph);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
451 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
452 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
453 fprintf(stderr, "FT_Error (0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
454 FT_Errors[error].code, FT_Errors[error].message);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
455 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
456 FT_Stroker_Done( stroker );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
457 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
458 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
459 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
460
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
461 if( self->outline_type == 1 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
462 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
463 error = FT_Glyph_Stroke( &ft_glyph, stroker, 1 );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
464 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
465 else if ( self->outline_type == 2 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
466 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
467 error = FT_Glyph_StrokeBorder( &ft_glyph, stroker, 0, 1 );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
468 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
469 else if ( self->outline_type == 3 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
470 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
471 error = FT_Glyph_StrokeBorder( &ft_glyph, stroker, 1, 1 );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
472 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
473 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
474 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
475 fprintf(stderr, "FT_Error (0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
476 FT_Errors[error].code, FT_Errors[error].message);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
477 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
478 FT_Stroker_Done( stroker );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
479 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
480 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
481 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
482
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
483 if( depth == 1)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
484 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
485 error = FT_Glyph_To_Bitmap( &ft_glyph, FT_RENDER_MODE_NORMAL, 0, 1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
486 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
487 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
488 fprintf(stderr, "FT_Error (0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
489 FT_Errors[error].code, FT_Errors[error].message);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
490 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
491 FT_Stroker_Done( stroker );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
492 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
493 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
494 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
495 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
496 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
497 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
498 error = FT_Glyph_To_Bitmap( &ft_glyph, FT_RENDER_MODE_LCD, 0, 1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
499 if( error )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
500 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
501 fprintf(stderr, "FT_Error (0x%02x) : %s\n",
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
502 FT_Errors[error].code, FT_Errors[error].message);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
503 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
504 FT_Stroker_Done( stroker );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
505 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
506 return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
507 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
508 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
509 ft_bitmap_glyph = (FT_BitmapGlyph) ft_glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
510 ft_bitmap = ft_bitmap_glyph->bitmap;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
511 ft_bitmap_width = ft_bitmap.width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
512 ft_bitmap_rows = ft_bitmap.rows;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
513 ft_bitmap_pitch = ft_bitmap.pitch;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
514 ft_glyph_top = ft_bitmap_glyph->top;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
515 ft_glyph_left = ft_bitmap_glyph->left;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
516 FT_Stroker_Done(stroker);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
517 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
518
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
519
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
520 // We want each glyph to be separated by at least one black pixel
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
521 // (for example for shader used in demo-subpixel.c)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
522 w = ft_bitmap_width/depth + 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
523 h = ft_bitmap_rows + 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
524 region = texture_atlas_get_region( self->atlas, w, h );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
525 if ( region.x < 0 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
526 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
527 missed++;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
528 fprintf( stderr, "Texture atlas is full (line %d)\n", __LINE__ );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
529 continue;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
530 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
531 w = w - 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
532 h = h - 1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
533 x = region.x;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
534 y = region.y;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
535 texture_atlas_set_region( self->atlas, x, y, w, h,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
536 ft_bitmap.buffer, ft_bitmap.pitch );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
537
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
538 glyph = texture_glyph_new( );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
539 glyph->charcode = charcodes[i];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
540 glyph->width = w;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
541 glyph->height = h;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
542 glyph->outline_type = self->outline_type;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
543 glyph->outline_thickness = self->outline_thickness;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
544 glyph->offset_x = ft_glyph_left;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
545 glyph->offset_y = ft_glyph_top;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
546 glyph->s0 = x/(float)width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
547 glyph->t0 = y/(float)height;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
548 glyph->s1 = (x + glyph->width)/(float)width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
549 glyph->t1 = (y + glyph->height)/(float)height;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
550
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
551 // Discard hinting to get advance
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
552 FT_Load_Glyph( face, glyph_index, FT_LOAD_RENDER | FT_LOAD_NO_HINTING);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
553 slot = face->glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
554 glyph->advance_x = slot->advance.x/64.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
555 glyph->advance_y = slot->advance.y/64.0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
556
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
557 vector_push_back( self->glyphs, &glyph );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
558
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
559 if( self->outline_type > 0 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
560 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
561 FT_Done_Glyph( ft_glyph );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
562 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
563 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
564 FT_Done_Face( face );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
565 FT_Done_FreeType( library );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
566 texture_atlas_upload( self->atlas );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
567 texture_font_generate_kerning( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
568 return missed;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
569 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
570
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
571
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
572 // ------------------------------------------------- texture_font_get_glyph ---
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
573 texture_glyph_t *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
574 texture_font_get_glyph( texture_font_t * self,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
575 wchar_t charcode )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
576 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
577 size_t i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
578 wchar_t buffer[2] = {0,0};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
579 texture_glyph_t *glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
580
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
581 assert( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
582
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
583 assert( self );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
584 assert( self->filename );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
585 assert( self->atlas );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
586
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
587 /* Check if charcode has been already loaded */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
588 for( i=0; i<self->glyphs->size; ++i )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
589 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
590 glyph = *(texture_glyph_t **) vector_get( self->glyphs, i );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
591 // If charcode is -1, we don't care about outline type or thickness
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
592 if( (glyph->charcode == charcode) &&
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
593 ((charcode == (wchar_t)(-1) ) ||
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
594 ((glyph->outline_type == self->outline_type) &&
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
595 (glyph->outline_thickness == self->outline_thickness)) ))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
596 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
597 return glyph;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
598 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
599 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
600
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
601 /* charcode -1 is special : it is used for line drawing (overline,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
602 * underline, strikethrough) and background.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
603 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
604 if( charcode == (wchar_t)(-1) )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
605 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
606 size_t width = self->atlas->width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
607 size_t height = self->atlas->height;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
608 ivec4 region = texture_atlas_get_region( self->atlas, 5, 5 );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
609 texture_glyph_t * glyph = texture_glyph_new( );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
610 static unsigned char data[4*4*3] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
611 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
612 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
613 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
614 if ( region.x < 0 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
615 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
616 fprintf( stderr, "Texture atlas is full (line %d)\n", __LINE__ );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
617 return NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
618 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
619 texture_atlas_set_region( self->atlas, region.x, region.y, 4, 4, data, 0 );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
620 glyph->charcode = (wchar_t)(-1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
621 glyph->s0 = (region.x+2)/(float)width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
622 glyph->t0 = (region.y+2)/(float)height;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
623 glyph->s1 = (region.x+3)/(float)width;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
624 glyph->t1 = (region.y+3)/(float)height;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
625 vector_push_back( self->glyphs, &glyph );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
626 return glyph; //*(texture_glyph_t **) vector_back( self->glyphs );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
627 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
628
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
629 /* Glyph has not been already loaded */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
630 buffer[0] = charcode;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
631 if( texture_font_load_glyphs( self, buffer ) == 0 )
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
632 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
633 return *(texture_glyph_t **) vector_back( self->glyphs );
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
634 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
635 return NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
636 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
637
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
638