Subversion Repositories Kolibri OS

Rev

Rev 5025 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5024 Serge 1
 
2
#include 
3
#include 
4
#include 
5
#include 
6
#include FT_FREETYPE_H
7
#include FT_GLYPH_H
8
#include 
6865 serge 9
5024 Serge 10
 
11
{
12
    FT_Face face;
13
    int     fontsize;
6865 serge 14
    int     height;
5024 Serge 15
    int     base;
16
17
 
18
19
 
20
21
 
22
static FT_Face sym_face;
6865 serge 23
5024 Serge 24
 
6865 serge 25
26
 
5024 Serge 27
28
 
29
30
 
31
32
 
6865 serge 33
34
 
35
{
5024 Serge 36
    if(ch < 0x80)
6865 serge 37
        return ch;
38
5024 Serge 39
 
6865 serge 40
        return 0x410-0x80 + ch;
41
5024 Serge 42
 
6865 serge 43
        return 0;
44
5024 Serge 45
 
6865 serge 46
        return 0x440-0xE0 + ch;
47
5024 Serge 48
 
6865 serge 49
        return 0x401;
50
    else if(ch==0xF1)
51
        return 0x451;
52
    else return 0;
53
}
54
5024 Serge 55
 
6865 serge 56
{
5024 Serge 57
    FT_UInt glyph_index;
58
    FT_Bool use_kerning = 0;
59
    FT_BitmapGlyph  glyph;
60
    FT_UInt previous;
61
62
 
6865 serge 63
    int col, ncol;
5024 Serge 64
    unsigned char ch;
65
    int err = 0;
66
67
 
68
    previous = 0;
69
    col = 0;
70
71
 
72
    xend = rc->r << 6;
6865 serge 73
    y = rc->t + font->base;
74
5024 Serge 75
 
76
    {
77
        ch = *text++;
78
79
 
80
            continue;
81
82
 
83
        {
84
            ncol = (col+3) & ~4;
6865 serge 85
            if( col < ncol)
5024 Serge 86
            {
87
                glyph_index = FT_Get_Char_Index( font->face, ansi2utf32(' ') );
88
89
 
90
                {
91
                    if ( use_kerning && previous && glyph_index )
92
                    {
93
                        FT_Vector delta;
94
                        FT_Get_Kerning( font->face, previous, glyph_index, FT_KERNING_DEFAULT, &delta );
95
                        x += delta.x ;
96
                    }
97
98
 
6865 serge 99
                        break;
5024 Serge 100
101
 
102
                    previous = glyph_index;
103
                    col ++;
104
                };
105
            };
106
            continue;
107
        };
108
109
 
110
111
 
112
        {
113
            FT_Vector delta;
114
            FT_Get_Kerning( font->face, previous, glyph_index, FT_KERNING_DEFAULT, &delta );
115
            x += delta.x ;
116
        }
117
118
 
6865 serge 119
//            break;
120
121
 
122
            break;
5024 Serge 123
124
 
125
126
 
6865 serge 127
        {
128
            rect_t rc_dst;
129
5024 Serge 130
 
6865 serge 131
            rc_dst.t = y - glyph->top;
132
            rc_dst.r = rc_dst.l + glyph->bitmap.width;
133
            if(rc_dst.r > (xend >> 6))
134
                rc_dst.r = xend >> 6;
135
            rc_dst.b = rc_dst.t + glyph->bitmap.rows;
136
137
 
138
            px_draw_glyph(ctx, glyph->bitmap.buffer, glyph->bitmap.pitch, &rc_dst, color);
139
140
 
141
        };
142
        previous = glyph_index;
5024 Serge 143
    };
144
145
 
146
};
147
148
 
149
 
150
{
151
    static FT_Library library;
152
    FT_Face face = NULL;
153
    int err;
154
155
 
156
    if ( err )
157
    {
158
        printf("an error occurred during FreeType initialization\n");
159
        goto done;
160
    }
161
162
 
5025 Serge 163
//    err = FT_New_Face( library, "/kolibrios/Fonts/lucon.ttf", 0, &face );
5024 Serge 164
5025 Serge 165
 
166
    if ( err == FT_Err_Unknown_File_Format )
5024 Serge 167
    {
168
        printf("font format is unsupported\n");
169
        goto done;
170
171
 
172
    else if ( err )
173
    {
174
        printf("font file could not be read or broken\n");
175
        goto done;
176
    }
177
178
 
179
180
 
6865 serge 181
    if ( err == FT_Err_Unknown_File_Format )
182
    {
183
        printf("font format is unsupported\n");
184
        goto done;
185
5024 Serge 186
 
6865 serge 187
    else if ( err )
188
    {
189
        printf("font file could not be read or broken\n");
190
        goto done;
191
    }
192
5024 Serge 193
 
6865 serge 194
5024 Serge 195
 
6865 serge 196
5024 Serge 197
 
6865 serge 198
5024 Serge 199
 
6865 serge 200
};
201
5024 Serge 202
 
203
 
204
 
205
 
206
{
207
    font_t *font;
208
    int i, err;
209
210
 
211
    if(font == NULL)
212
        return font;
213
214
 
215
216
 
217
    font->height = size;
6865 serge 218
5024 Serge 219
 
220
221
 
222
    {
223
        FT_UInt glyph_index;
224
        FT_BitmapGlyph  glyph_bitmap;
225
226
 
227
228
 
229
        if ( err )
230
        {
231
            font->glyph[i] = font->glyph[0] ;
232
            continue;
233
        };
234
235
 
236
        if (err)
237
        {
238
            font->glyph[i] = font->glyph[0] ;
239
            continue;
240
        };
241
242
 
243
        {
244
            err = FT_Glyph_To_Bitmap( &font->glyph[i], FT_RENDER_MODE_NORMAL, 0, 1 );
245
            if ( err )
246
                continue;
247
248
 
249
250
 
251
                font->base = glyph_bitmap->top;
252
        }
253
    }
254
255
 
256
}
257
6865 serge 258
 
259
{
260
    return font->height;
261
}
262