summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan MacArthur <imacarthur@gmail.com>2011-04-11 22:00:19 +0000
committerIan MacArthur <imacarthur@gmail.com>2011-04-11 22:00:19 +0000
commitd065ca89fe27a4dafb9e243e323d065f6ce29bca (patch)
treecf65ceb40d7b102d5f9bb402cfda7c693a9e0d2e
parent924ed100d6747d5dec17366590637875ad19471e (diff)
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
-rw-r--r--src/fl_font_win32.cxx36
1 files 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) {