+ gdk_gc_set_clip_mask(use_gc, mask);
+ gdk_gc_set_clip_origin(use_gc, dst_x - srcMask_x, dst_y - srcMask_y);
+ }
+
+ GdkPixmap* pixmap = NULL;
+ if (gdk_drawable_get_depth(srcDrawable) == 1)
+ {
+ // Convert mono pixmap to color using text fg/bg colors.
+ // Scaling/drawing is simpler if this is done first.
+ pixmap = MonoToColor(srcDrawable, src_x, src_y, src_w, src_h);
+ srcDrawable = pixmap;
+ src_x = 0;
+ src_y = 0;
+ }
+
+ const wxRasterOperationMode logical_func_save = m_logicalFunction;
+ SetLogicalFunction(logical_func);
+ if (memDC == NULL)
+ gdk_gc_set_subwindow(use_gc, GDK_INCLUDE_INFERIORS);
+
+ if (isScaled)
+ {
+ GdkPixbuf* pixbuf = Scale(srcDrawable,
+ src_x, src_y, src_w, src_h, dst_w, dst_h, scale_x, scale_y);
+ gdk_draw_pixbuf(m_gdkwindow, use_gc, pixbuf,
+ 0, 0, dst_x, dst_y, dst_w, dst_h, GDK_RGB_DITHER_NONE, 0, 0);
+ g_object_unref(pixbuf);
+ }
+ else
+ {
+ gdk_draw_drawable(m_gdkwindow, use_gc, srcDrawable,
+ src_x, src_y, dst_x, dst_y, dst_w, dst_h);
+ }
+
+ SetLogicalFunction(logical_func_save);
+ if (memDC == NULL)
+ gdk_gc_set_subwindow(use_gc, GDK_CLIP_BY_CHILDREN);
+
+ if (pixmap)
+ g_object_unref(pixmap);
+ if (mask)
+ {
+ g_object_unref(mask);
+ gdk_gc_set_clip_region(use_gc, clipRegion);
+ }
+ return true;
+}
+
+void wxWindowDCImpl::DoDrawText(const wxString& text,
+ wxCoord xLogical,
+ wxCoord yLogical)
+{
+ wxCHECK_RET( IsOk(), wxT("invalid window dc") );
+
+ if (!m_gdkwindow) return;
+
+ if (text.empty()) return;
+
+ wxCoord x = XLOG2DEV(xLogical),
+ y = YLOG2DEV(yLogical);
+
+ wxCHECK_RET( m_context, wxT("no Pango context") );
+ 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 ); // not needed in gtk+ >= 2.6
+
+ bool underlined = m_font.IsOk() && m_font.GetUnderlined();
+
+ wxCharBuffer data = wxGTK_CONV(text);
+ if ( !data )
+ return;
+ size_t datalen = strlen(data);
+
+ // in Pango >= 1.16 the "underline of leading/trailing spaces" bug
+ // has been fixed and thus the hack implemented below should never be used
+ static bool pangoOk = !wx_pango_version_check(1, 16, 0);
+
+ bool needshack = underlined && !pangoOk;
+
+ 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.
+
+ wxCharBuffer data_tmp(datalen + 6);
+ // copy the leading U+200C ZERO WIDTH NON-JOINER encoded in UTF8 format
+ memcpy(data_tmp.data(), "\342\200\214", 3);
+ // copy the user string
+ memcpy(data_tmp.data() + 3, data, datalen);
+ // copy the trailing U+200C ZERO WIDTH NON-JOINER encoded in UTF8 format
+ memcpy(data_tmp.data() + 3 + datalen, "\342\200\214", 3);
+
+ data = data_tmp;
+ datalen += 6;
+ }
+
+ pango_layout_set_text(m_layout, data, datalen);
+
+ if (underlined)
+ {
+ PangoAttrList *attrs = pango_attr_list_new();
+ PangoAttribute *a = pango_attr_underline_new(PANGO_UNDERLINE_SINGLE);
+ a->start_index = 0;
+ a->end_index = datalen;
+ pango_attr_list_insert(attrs, a);
+
+ if (needshack)