diff options
author | nyamatongwe <unknown> | 2003-04-22 12:36:54 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2003-04-22 12:36:54 +0000 |
commit | 9dee476abf1c5b769608a8f156ed99130a159b51 (patch) | |
tree | dfe8a6357ef03682293a82e4e8d5cfd097f17572 /gtk/PlatGTK.cxx | |
parent | 175ef9d293f8162e1e3c4e12105d5f0fd26d4434 (diff) | |
download | scintilla-mirror-9dee476abf1c5b769608a8f156ed99130a159b51.tar.gz |
Pango drawing now tries converting from the current locale in preference to converting from Latin1. Latin1 still used if locale does not work.
Diffstat (limited to 'gtk/PlatGTK.cxx')
-rw-r--r-- | gtk/PlatGTK.cxx | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index b3f5247e1..df6c65069 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -1024,6 +1024,7 @@ void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, int ybase, const char #ifdef USE_PANGO if (PFont(font_)->pfd) { char *utfForm = 0; + bool useGFree = false; if (et == UTF8) { pango_layout_set_text(layout, s, len); } else { @@ -1031,14 +1032,25 @@ void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, int ybase, const char // Convert to utf8 utfForm = UTF8FromDBCS(s, len); } - if (!utfForm) // Latin1 or DBCS failed so treat as Latin1 + if (!utfForm) { // DBCS failed so treat as locale + gsize w; // stub + utfForm = g_locale_to_utf8(s, len, NULL, &w, NULL); + useGFree = true; + }; + if (!utfForm) { // g_locale_to_utf8 failed so treat as Latin1 utfForm = UTF8FromLatin1(s, len); + useGFree = false; + } pango_layout_set_text(layout, utfForm, strlen(utfForm)); } pango_layout_set_font_description(layout, PFont(font_)->pfd); PangoLayoutLine *pll = pango_layout_get_line(layout,0); gdk_draw_layout_line(drawable, gc, x, ybase, pll); - delete []utfForm; + if (useGFree) { + g_free(utfForm); + } else { + delete []utfForm; + } return; } #endif @@ -1148,8 +1160,8 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positi int i = 0; int iU = 0; while (i < len) { - pango_layout_index_to_pos(layout, iU+1, &pos); iU += UTF8Len(utfForm[iU]); + pango_layout_index_to_pos(layout, iU, &pos); size_t lenChar = mblen(s+i, MB_CUR_MAX); while (lenChar--) { positions[i++] = PANGO_PIXELS(pos.x); @@ -1160,17 +1172,28 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positi delete []wctext; } if (wclen < 1 ) { - // Either Latin1 or DBCS conversion failed so treat as Latin1. - char *utfForm = UTF8FromLatin1(s, len); + // Either DBCS conversion failed or is 8 bit string so + // try as current locale and if that fails treat as Latin1. + gsize w; // stub + char *utfForm = g_locale_to_utf8(s, len, NULL, &w, NULL); + bool useGFree = true; + if (!utfForm) { + utfForm = UTF8FromLatin1(s, len); + useGFree = false; + } pango_layout_set_text(layout, utfForm, strlen(utfForm)); int i = 0; int iU = 0; while (i < len) { - pango_layout_index_to_pos(layout, iU+1, &pos); - iU += UTF8Len(s[i]); + iU += UTF8Len(utfForm[iU]); + pango_layout_index_to_pos(layout, iU, &pos); positions[i++] = PANGO_PIXELS(pos.x); } - delete []utfForm; + if (useGFree) { + g_free(utfForm); + } else { + delete []utfForm; + } } } if (len == 1) { @@ -1237,6 +1260,7 @@ int SurfaceImpl::WidthText(Font &font_, const char *s, int len) { char *utfForm = 0; pango_layout_set_font_description(layout, PFont(font_)->pfd); PangoRectangle pos; + bool useGFree = false; if (et == UTF8) { pango_layout_set_text(layout, s, len); } else { @@ -1244,13 +1268,25 @@ int SurfaceImpl::WidthText(Font &font_, const char *s, int len) { // Convert to utf8 utfForm = UTF8FromDBCS(s, len); } - if (!utfForm) // Latin1 or DBCS failed so treat as Latin1 + if (!utfForm) { // DBCS failed so treat as locale + gsize w; + utfForm = g_locale_to_utf8(s, len, NULL, &w, NULL); + useGFree = true; + }; + if (!utfForm) { // g_locale_to_utf8 failed so treat as Latin1 utfForm = UTF8FromLatin1(s, len); + useGFree = false; + } pango_layout_set_text(layout, utfForm, strlen(utfForm)); + // TODO: len = strlen(utfForm) } pango_layout_index_to_pos(layout, len, &pos); int width = PANGO_PIXELS(pos.x); - delete []utfForm; + if (useGFree) { + g_free(utfForm); + } else { + delete []utfForm; + } return width; } #endif |