From d065ca89fe27a4dafb9e243e323d065f6ce29bca Mon Sep 17 00:00:00 2001 From: Ian MacArthur Date: Mon, 11 Apr 2011 22:00:19 +0000 Subject: modify the win32 text ::draw() function to do "string at once" rather than "char by char" rendering, as advised by Bill and Manolo. This seems to be good so far, though does not resolve the XP surrogate pairs issues. If this fix is bad, we need to revert to r8577, which is good... And I still haven't fixed the handling of width in win32 code, so it is still inconsistent with draw for high Ubicode points. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8579 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- src/fl_font_win32.cxx | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/src/fl_font_win32.cxx b/src/fl_font_win32.cxx index cac374842..13ae64855 100644 --- a/src/fl_font_win32.cxx +++ b/src/fl_font_win32.cxx @@ -335,38 +335,16 @@ exit_error: } // fl_text_extents void Fl_GDI_Graphics_Driver::draw(const char* str, int n, int x, int y) { - int i = 0; - int lx = 0; - char *end = (char *)&str[n]; COLORREF oldColor = SetTextColor(fl_gc, fl_RGB()); SelectObject(fl_gc, font_descriptor()->fid); - while (i < n) { - unsigned int u; // UCS value of next glyph - unsigned int u1; // UCS non-spacing glyph - unsigned cc; // UTF16 cell count for glyph - usually 1 - unsigned short ucs[4]; // Array for UTF16 cells - int l; // byte-count of current UTF8 glyph - u = fl_utf8decode((const char*)(str + i), end, &l); - if ( (u1 = fl_nonspacing(u)) ) { - x -= lx; - u = u1; - } else { - lx = (int) width(u); - } - // Do we need a surrogate pair for this UCS value? - if(u > 0xFFFF) { - cc = fl_utf8toUtf16((str + i), l, ucs, 4); - } - else { // not a surrogate pair, use a single value - ucs[0] = u; - cc = 1; - } - TextOutW(fl_gc, x, y, (WCHAR*)ucs, cc); - if (l < 1) l = 1; - i += l; - x += lx; + int wn = fl_utf8toUtf16(str, n, wstr, wstr_len); + if(wn >= wstr_len) { + wstr = (unsigned short*) realloc(wstr, sizeof(unsigned short) * (wn + 1)); + wstr_len = wn + 1; + wn = fl_utf8toUtf16(str, n, wstr, wstr_len); } - SetTextColor(fl_gc, oldColor); + TextOutW(fl_gc, x, y, (WCHAR*)wstr, wn); + SetTextColor(fl_gc, oldColor); // restore initial state } void Fl_GDI_Graphics_Driver::draw(int angle, const char* str, int n, int x, int y) { -- cgit v1.2.3