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