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