source: titan/titan/font.h @ 15280

Last change on this file since 15280 was 8520, checked in by nit, 13 years ago

[titan] fix rendering text (add fast text render to adjust for old render methode)

File size: 3.1 KB
Line 
1#ifndef FONT_H
2#define FONT_H
3
4FT_Library library;
5
6FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface)
7{
8        debug(1000, "in");
9        FT_Error ret;
10
11        ret = FT_New_Face(library, (char*)face_id, 0, aface);
12        if(ret != 0)
13                err("Font %s failed", (char*)face_id);
14
15        FT_Select_Charmap(*aface, ft_encoding_unicode);
16        debug(1000, "out");
17        return ret;
18}
19
20struct font* addfont(char *fontname)
21{
22        debug(1000, "in");
23        struct font *newnode = NULL, *node = font;
24        char *name = NULL;
25
26        name = ostrcat(fontname, "", 0, 0);
27        if(name == NULL)
28        {
29                err("no memory");
30                return NULL;
31        }
32
33        newnode = (struct font*)malloc(sizeof(struct font));   
34        if(newnode == NULL)
35        {
36                err("no memory");
37                free(name);
38                return NULL;
39        }
40
41        memset(newnode, 0, sizeof(struct font));
42        newnode->name = name;
43
44        if(node != NULL)
45        {
46                while(node->next != NULL)
47                        node = node->next;
48                node->next = newnode;
49        }
50        else
51                font = newnode;
52
53        debug(1000, "out");
54        return newnode;
55}
56
57void delfont(char *name)
58{
59        debug(1000, "in");
60        struct font *node = font, *prev = font;
61
62        while(node != NULL)
63        {
64                if(ostrcmp(node->name, name) == 0)
65                {
66                        if(node == font)
67                                font = node->next;
68                        else
69                                prev->next = node->next;
70
71                        if(node->name != NULL)
72                        {
73                                free(node->name);
74                                node->name = NULL;
75                        }
76                        if(node->manager != NULL) FTC_Manager_Done(node->manager);
77
78                        free(node);
79                        node = NULL;
80                        break;
81                }
82
83                prev = node;
84                node = node->next;
85        }
86        debug(1000, "out");
87}
88
89int initfont()
90{
91        debug(1000, "in");
92        int ret;
93
94        ret = FT_Init_FreeType(&library);
95        if(ret != 0)
96        {
97                err("FT_Init_FreeType failed. Error: 0x%.2X", ret);
98                return 1;
99        }
100
101        debug(1000, "out");
102        return 0;
103}
104
105void deinitfont()
106{
107        debug(1000, "in");
108        FT_Done_FreeType(library);
109        debug(1000, "out");
110}
111
112int openfont(char *filename)
113{
114        debug(1000, "in");
115        int ret;
116        struct font* node = font;
117
118        if(filename == NULL)
119        {
120                debug(100, "font not defined");
121                return 1;
122        }
123
124        node = addfont(filename);
125        if(node == NULL)
126                return 1;
127
128        ret = FTC_Manager_New(library, 1, 2, 0, &MyFaceRequester, NULL, &node->manager);
129        if(ret != 0)
130        {
131                err("FTC_Manager_New failed. Error: 0x%.2X", ret);
132                delfont(filename);
133                return 1;
134        }
135
136        ret = FTC_SBitCache_New(node->manager, &node->cache);
137        if(ret != 0)
138        {
139                err("FTC_SBitCache_New failed. Error: 0x%.2X", ret);
140                delfont(filename);
141                return 1;
142        }
143
144        ret = FTC_Manager_LookupFace(node->manager, (FTC_FaceID)filename, &node->face);
145        if(ret != 0)
146        {
147                err("FTC_Manager_LookupFace failed. Error: 0x%.2X", ret);
148                delfont(filename);
149                return 1;
150        }
151
152        node->desc.face_id = (FTC_FaceID)filename;
153        node->use_kerning = FT_HAS_KERNING(node->face);
154
155        debug(1000, "out");
156        return 0;
157}
158
159struct font* getfont(char *name)
160{
161        debug(1000, "in");
162        struct font *node = font;
163
164        while(node != NULL)
165        {
166                if(strstr(node->name, name) != NULL)
167                {
168                        debug(1000, "out");
169                        return node;
170                }
171
172                node = node->next;
173        }
174        debug(100, "font not found (%s)", name);
175        return NULL;
176}
177
178void freefont()
179{
180        debug(1000, "in");
181        struct font *node = font, *prev = font;
182
183        while(node != NULL)
184        {
185                prev = node;
186                node = node->next;
187                if(prev != NULL)
188                        delfont(prev->name);
189        }
190        debug(1000, "out");
191}
192
193#endif
Note: See TracBrowser for help on using the repository browser.