source: titan/titan/font.h @ 30698

Last change on this file since 30698 was 23267, checked in by nit, 11 years ago

[titan] cleanup

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