	Handle UTP-16 surrogates for UCS-4 supplementary planes.

diff -ur dvipdfmx-20110311.orig/src/pdfdev.c dvipdfmx-20110311/src/pdfdev.c
--- dvipdfmx-20110311.orig/src/pdfdev.c	2012-01-17 19:27:40.000000000 +0100
+++ dvipdfmx-20110311/src/pdfdev.c	2012-03-05 13:44:30.000000000 +0100
@@ -960,17 +960,32 @@
       }
       length *= 4;
     } else if (ctype == 2) {
+      int len = 0;
+
       if (length * 2 >= FORMAT_BUF_SIZE) {
         WARN("Too long string...");
         return -1;
       }
-      for (i = 0; i < length; i += 2) {
-        sbuf1[i*2  ] = font->ucs_group;
-        sbuf1[i*2+1] = font->ucs_plane;
-        sbuf1[i*2+2] = p[i];
-        sbuf1[i*2+3] = p[i+1];
+      for (i = 0; i < length; i += 2, len += 4) {
+        sbuf1[len  ] = font->ucs_group;
+        if ((p[i] & 0xf8) == 0xd8) {
+          int c;
+          /* Check for valid surrogate pair.  */ 
+          if ((p[i] & 0xfc) != 0xd8 || i + 2 >= length || (p[i+2] & 0xfc) != 0xdc) {
+            WARN("Invalid surrogate p[%d]=%02X...", i, p[i]);
+            return -1;
+          }
+          c = (((p[i] & 0x03) << 10) | (p[i+1] << 2) | (p[i+2] & 0x03)) + 0x100;
+          sbuf1[len+1] = (c >> 8) & 0xff;
+          sbuf1[len+2] = c & 0xff;
+          i += 2;
+        } else {
+          sbuf1[len+1] = font->ucs_plane;
+          sbuf1[len+2] = p[i];
+        }
+        sbuf1[len+3] = p[i+1];
       }
-      length *= 2;
+      length = len;
     }
     p = sbuf1;
   } else if (ctype == 1 && font->mapc >= 0) {
