summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2014-04-30 20:03:12 +0000
committerManolo Gouy <Manolo>2014-04-30 20:03:12 +0000
commit6f7b09bdf1f17e9ad4b56cfeaeb43775c03a7d02 (patch)
tree4e22dc2ea4beca172b0e51cebc7cfc9ae418af4d
parentebef1faf26d2d37547d44927ff4d72ab99edb3df (diff)
Fix STR#3072: text display is slow on WIN32 with Chinese characters.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@10137 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-rw-r--r--src/fl_font_win32.cxx56
1 files changed, 29 insertions, 27 deletions
diff --git a/src/fl_font_win32.cxx b/src/fl_font_win32.cxx
index 14a6b51cc..b6a6ed8b8 100644
--- a/src/fl_font_win32.cxx
+++ b/src/fl_font_win32.cxx
@@ -55,7 +55,7 @@ Fl_Font_Descriptor::Fl_Font_Descriptor(const char* name, Fl_Fontsize fsize) {
// ...would be the right call, but is not implemented into Window95! (WinNT?)
//GetCharWidth(fl_gc, 0, 255, width);
int i;
- for (i = 0; i < 64; i++) width[i] = NULL;
+ memset(width, 0, 64 * sizeof(int*));
#if HAVE_GL
listbase = 0;
for (i = 0; i < 64; i++) glok[i] = 0;
@@ -77,9 +77,9 @@ Fl_Font_Descriptor::~Fl_Font_Descriptor() {
#endif
if (this == fl_graphics_driver->font_descriptor()) fl_graphics_driver->font_descriptor(NULL);
DeleteObject(fid);
- for (int i = 0; i < 64; i++)
- if ( width[i] )
- free(width[i]);
+ for (int i = 0; i < 64; i++) {
+ if ( width[i] ) free(width[i]);
+ }
}
////////////////////////////////////////////////////////////////
@@ -202,32 +202,34 @@ double Fl_GDI_Graphics_Driver::width(unsigned int c) {
// else - this falls through to the lookup-table for glyph widths
// in the basic multilingual plane
r = (c & 0xFC00) >> 10;
- if (!fl_fontsize->width[r]) {
+ if (!fl_fontsize->width[r]) {
fl_fontsize->width[r] = (int*) malloc(sizeof(int) * 0x0400);
- unsigned short i = 0, ii = r * 0x400;
- // The following code makes a best effort attempt to obtain a valid fl_gc.
- // If no fl_gc is available at the time we call fl_width(), then we first
- // try to obtain a gc from the first fltk window.
- // If that is null then we attempt to obtain the gc from the current screen
- // using (GetDC(NULL)).
- // This should resolve STR #2086
- HDC gc = fl_gc;
- HWND hWnd = 0;
- if (!gc) { // We have no valid gc, try and obtain one
- // Use our first fltk window, or fallback to using the screen via GetDC(NULL)
- hWnd = Fl::first_window() ? fl_xid(Fl::first_window()) : NULL;
- gc = GetDC(hWnd);
- }
- if (!gc)
- Fl::fatal("Invalid graphic context: fl_width() failed because no valid HDC was found!");
- SelectObject(gc, fl_fontsize->fid);
- for (; i < 0x400; i++) {
- GetTextExtentPoint32W(gc, (WCHAR*)&ii, 1, &s);
- fl_fontsize->width[r][i] = s.cx;
- ii++;
+ for (int i = 0; i < 0x0400; i++) fl_fontsize->width[r][i] = -1;
+ } else {
+ if ( fl_fontsize->width[r][c&0x03FF] >= 0 ) { // already cached
+ return (double) fl_fontsize->width[r][c & 0x03FF];
}
- if (gc && gc!=fl_gc) ReleaseDC(hWnd, gc);
}
+ unsigned short ii = r * 0x400;
+ // The following code makes a best effort attempt to obtain a valid fl_gc.
+ // If no fl_gc is available at the time we call fltk3::width(), then we first
+ // try to obtain a gc from the first fltk window.
+ // If that is null then we attempt to obtain the gc from the current screen
+ // using (GetDC(NULL)).
+ // This should resolve STR #2086
+ HDC gc = fl_gc;
+ HWND hWnd = 0;
+ if (!gc) { // We have no valid gc, try and obtain one
+ // Use our first fltk window, or fallback to using the screen via GetDC(NULL)
+ hWnd = Fl::first_window() ? fl_xid(Fl::first_window()) : NULL;
+ gc = GetDC(hWnd);
+ }
+ if (!gc) Fl::fatal("Invalid graphic context: fl_width() failed because no valid HDC was found!");
+ SelectObject(gc, fl_fontsize->fid);
+ ii += c &0x03FF;
+ GetTextExtentPoint32W(gc, (WCHAR*)&ii, 1, &s);
+ fl_fontsize->width[r][c&0x03FF] = s.cx;
+ if (gc && gc!=fl_gc) ReleaseDC(hWnd, gc);
return (double) fl_fontsize->width[r][c & 0x03FF];
}