[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14536] trunk/blender/source/blender/ ftfont/intern/FTF_TTFont.cpp: Interface

Ken Hughes khughes at pacific.edu
Thu Apr 24 20:55:30 CEST 2008


Revision: 14536
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14536
Author:   khughes
Date:     2008-04-24 20:54:59 +0200 (Thu, 24 Apr 2008)

Log Message:
-----------
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.

Modified Paths:
--------------
    trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp

Modified: trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp
===================================================================
--- trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp	2008-04-23 21:48:17 UTC (rev 14535)
+++ trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp	2008-04-24 18:54:59 UTC (rev 14536)
@@ -48,49 +48,63 @@
 
 #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:
+	int len=0;
 
-    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);
+	if(w==NULL || c==NULL) return(0);
 
-    c++;
-    w++;
-    len++;
-  }
-  return len;
+	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)
 {	
 #ifdef __APPLE__





More information about the Bf-blender-cvs mailing list