3786de9f2511bf7010abe9dd7294b49572d2f282
[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
55 static ListBase global_font_dir= { NULL, NULL };
56
57 static DirBLF *blf_dir_find(const char *path)
58 {
59         DirBLF *p;
60         
61         p= global_font_dir.first;
62         while (p) {
63                 if (!strcmp(p->path, path))
64                         return(p);
65                 p= p->next;
66         }
67         return(NULL);
68 }
69
70 void BLF_dir_add(const char *path)
71 {
72         DirBLF *dir;
73         
74         dir= blf_dir_find(path);
75         if (dir) /* already in the list ? just return. */
76                 return;
77         
78         dir= (DirBLF *)MEM_mallocN(sizeof(DirBLF), "BLF_dir_add");
79         dir->path= BLI_strdup(path);
80         BLI_addhead(&global_font_dir, dir);
81 }
82
83 void BLF_dir_rem(const char *path)
84 {
85         DirBLF *dir;
86         
87         dir= blf_dir_find(path);
88         if (dir) {
89                 BLI_remlink(&global_font_dir, dir);
90                 MEM_freeN(dir->path);
91                 MEM_freeN(dir);
92         }
93 }
94
95 char **BLF_dir_get(int *ndir)
96 {
97         DirBLF *p;
98         char **dirs;
99         char *path;
100         int i, count;
101         
102         count= BLI_countlist(&global_font_dir);
103         if (!count)
104                 return(NULL);
105         
106         dirs= (char **)MEM_mallocN(sizeof(char *) * count, "BLF_dir_get");
107         p= global_font_dir.first;
108         i= 0;
109         while (p) {
110                 path= BLI_strdup(p->path);
111                 dirs[i]= path;
112                 p= p->next;
113         }
114         *ndir= i;
115         return(dirs);
116 }
117
118 void BLF_dir_free(char **dirs, int count)
119 {
120         char *path;
121         int i;
122         
123         for (i= 0; i < count; i++) {
124                 path= dirs[i];
125                 MEM_freeN(path);
126         }
127         MEM_freeN(dirs);
128 }
129
130 char *blf_dir_search(const char *file)
131 {
132         DirBLF *dir;
133         char full_path[FILE_MAXDIR+FILE_MAXFILE];
134         char *s= NULL;
135
136         for(dir=global_font_dir.first; dir; dir= dir->next) {
137                 BLI_join_dirfile(full_path, sizeof(full_path), dir->path, file);
138                 if (BLI_exist(full_path)) {
139                         s= BLI_strdup(full_path);
140                         break;
141                 }
142         }
143
144         if (!s) {
145                 /* check the current directory, why not ? */
146                 if (BLI_exist(file))
147                         s= BLI_strdup(file);
148         }
149         
150         return(s);
151 }
152
153 int blf_dir_split(const char *str, char *file, int *size)
154 {
155         int i, len;
156         char *s;
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(const 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 }