b4d902ff428a3ae5d5b1f5121ce4646085be8353
[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         int i, len;
157         char *s;
158         
159         /* Window, Linux or Mac, this is always / */
160         s= strrchr(str, '/');
161         if (s) {
162                 len= s - str;
163                 for (i= 0; i < len; i++)
164                         file[i]= str[i];
165
166                 file[i]= '.';
167                 file[i+1]= 't';
168                 file[i+2]= 't';
169                 file[i+3]= 'f';
170                 file[i+4]= '\0';
171                 s++;
172                 *size= atoi(s);
173                 return(1);
174         }
175         return(0);
176 }
177
178 /* Some font have additional file with metrics information,
179  * in general, the extension of the file is: .afm or .pfm
180  */
181 char *blf_dir_metrics_search(char *filename)
182 {
183         char *mfile;
184         char *s;
185
186         mfile= BLI_strdup(filename);
187         s= strrchr(mfile, '.');
188         if (s) {
189                 if (strlen(s) < 4) {
190                         MEM_freeN(mfile);
191                         return(NULL);
192                 }
193                 s++;
194                 s[0]= 'a';
195                 s[1]= 'f';
196                 s[2]= 'm';
197
198                 /* first check .afm */
199                 if (BLI_exist(s))
200                         return(s);
201
202                 /* and now check .pfm */
203                 s[0]= 'p';
204
205                 if (BLI_exist(s))
206                         return(s);
207         }
208         MEM_freeN(mfile);
209         return(NULL);
210 }