From: Vadim Zeitlin Date: Tue, 22 Jun 2004 21:35:14 +0000 (+0000) Subject: fixed crash when string couldn't be converted to UTF8 in GetTextExtent() under GTK 2 X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a1e101d0561ec98f807f176c5c3b2383ecbd9349 fixed crash when string couldn't be converted to UTF8 in GetTextExtent() under GTK 2 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27945 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index d67e3cc0c0..94df22e7d9 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -1690,29 +1690,42 @@ void wxWindowDC::DoGetTextExtent(const wxString &string, // Set layout's text #if wxUSE_UNICODE const wxCharBuffer data = wxConvUTF8.cWC2MB( string ); - pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data )); + const char *dataUTF8 = (const char *)data; #else const wxWCharBuffer wdata = wxConvLocal.cMB2WC( string ); + if ( !wdata ) + return; const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata ); - pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data )); + const char *dataUTF8 = (const char *)data; #endif + + if ( !dataUTF8 ) + { + // hardly ideal, but what else can we do if conversion failed? + return; + } + + pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) ); int w,h; pango_layout_get_pixel_size( m_layout, &w, &h ); - if (width) (*width) = (wxCoord) w; - if (height) (*height) = (wxCoord) h; + if (width) + *width = (wxCoord) w; + if (height) + *height = (wxCoord) h; if (descent) { // Do something about metrics here. TODO. - (*descent) = 0; + *descent = 0; } - if (externalLeading) (*externalLeading) = 0; // ?? + if (externalLeading) + *externalLeading = 0; // ?? // Reset old font description if (theFont) pango_layout_set_font_description( m_layout, m_fontdesc ); -#else +#else // GTK+ 1.x wxFont fontToUse = m_font; if (theFont) fontToUse = *theFont; @@ -1721,7 +1734,7 @@ void wxWindowDC::DoGetTextExtent(const wxString &string, if (height) (*height) = wxCoord((font->ascent + font->descent) / m_scaleY); if (descent) (*descent) = wxCoord(font->descent / m_scaleY); if (externalLeading) (*externalLeading) = 0; // ?? -#endif +#endif // GTK+ 2/1 } wxCoord wxWindowDC::GetCharWidth() const diff --git a/src/gtk1/dcclient.cpp b/src/gtk1/dcclient.cpp index d67e3cc0c0..94df22e7d9 100644 --- a/src/gtk1/dcclient.cpp +++ b/src/gtk1/dcclient.cpp @@ -1690,29 +1690,42 @@ void wxWindowDC::DoGetTextExtent(const wxString &string, // Set layout's text #if wxUSE_UNICODE const wxCharBuffer data = wxConvUTF8.cWC2MB( string ); - pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data )); + const char *dataUTF8 = (const char *)data; #else const wxWCharBuffer wdata = wxConvLocal.cMB2WC( string ); + if ( !wdata ) + return; const wxCharBuffer data = wxConvUTF8.cWC2MB( wdata ); - pango_layout_set_text( m_layout, (const char*) data, strlen( (const char*) data )); + const char *dataUTF8 = (const char *)data; #endif + + if ( !dataUTF8 ) + { + // hardly ideal, but what else can we do if conversion failed? + return; + } + + pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) ); int w,h; pango_layout_get_pixel_size( m_layout, &w, &h ); - if (width) (*width) = (wxCoord) w; - if (height) (*height) = (wxCoord) h; + if (width) + *width = (wxCoord) w; + if (height) + *height = (wxCoord) h; if (descent) { // Do something about metrics here. TODO. - (*descent) = 0; + *descent = 0; } - if (externalLeading) (*externalLeading) = 0; // ?? + if (externalLeading) + *externalLeading = 0; // ?? // Reset old font description if (theFont) pango_layout_set_font_description( m_layout, m_fontdesc ); -#else +#else // GTK+ 1.x wxFont fontToUse = m_font; if (theFont) fontToUse = *theFont; @@ -1721,7 +1734,7 @@ void wxWindowDC::DoGetTextExtent(const wxString &string, if (height) (*height) = wxCoord((font->ascent + font->descent) / m_scaleY); if (descent) (*descent) = wxCoord(font->descent / m_scaleY); if (externalLeading) (*externalLeading) = 0; // ?? -#endif +#endif // GTK+ 2/1 } wxCoord wxWindowDC::GetCharWidth() const