92dfe8457b0aaf11f8e32b4f0636e3679d5cd730
[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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31
32 #include <ft2build.h>
33
34 #include FT_FREETYPE_H
35 #include FT_GLYPH_H
36
37 #include "MEM_guardedalloc.h"
38
39 #include "DNA_listBase.h"
40 #include "DNA_vec_types.h"
41
42 #include "BKE_utildefines.h"
43
44 #include "BLI_blenlib.h"
45 #include "BLI_linklist.h"       /* linknode */
46 #include "BLI_string.h"
47
48 #include "BIF_gl.h"
49
50 #include "blf_internal_types.h"
51
52 static ListBase global_font_dir= { NULL, NULL };
53
54 DirBLF *blf_dir_find(const char *path)
55 {
56         DirBLF *p;
57         
58         p= global_font_dir.first;
59         while (p) {
60                 if (!strcmp(p->path, path))
61                         return(p);
62                 p= p->next;
63         }
64         return(NULL);
65 }
66
67 void BLF_dir_add(const char *path)
68 {
69         DirBLF *dir;
70         
71         dir= blf_dir_find(path);
72         if (dir) /* already in the list ? just return. */
73                 return;
74         
75         dir= (DirBLF *)MEM_mallocN(sizeof(DirBLF), "BLF_dir_add");
76         dir->path= BLI_strdup(path);
77         BLI_addhead(&global_font_dir, dir);
78 }
79
80 void BLF_dir_rem(const char *path)
81 {
82         DirBLF *dir;
83         
84         dir= blf_dir_find(path);
85         if (dir) {
86                 BLI_remlink(&global_font_dir, dir);
87                 MEM_freeN(dir->path);
88                 MEM_freeN(dir);
89         }
90 }
91
92 char **BLF_dir_get(int *ndir)
93 {
94         DirBLF *p;
95         char **dirs;
96         char *path;
97         int i, count;
98         
99         count= BLI_countlist(&global_font_dir);
100         if (!count)
101                 return(NULL);
102         
103         dirs= (char **)MEM_mallocN(sizeof(char *) * count, "BLF_dir_get");
104         p= global_font_dir.first;
105         i= 0;
106         while (p) {
107                 path= BLI_strdup(p->path);
108                 dirs[i]= path;
109                 p= p->next;
110         }
111         *ndir= i;
112         return(dirs);
113 }
114
115 void BLF_dir_free(char **dirs, int count)
116 {
117         char *path;
118         int i;
119         
120         for (i= 0; i < count; i++) {
121                 path= dirs[i];
122                 MEM_freeN(path);
123         }
124         MEM_freeN(dirs);
125 }
126
127 char *blf_dir_search(char *file)
128 {
129         DirBLF *dir;
130         char full_path[FILE_MAXDIR+FILE_MAXFILE];
131         char *s;
132         
133         dir= global_font_dir.first;
134         s= NULL;
135         while (dir) {
136                 BLI_join_dirfile(full_path, dir->path, file);
137                 if (BLI_exist(full_path)) {
138                         s= (char *)MEM_mallocN(strlen(full_path)+1,"blf_dir_search");
139                         strcpy(s, full_path);
140                         break;
141                 }
142                 dir= dir->next;
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 int blf_dir_split(const char *str, char *file, int *size)
155 {
156         char *s, i, len;
157         
158         /* Window, Linux or Mac, this is always / */
159         s= strrchr(str, '/');
160         if (s) {
161                 len= s - str;
162                 for (i= 0; i < len; i++)
163                         file[i]= str[i];
164
165                 file[i]= '.';
166                 file[i+1]= 't';
167                 file[i+2]= 't';
168                 file[i+3]= 'f';
169                 file[i+4]= '\0';
170                 s++;
171                 *size= atoi(s);
172                 return(1);
173         }
174         return(0);
175 }
176
177 /* Some font have additional file with metrics information,
178  * in general, the extension of the file is: .afm or .pfm
179  */
180 char *blf_dir_metrics_search(char *filename)
181 {
182         char *mfile;
183         char *s;
184
185         mfile= BLI_strdup(filename);
186         s= strrchr(mfile, '.');
187         if (s) {
188                 if (strlen(s) < 4) {
189                         MEM_freeN(mfile);
190                         return(NULL);
191                 }
192                 s++;
193                 s[0]= 'a';
194                 s[1]= 'f';
195                 s[2]= 'm';
196
197                 /* first check .afm */
198                 if (BLI_exist(s))
199                         return(s);
200
201                 /* and now check .pfm */
202                 s[0]= 'p';
203
204                 if (BLI_exist(s))
205                         return(s);
206         }
207         MEM_freeN(mfile);
208         return(NULL);
209 }