store locales, .Blanguage, and .bfont.ttf inside of Resources folder of
[blender.git] / source / blender / ftfont / intern / FTF_TTFont.cpp
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * Copyright (C) 2002 Blender Foundation. All Rights Reserved.
23  *
24  * The Original Code is: all of this file.
25  *
26  * Contributor(s): none yet.
27  *
28  * ***** END GPL/BL DUAL LICENSE BLOCK *****
29  */
30
31 /**
32
33  * $Id$
34  * Copyright (C) 2001 NaN Technologies B.V.
35  */
36
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40 #include <locale.h>
41 #include "libintl.h"
42 #include "BLI_blenlib.h"
43
44 #include "../FTF_Settings.h"
45
46 #include "FTF_TTFont.h"
47
48 #include "BKE_utildefines.h"
49 #include "BLI_blenlib.h"
50
51 #define DOMAIN_NAME "blender"
52
53 #define SYSTEM_ENCODING_DEFAULT "UTF-8"
54 #define FONT_SIZE_DEFAULT 12
55 //#define FONT_PATH_DEFAULT ".bfont.ttf"
56
57 #define FTF_MAX_STR_SIZE 256
58
59 int utf8towchar(wchar_t *w, char *c)
60 {
61   int len=0;
62   if(w==NULL || c==NULL) return(0);
63   //printf("%s\n",c);
64   while(*c)
65   {
66     //Converts Unicode to wchar:
67
68     if(*c & 0x80)
69     {
70       if(*c & 0x40)
71       {
72         if(*c & 0x20)
73         {
74           if(*c & 0x10)
75           {
76             *w=(c[0] & 0x0f)<<18 | (c[1]&0x1f)<<12 | (c[2]&0x3f)<<6 | (c[3]&0x7f);
77             c++;
78           }
79           else
80             *w=(c[0] & 0x1f)<<12 | (c[1]&0x3f)<<6 | (c[2]&0x7f);
81           c++;
82         }
83         else
84           *w=(c[0] &0x3f)<<6 | c[1]&0x7f;
85         c++;
86       }
87       else
88         *w=(c[0] & 0x7f);
89     }
90     else
91       *w=(c[0] & 0x7f);
92
93     c++;
94     w++;
95     len++;
96   }
97   return len;
98 }
99
100
101 FTF_TTFont::FTF_TTFont(void)
102 {       
103 #ifdef __APPLE__
104         char *bundlepath;
105 #endif
106
107         font=NULL;
108         font_size=FONT_SIZE_DEFAULT;
109         strcpy(encoding_name, SYSTEM_ENCODING_DEFAULT);
110
111         //set messagepath directory
112
113 #ifndef LOCALEDIR
114 #define LOCALEDIR "/usr/share/locale"
115 #endif
116
117         strcpy(messagepath, ".blender/locale");
118
119         if (BLI_exist(messagepath) == NULL) {   // locale not in current dir
120                 BLI_make_file_string("/", messagepath, BLI_gethome(), ".blender/locale");
121                 
122                 if(BLI_exist(messagepath) == NULL) {    // locale not in home dir
123 #ifdef __APPLE__
124                         /* message catalogs are stored inside the application bundle */
125                         bundlepath = BLI_getbundle();
126                         strcpy(messagepath, bundlepath);
127                         strcat(messagepath, "/Contents/Resources/locale");
128                         if(BLI_exist(messagepath) == NULL) { // locale not in bundle (now that's odd..)
129 #endif
130                                 strcpy(messagepath, LOCALEDIR);
131
132                                 if(BLI_exist(messagepath) == NULL) {    // locale not in LOCALEDIR
133                                         strcpy(messagepath, "message");         // old compatibility as last
134                                 }
135 #ifdef __APPLE__
136                         }
137 #endif
138                 }
139         }
140 }
141
142
143 FTF_TTFont::~FTF_TTFont(void)
144 {
145         if (font) delete font;
146 }
147
148
149 int FTF_TTFont::SetFont(char* str, int size)
150 {
151         int err = 0;
152         bool success = 0;
153
154         delete font;
155
156         font = new FTGLPixmapFont(str);
157         err = font->Error();
158
159         if(err) {
160 //              printf("Failed to open font %s\n", str);
161                 return 0;
162         } else {
163                 success = font->FaceSize(size);
164                 if(!success) return 0;
165
166                 success = font->CharMap(ft_encoding_unicode);
167                 if(!success) return 0;
168
169                 return 1;
170         }
171 }
172
173
174 void FTF_TTFont::SetLanguage(char* str)
175 {
176
177 #if defined (_WIN32) || defined(__APPLE__)
178         char envstr[12];
179
180         sprintf(envstr, "LANG=%s", str);
181         envstr[strlen(envstr)]='\0';
182 #ifdef _WIN32
183         gettext_putenv(envstr);
184 #else
185         putenv(envstr);
186 #endif
187 #else
188         char *locreturn = setlocale(LC_ALL, str);
189         if (locreturn == NULL) {
190                 printf("could not change language to %s\n", str);
191         }
192         
193         setlocale(LC_NUMERIC, "C");
194 #endif
195
196
197         bindtextdomain(DOMAIN_NAME, messagepath);
198         textdomain(DOMAIN_NAME);
199
200         strcpy(language, str);
201 }
202
203
204 void FTF_TTFont::SetEncoding(char* str)
205 {
206         strcpy(encoding_name, str);
207 }
208
209
210 void FTF_TTFont::SetSize(int size)
211 {
212         font->FaceSize(size);
213         font_size = size;
214 }
215
216 int FTF_TTFont::GetSize(void)
217 {
218         return font_size;
219 }
220
221 int FTF_TTFont::Ascender(void)
222 {
223         return font->Ascender();
224 }
225
226 int FTF_TTFont::Descender(void)
227 {
228         return font->Descender();
229 }
230
231
232 int FTF_TTFont::TransConvString(char* str, char* ustr, unsigned int flag)
233 {
234         return 0;
235 }
236
237
238 float FTF_TTFont::DrawString(char* str, unsigned int flag, int select)
239 {
240         char ustr[FTF_MAX_STR_SIZE*2]={0};
241         wchar_t wstr[255]={'\0'};
242         int len=0;
243   
244         if (FTF_USE_GETTEXT & flag) 
245                 len=utf8towchar(wstr,gettext(str));
246         else 
247                 len=utf8towchar(wstr,str);
248
249         if(!select) {
250                 glPixelTransferf(GL_RED_SCALE, 0.0);
251                 glPixelTransferf(GL_GREEN_SCALE, 0.0);
252                 glPixelTransferf(GL_BLUE_SCALE, 0.0);
253         }
254         
255         font->Render(wstr);
256   
257         if(!select) {
258                 glPixelTransferf(GL_RED_SCALE, 1.0);
259                 glPixelTransferf(GL_GREEN_SCALE, 1.0);
260                 glPixelTransferf(GL_BLUE_SCALE, 1.0);
261         }
262
263         return font->Advance(wstr);
264 }
265
266
267 float FTF_TTFont::DrawStringRGB(char* str, unsigned int flag, float r, float g, float b)
268 {
269         char ustr[FTF_MAX_STR_SIZE*2]={0};
270         wchar_t wstr[255]={'\0'};
271         int len=0;
272   
273         if (FTF_USE_GETTEXT & flag) 
274                 len=utf8towchar(wstr,gettext(str));
275         else 
276                 len=utf8towchar(wstr,str);
277
278         glPixelTransferf(GL_RED_SCALE, r);
279         glPixelTransferf(GL_GREEN_SCALE, g);
280         glPixelTransferf(GL_BLUE_SCALE, b);
281         
282         font->Render(wstr);
283   
284         glPixelTransferf(GL_RED_SCALE, 1.0);
285         glPixelTransferf(GL_GREEN_SCALE, 1.0);
286         glPixelTransferf(GL_BLUE_SCALE, 1.0);
287
288         return font->Advance(wstr);
289 }
290
291
292 float FTF_TTFont::GetStringWidth(char* str, unsigned int flag)
293 {
294         char ustr[FTF_MAX_STR_SIZE*2]={0};
295         wchar_t wstr[511]={'\0'};
296         int len=0;
297
298         if (FTF_USE_GETTEXT & flag) 
299                 len=utf8towchar(wstr,gettext(str));
300         else 
301                 len=utf8towchar(wstr,str);
302
303         return font->Advance(wstr);
304 }
305
306
307 void FTF_TTFont::GetBoundingBox(char* str, float *llx, float *lly, float *llz, float *urx, float *ury, float *urz, unsigned int flag)
308 {
309         char ustr[FTF_MAX_STR_SIZE*2]={0};
310         wchar_t wstr[255]={'\0'};
311         int len=0;
312   
313         if (FTF_USE_GETTEXT & flag) 
314                 len=utf8towchar(wstr,gettext(str));
315         else 
316                 len=utf8towchar(wstr,str);
317
318         font->BBox(wstr, *llx, *lly, *llz, *urx, *ury, *urz);
319 }
320