]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
restore needed functions, wxMSW doesn't use wxBitmapHandlerBase
[wxWidgets.git] / src / gtk / dcclient.cpp
index 4c47974d553c53069df1c4f6b93c4d358eb42cab..285fb6aade78b56190f569cbd79b144cf2d3cb97 100644 (file)
@@ -582,8 +582,11 @@ void wxWindowDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
         {
             gdk_draw_arc( m_window, m_penGC, FALSE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
 
-            gdk_draw_line( m_window, m_penGC, xx1, yy1, xxc, yyc );
-            gdk_draw_line( m_window, m_penGC, xxc, yyc, xx2, yy2 );
+            if ((m_brush.GetStyle() != wxTRANSPARENT) && (alpha2 - alpha1 != 360*64))
+            {
+                gdk_draw_line( m_window, m_penGC, xx1, yy1, xxc, yyc );
+                gdk_draw_line( m_window, m_penGC, xxc, yyc, xx2, yy2 );
+            }
         }
     }
 
@@ -1449,13 +1452,53 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
     wxCHECK_RET( m_layout, wxT("no Pango layout") );
     wxCHECK_RET( m_fontdesc, wxT("no Pango font description") );
 
+    gdk_pango_context_set_colormap( m_context, m_cmap );
+
     bool underlined = m_font.Ok() && m_font.GetUnderlined();
 
     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)
     {
@@ -1464,6 +1507,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);
     }
@@ -1534,6 +1593,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);
 }