X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5713b34914d8216e1af3dce0373d10566a6d7ea3..2562c82329113d43b0de122c86ac23f0dca0e669:/src/gtk/dcclient.cpp diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index d99ad46033..56073aa547 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -329,38 +329,9 @@ wxWindowDC::wxWindowDC( wxWindow *window ) { // reverse sense m_signX = -1; - + // origin in the upper right corner - wxScrolledWindow *sw = wxDynamicCast( m_owner, wxScrolledWindow ); - if (sw) - { - // We cannot use just the virtual size here, because - // the virtual size may be less than the visible area - // due to rounding errors of the scroll steps. If the - // horizontal scroll step is 10 pixels and the virtual - // area is 97 pixels, we should be able to see or scroll - // to 100 pixels, so the origin is at -100, not -97. - if (sw->GetScrollLines(wxHORIZONTAL) == 0) - { - int client_width = m_owner->GetClientSize().x; - m_deviceOriginX = client_width; - } - else - { - int scroll_step = 0; - sw->GetScrollPixelsPerUnit( &scroll_step, NULL ); - int client_width = m_owner->GetClientSize().x; - int virtual_size = sw->GetVirtualSize().x; - int steps = (virtual_size + scroll_step - 1) / scroll_step; - int width = steps * scroll_step + (client_width % scroll_step); - m_deviceOriginX = width; - } - } - else - { - int client_width = m_owner->GetClientSize().x; - m_deviceOriginX = client_width; - } + m_deviceOriginX = m_owner->GetClientSize().x; } } @@ -611,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 ); + } } } @@ -867,7 +841,36 @@ void wxWindowDC::DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord h } if (m_pen.GetStyle() != wxTRANSPARENT) - gdk_draw_rectangle( m_window, m_penGC, FALSE, xx, yy, ww-1, hh-1 ); + { +#if 1 + if ((m_pen.GetWidth() == 2) && (m_pen.GetCap() == wxCAP_ROUND) && + (m_pen.GetJoin() == wxJOIN_ROUND) && (m_pen.GetStyle() == wxSOLID)) + { + // Use 2 1-line rects instead + gdk_gc_set_line_attributes( m_penGC, 1, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND ); + + if (m_signX == -1) + { + // Different for RTL + gdk_draw_rectangle( m_window, m_penGC, FALSE, xx+1, yy, ww-2, hh-2 ); + gdk_draw_rectangle( m_window, m_penGC, FALSE, xx, yy-1, ww, hh ); + } + else + { + gdk_draw_rectangle( m_window, m_penGC, FALSE, xx, yy, ww-2, hh-2 ); + gdk_draw_rectangle( m_window, m_penGC, FALSE, xx-1, yy-1, ww, hh ); + } + + // reset + gdk_gc_set_line_attributes( m_penGC, 2, GDK_LINE_SOLID, GDK_CAP_ROUND, GDK_JOIN_ROUND ); + } + else +#endif + { + // Just use X11 for other cases + gdk_draw_rectangle( m_window, m_penGC, FALSE, xx, yy, ww-1, hh-1 ); + } + } } CalcBoundingBox( x, y ); @@ -1454,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) { @@ -1464,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); } @@ -1534,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); } @@ -2151,6 +2211,11 @@ void wxWindowDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoo rect.width = XLOG2DEVREL(width); rect.height = YLOG2DEVREL(height); + if (m_owner && m_owner->m_wxwindow && (m_owner->GetLayoutDirection() == wxLayout_RightToLeft)) + { + rect.x -= rect.width; + } + if (!m_currentClippingRegion.IsNull()) m_currentClippingRegion.Intersect( rect ); else @@ -2327,7 +2392,7 @@ wxPaintDC::wxPaintDC( wxWindow *win ) return; wxSize sz = win->GetSize(); - m_paintClippingRegion = win->GetUpdateRegion(); + m_paintClippingRegion = win->m_nativeUpdateRegion; wxLimitRegionToSize(m_paintClippingRegion, sz); GdkRegion *region = m_paintClippingRegion.GetRegion();