fd874d991ead1f6aaae5e86e418e1805a672ad3e
[blender.git] / source / blender / blenfont / intern / blf_dir.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  * 
23  * Contributor(s): Blender Foundation.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file blender/blenfont/intern/blf_dir.c
29  *  \ingroup blf
30  */
31
32
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include <ft2build.h>
38
39 #include FT_FREETYPE_H
40 #include FT_GLYPH_H
41
42 #include "MEM_guardedalloc.h"
43
44 #include "DNA_vec_types.h"
45
46 #include "BKE_utildefines.h"
47
48 #include "BLI_blenlib.h"
49
50 #include "BIF_gl.h"
51
52 #include "BLF_api.h"
53 #include "blf_internal_types.h"
54 #include "blf_internal.h"
55
56 static ListBase global_font_dir= { NULL, NULL };
57
58 static DirBLF *blf_dir_find(const char *path)
59 {
60         DirBLF *p;
61         
62         p= global_font_dir.first;
63         while (p) {
64                 if (BLI_path_cmp(p->path, path) == 0)
65                         return(p);
66                 p= p->next;
67         }
68         return(NULL);
69 }
70
71 void BLF_dir_add(const char *path)
72 {
73         DirBLF *dir;
74         
75         dir= blf_dir_find(path);
76         if (dir) /* already in the list ? just return. */
77                 return;
78         
79         dir= (DirBLF *)MEM_mallocN(sizeof(DirBLF), "BLF_dir_add");
80         dir->path= BLI_strdup(path);
81         BLI_addhead(&global_font_dir, dir);
82 }
83
84 void BLF_dir_rem(const char *path)
85 {
86         DirBLF *dir;
87         
88         dir= blf_dir_find(path);
89         if (dir) {
90                 BLI_remlink(&global_font_dir, dir);
91                 MEM_freeN(dir->path);
92                 MEM_freeN(dir);
93         }
94 }
95
96 char **BLF_dir_get(int *ndir)
97 {
98         DirBLF *p;
99         char **dirs;
100         char *path;
101         int i, count;
102         
103         count= BLI_countlist(&global_font_dir);
104         if (!count)
105                 return(NULL);
106         
107         dirs= (char **)MEM_mallocN(sizeof(char *) * count, "BLF_dir_get");
108         p= global_font_dir.first;
109         i= 0;
110         while (p) {
111                 path= BLI_strdup(p->path);
112                 dirs[i]= path;
113                 p= p->next;
114         }
115         *ndir= i;
116         return(dirs);
117 }
118
119 void BLF_dir_free(char **dirs, int count)
120 {
121         char *path;
122         int i;
123         
124         for (i= 0; i < count; i++) {
125                 path= dirs[i];
126                 MEM_freeN(path);
127         }
128         MEM_freeN(dirs);
129 }
130
131 char *blf_dir_search(const char *file)
132 {
133         DirBLF *dir;
134         char full_path[FILE_MAXDIR+FILE_MAXFILE];
135         char *s= NULL;
136
137         for(dir=global_font_dir.first; dir; dir= dir->next) {
138                 BLI_join_dirfile(full_path, sizeof(full_path), dir->path, file);
139                 if (BLI_exist(full_path)) {
140                         s= BLI_strdup(full_path);
141                         break;
142                 }
143         }
144
145         if (!s) {
146                 /* check the current directory, why not ? */
147                 if (BLI_exist(file))
148                         s= BLI_strdup(file);
149         }
150         
151         return(s);
152 }
153
154 #if 0 // UNUSED
155 int blf_dir_split(const char *str, char *file, int *size)
156 {
157         int i, len;
158         char *s;
159         
160         /* Window, Linux or Mac, this is always / */
161         s= strrchr(str, '/');
162         if (s) {
163                 len= s - str;
164                 for (i= 0; i < len; i++)
165                         file[i]= str[i];
166
167                 file[i]= '.';
168                 file[i+1]= 't';
169                 file[i+2]= 't';
170                 file[i+3]= 'f';
171                 file[i+4]= '\0';
172                 s++;
173                 *size= atoi(s);
174                 return(1);
175         }
176         return(0);
177 }
178 #endif
179
180 /* Some font have additional file with metrics information,
181  * in general, the extension of the file is: .afm or .pfm
182  */
183 char *blf_dir_metrics_search(const char *filename)
184 {
185         char *mfile;
186         char *s;
187
188         mfile= BLI_strdup(filename);
189         s= strrchr(mfile, '.');
190         if (s) {
191                 if (strlen(s) < 4) {
192                         MEM_freeN(mfile);
193                         return(NULL);
194                 }
195                 s++;
196                 s[0]= 'a';
197                 s[1]= 'f';
198                 s[2]= 'm';
199
200                 /* first check .afm */
201                 if (BLI_exist(s))
202                         return(s);
203
204                 /* and now check .pfm */
205                 s[0]= 'p';
206
207                 if (BLI_exist(s))
208                         return(s);
209         }
210         MEM_freeN(mfile);
211         return(NULL);
212 }