store message catalogs in Resources folder of the application bundle on OS
[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
43 #ifdef __APPLE__
44 #include <libgen.h>
45 #endif
46
47 #include "../FTF_Settings.h"
48
49 #include "FTF_TTFont.h"
50
51 #define DOMAIN_NAME "blender"
52 #define MESSAGE_FILE "message"
53
54 #define SYSTEM_ENCODING_DEFAULT "UTF-8"
55 #define FONT_SIZE_DEFAULT 12
56 //#define FONT_PATH_DEFAULT ".bfont.ttf"
57
58 #define FTF_MAX_STR_SIZE 256
59
60 extern char bprogname[];
61
62 int utf8towchar(wchar_t *w, char *c)
63 {
64   int len=0;
65   if(w==NULL || c==NULL) return(0);
66   //printf("%s\n",c);
67   while(*c)
68   {
69     //Converts Unicode to wchar:
70
71     if(*c & 0x80)
72     {
73       if(*c & 0x40)
74       {
75         if(*c & 0x20)
76         {
77           if(*c & 0x10)
78           {
79             *w=(c[0] & 0x0f)<<18 | (c[1]&0x1f)<<12 | (c[2]&0x3f)<<6 | (c[3]&0x7f);
80             c++;
81           }
82           else
83             *w=(c[0] & 0x1f)<<12 | (c[1]&0x3f)<<6 | (c[2]&0x7f);
84           c++;
85         }
86         else
87           *w=(c[0] &0x3f)<<6 | c[1]&0x7f;
88         c++;
89       }
90       else
91         *w=(c[0] & 0x7f);
92     }
93     else
94       *w=(c[0] & 0x7f);
95
96     c++;
97     w++;
98     len++;
99   }
100   return len;
101 }
102
103
104 FTF_TTFont::FTF_TTFont(void)
105 {       
106         font=NULL;
107         font_size=FONT_SIZE_DEFAULT;
108         strcpy(encoding_name, SYSTEM_ENCODING_DEFAULT);
109 }
110
111
112 FTF_TTFont::~FTF_TTFont(void)
113 {
114         if (font) delete font;
115 }
116
117
118 int FTF_TTFont::SetFont(char* str, int size)
119 {
120         int err = 0;
121         bool success = 0;
122
123         delete font;
124
125         font = new FTGLPixmapFont(str);
126         err = font->Error();
127
128         if(err) {
129 //              printf("Failed to open font %s\n", str);
130                 return 0;
131         } else {
132                 success = font->FaceSize(size);
133                 if(!success) return 0;
134
135                 success = font->CharMap(ft_encoding_unicode);
136                 if(!success) return 0;
137
138                 return 1;
139         }
140 }
141
142
143 void FTF_TTFont::SetLanguage(char* str)
144 {
145 #ifdef __APPLE__
146         char tmp[1024];
147         char msgpath[1024];
148 #endif
149
150 #if defined (_WIN32) || defined(__APPLE__)
151         char envstr[12];
152
153         sprintf(envstr, "LANG=%s", str);
154         envstr[strlen(envstr)]='\0';
155 #ifdef _WIN32
156         gettext_putenv(envstr);
157 #else
158         putenv(envstr);
159         setlocale(LC_ALL, str); 
160 #endif
161 #else
162         char *locreturn;
163         
164         locreturn = setlocale(LC_ALL, str);
165         if (locreturn == NULL) {
166                 printf("could not change language to %s\n", str);
167         }
168         
169         setlocale(LC_NUMERIC, "C");
170 #endif
171
172 #ifdef __APPLE__
173         /* message catalogs are stored inside the application bundle */
174         strcpy(tmp, dirname(bprogname));
175         strcat(tmp, "/../Resources/message");
176         realpath(tmp, msgpath);
177         bindtextdomain(DOMAIN_NAME, msgpath);
178         textdomain(DOMAIN_NAME);
179 #else
180         bindtextdomain(DOMAIN_NAME, MESSAGE_FILE);
181         textdomain(DOMAIN_NAME);
182 #endif
183         strcpy(language, str);
184 }
185
186
187 void FTF_TTFont::SetEncoding(char* str)
188 {
189         strcpy(encoding_name, str);
190 }
191
192
193 void FTF_TTFont::SetSize(int size)
194 {
195         font->FaceSize(size);
196         font_size = size;
197 }
198
199 int FTF_TTFont::GetSize(void)
200 {
201         return font_size;
202 }
203
204 int FTF_TTFont::Ascender(void)
205 {
206         return font->Ascender();
207 }
208
209 int FTF_TTFont::Descender(void)
210 {
211         return font->Descender();
212 }
213
214
215 int FTF_TTFont::TransConvString(char* str, char* ustr, unsigned int flag)
216 {
217         return 0;
218 }
219
220
221 float FTF_TTFont::DrawString(char* str, unsigned int flag, int select)
222 {
223         char ustr[FTF_MAX_STR_SIZE*2]={0};
224         wchar_t wstr[255]={'\0'};
225         int len=0;
226   
227         if (FTF_USE_GETTEXT & flag) 
228                 len=utf8towchar(wstr,gettext(str));
229         else 
230                 len=utf8towchar(wstr,str);
231
232         if(!select) {
233                 glPixelTransferf(GL_RED_SCALE, 0.0);
234                 glPixelTransferf(GL_GREEN_SCALE, 0.0);
235                 glPixelTransferf(GL_BLUE_SCALE, 0.0);
236         }
237         
238         font->Render(wstr);
239   
240         if(!select) {
241                 glPixelTransferf(GL_RED_SCALE, 1.0);
242                 glPixelTransferf(GL_GREEN_SCALE, 1.0);
243                 glPixelTransferf(GL_BLUE_SCALE, 1.0);
244         }
245
246         return font->Advance(wstr);
247 }
248
249
250 float FTF_TTFont::DrawStringRGB(char* str, unsigned int flag, float r, float g, float b)
251 {
252         char ustr[FTF_MAX_STR_SIZE*2]={0};
253         wchar_t wstr[255]={'\0'};
254         int len=0;
255   
256         if (FTF_USE_GETTEXT & flag) 
257                 len=utf8towchar(wstr,gettext(str));
258         else 
259                 len=utf8towchar(wstr,str);
260
261         glPixelTransferf(GL_RED_SCALE, r);
262         glPixelTransferf(GL_GREEN_SCALE, g);
263         glPixelTransferf(GL_BLUE_SCALE, b);
264         
265         font->Render(wstr);
266   
267         glPixelTransferf(GL_RED_SCALE, 1.0);
268         glPixelTransferf(GL_GREEN_SCALE, 1.0);
269         glPixelTransferf(GL_BLUE_SCALE, 1.0);
270
271         return font->Advance(wstr);
272 }
273
274
275 float FTF_TTFont::GetStringWidth(char* str, unsigned int flag)
276 {
277         char ustr[FTF_MAX_STR_SIZE*2]={0};
278         wchar_t wstr[255]={'\0'};
279         int len=0;
280
281         if (FTF_USE_GETTEXT & flag) 
282                 len=utf8towchar(wstr,gettext(str));
283         else 
284                 len=utf8towchar(wstr,str);
285
286         return font->Advance(wstr);
287 }
288
289
290 void FTF_TTFont::GetBoundingBox(char* str, float *llx, float *lly, float *llz, float *urx, float *ury, float *urz, unsigned int flag)
291 {
292         char ustr[FTF_MAX_STR_SIZE*2]={0};
293         wchar_t wstr[255]={'\0'};
294         int len=0;
295   
296         if (FTF_USE_GETTEXT & flag) 
297                 len=utf8towchar(wstr,gettext(str));
298         else 
299                 len=utf8towchar(wstr,str);
300
301         font->BBox(wstr, *llx, *lly, *llz, *urx, *ury, *urz);
302 }
303