Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Hughes <khughes@pacific.edu>2008-04-24 22:54:59 +0400
committerKen Hughes <khughes@pacific.edu>2008-04-24 22:54:59 +0400
commit28c2d1b2aecf5b8faa7cfe0b0934b5fb1a1b96ff (patch)
treea210e2b0feb38f7a1aa098e0d75f4d95526664ff /source/blender/ftfont
parentf4cc03b0f1323fbf41730851716cb90e27e4c89e (diff)
Interface
--------- Bugfix #9222. Conversion from UTF-8 to wchar for international fonts did not check for valid encodings, so user strings with containing invalid characters could cause crashes.
Diffstat (limited to 'source/blender/ftfont')
-rw-r--r--source/blender/ftfont/intern/FTF_TTFont.cpp90
1 files changed, 52 insertions, 38 deletions
diff --git a/source/blender/ftfont/intern/FTF_TTFont.cpp b/source/blender/ftfont/intern/FTF_TTFont.cpp
index 77bfff5bd82..6661031f6fc 100644
--- a/source/blender/ftfont/intern/FTF_TTFont.cpp
+++ b/source/blender/ftfont/intern/FTF_TTFont.cpp
@@ -48,48 +48,62 @@
#define FTF_MAX_STR_SIZE 512
+/* Converts Unicode to wchar
+
+According to RFC 3629 "UTF-8, a transformation format of ISO 10646"
+(http://tools.ietf.org/html/rfc3629), the valid UTF-8 encoding are:
+
+ Char. number range | UTF-8 octet sequence
+ (hexadecimal) | (binary)
+ --------------------+---------------------------------------------
+ 0000 0000-0000 007F | 0xxxxxxx
+ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
+ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
+ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+If the encoding incidated by the first character is incorrect (because the
+1 to 3 following characters do not match 10xxxxxx), the output is a '?' and
+only a single input character is consumed.
+
+*/
int utf8towchar(wchar_t *w, char *c)
{
- int len=0;
- if(w==NULL || c==NULL) return(0);
- //printf("%s\n",c);
- while(*c)
- {
- //Converts Unicode to wchar:
-
- if(*c & 0x80)
- {
- if(*c & 0x40)
- {
- if(*c & 0x20)
- {
- if(*c & 0x10)
- {
- *w=(c[0] & 0x0f)<<18 | (c[1]&0x1f)<<12 | (c[2]&0x3f)<<6 | (c[3]&0x7f);
- c++;
- }
- else
- *w=(c[0] & 0x1f)<<12 | (c[1]&0x3f)<<6 | (c[2]&0x7f);
- c++;
- }
- else
- *w=(c[0] &0x3f)<<6 | c[1]&0x7f;
- c++;
- }
- else
- *w=(c[0] & 0x7f);
- }
- else
- *w=(c[0] & 0x7f);
-
- c++;
- w++;
- len++;
- }
- return len;
-}
+ int len=0;
+ if(w==NULL || c==NULL) return(0);
+
+ while(*c) {
+ if ((*c & 0xe0) == 0xc0) {
+ if((c[1] & 0x80) && (c[1] & 0x40) == 0x00) {
+ *w=(c[0] &0x1f)<<6 | c[1]&0x3f;
+ c++;
+ } else {
+ *w = '?';
+ }
+ } else if ((*c & 0xf0) == 0xe0) {
+ if((c[1] & c[2] & 0x80) && ((c[1] | c[2]) & 0x40) == 0x00) {
+ *w=(c[0] & 0x0f)<<12 | (c[1]&0x3f)<<6 | (c[2]&0x3f);
+ c += 2;
+ } else {
+ *w = '?';
+ }
+ } else if ((*c & 0xf8) == 0xf0) {
+ if((c[1] & c[2] & c[3] & 0x80) && ((c[1] | c[2] | c[3]) & 0x40) == 0x00) {
+ *w=(c[0] & 0x07)<<18 | (c[1]&0x1f)<<12 | (c[2]&0x3f)<<6 | (c[3]&0x3f);
+ c += 3;
+ } else {
+ *w = '?';
+ }
+ } else
+ *w=(c[0] & 0x7f);
+
+ c++;
+ w++;
+ len++;
+ }
+ return len;
+}
FTF_TTFont::FTF_TTFont(void)
{