From 67a083dd38d1ad1df8c6a25a58bb2f0ec4f3a936 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 20 Sep 2006 14:18:15 +0000 Subject: [PATCH] [ 1505048 ] wxHtml rendering of underlined text by using a Pango hack to make it underline leading space and trailing space. recognized as a Pango bug fixed in recent Pango. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41317 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/dcclient.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index da9628c012..56073aa547 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -1457,8 +1457,46 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) const wxCharBuffer data = wxGTK_CONV( text ); if ( !data ) return; - const size_t datalen = strlen(data); - pango_layout_set_text( m_layout, data, datalen); + size_t datalen = strlen(data); + + // TODO: as soon as Pango provides a function to check at runtime its + // version, we can use it to disable the underline hack for + // Pango >= 1.16 as the "underline of leading/trailing spaces" + // has been fixed there + bool needshack = underlined; + char *hackstring = NULL; + + if (needshack) + { + // a PangoLayout which has leading/trailing spaces with underlined font + // is not correctly drawn by this pango version: Pango won't underline the spaces. + // This can be a problem; e.g. wxHTML rendering of underlined text relies on + // this behaviour. To workaround this problem, we use a special hack here + // suggested by pango maintainer Behdad Esfahbod: we prepend and append two + // empty space characters and give them a dummy colour attribute. + // This will force Pango to underline the leading/trailing spaces, too. + + // need to realloc the string to prepend & append our special characters + hackstring = (char*)malloc((datalen+7)*sizeof(char)); + + // copy the leading U+200C ZERO WIDTH NON-JOINER encoded in UTF8 format + strcpy(hackstring, "\342\200\214"); + + // copy the user string + memcpy(&hackstring[3], data, datalen); + + // copy the trailing U+200C ZERO WIDTH NON-JOINER encoded in UTF8 format + strcpy(&hackstring[datalen+3], "\342\200\214"); + + // the special characters that we added require 6 additional bytes: + datalen += 6; + + pango_layout_set_text(m_layout, hackstring, datalen); + } + else + { + pango_layout_set_text(m_layout, data, datalen); + } if (underlined) { @@ -1467,6 +1505,22 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) a->start_index = 0; a->end_index = datalen; pango_attr_list_insert(attrs, a); + + if (needshack) + { + // dummy colour for the leading space + a = pango_attr_foreground_new (0x0057, 0x52A9, 0xD614); + a->start_index = 0; + a->end_index = 1; + pango_attr_list_insert(attrs, a); + + // dummy colour for the trailing space + a = pango_attr_foreground_new (0x0057, 0x52A9, 0xD614); + a->start_index = datalen - 1; + a->end_index = datalen; + pango_attr_list_insert(attrs, a); + } + pango_layout_set_attributes(m_layout, attrs); pango_attr_list_unref(attrs); } @@ -1537,6 +1591,9 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y ) height = wxCoord(height / m_scaleY); CalcBoundingBox (x + width, y + height); CalcBoundingBox (x, y); + + if (hackstring) + free(hackstring); } -- 2.45.2