Author: ianmacarthur
Date: 2011-04-11 06:13:08 -0700 (Mon, 11 Apr 2011)
New Revision: 8575
Log:

Remove use of the MS API call MultiByteToWideChar(...) and re-instate use of 
fl_utf8toUtf16(...) now that I have fixed a slight off-by-one in handling the 
ends of the input strings.
This makes string handling much more consistent across variants.
Doh!. I am such an idiot...

NOTE: This still does not fix aberrant handling of surrogate pairs under WinXP, 
and I still haven't resolved the issues with the win32 ::width() functions not 
handling surrogate pairs at all...




Modified:
   branches/branch-1.3/src/fl_font_win32.cxx

Modified: branches/branch-1.3/src/fl_font_win32.cxx
===================================================================
--- branches/branch-1.3/src/fl_font_win32.cxx   2011-04-11 07:50:08 UTC (rev 
8574)
+++ branches/branch-1.3/src/fl_font_win32.cxx   2011-04-11 13:13:08 UTC (rev 
8575)
@@ -355,9 +355,7 @@
     }
     // Do we need a surrogate pair for this UCS value?
     if(u > 0xFFFF) {
-      //cc = fl_utf8toUtf16((str + i), l, ucs, 4);
-      // This is the MS API equivalent to fl_utf8toUtf16()
-      cc = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, (str + i), l, 
(WCHAR*)ucs, 4);
+      cc = fl_utf8toUtf16((str + i), l, ucs, 4);
     }
     else { // not a surrogate pair, use a single value
       ucs[0] = u;
@@ -376,16 +374,13 @@
   int wc_count = 0; // count of UTF16 cells to render full string
   COLORREF oldColor = SetTextColor(fl_gc, fl_RGB());
   SelectObject(fl_gc, font_descriptor()->fid);
-  unsigned short* ucs = new unsigned short[n]; // alloc an array for the UTF16 
string
-  //wc_count = fl_utf8toUtf16(str, n, ucs, n);
-  // This is the MS API equivalent to fl_utf8toUtf16()
-  wc_count = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, n, 
(WCHAR*)ucs, n);
-//  if(wc_count > n) { // Array too small - this should never happen...
-//    delete[] ucs; // free up the initial allocation
-//    ucs = new unsigned short[wc_count + 4]; // make a "big enough" array
-//    //wc_count = fl_utf8toUtf16(str, n, ucs, wc_count); // respin the 
translation
-//    wc_count = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, str, n, 
(WCHAR*)ucs, wc_count);
-//  }
+  unsigned short* ucs = new unsigned short[n+1]; // alloc an array for the 
UTF16 string
+  wc_count = fl_utf8toUtf16(str, n, ucs, n);
+  if(wc_count > n) { // Array too small - this should never happen...
+    delete[] ucs; // free up the initial allocation
+    ucs = new unsigned short[wc_count + 4]; // make a "big enough" array
+    wc_count = fl_utf8toUtf16(str, n, ucs, wc_count); // respin the translation
+  }
   TextOutW(fl_gc, x, y, (WCHAR*)ucs, wc_count);
   delete[] ucs;
   SetTextColor(fl_gc, oldColor);

_______________________________________________
fltk-commit mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-commit

Reply via email to