+ gdk_gc_set_clip_mask(use_gc, mask);
+ gdk_gc_set_clip_origin(use_gc, dst_x - srcMask_x, dst_y - srcMask_y);
+ if (mask_new)
+ g_object_unref(mask_new);
+ }
+
+ GdkPixmap* pixmap = NULL;
+ if (gdk_drawable_get_depth(srcDrawable) == 1 &&
+ (gdk_drawable_get_depth(m_gdkwindow) != 1 || isScaled))
+ {
+ // 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)
+ 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
+
+ wxCharBuffer data = wxGTK_CONV(text);
+ if ( !data )
+ return;
+
+ pango_layout_set_text(m_layout, data, data.length());
+ const bool setAttrs = m_font.GTKSetPangoAttrs(m_layout);
+
+ int oldSize = 0;
+ const bool isScaled = fabs(m_scaleY - 1.0) > 0.00001;
+ if (isScaled)
+ {
+ // If there is a user or actually any scale applied to
+ // the device context, scale the font.
+
+ // scale font description
+ oldSize = pango_font_description_get_size(m_fontdesc);
+ pango_font_description_set_size(m_fontdesc, int(oldSize * m_scaleY));
+
+ // actually apply scaled font
+ pango_layout_set_font_description( m_layout, m_fontdesc );
+ }
+
+ int w, h;
+ pango_layout_get_pixel_size(m_layout, &w, &h);
+
+ // Draw layout.
+ int x_rtl = x;
+ if (m_window && m_window->GetLayoutDirection() == wxLayout_RightToLeft)
+ x_rtl -= w;
+
+ const GdkColor* bg_col = NULL;
+ if (m_backgroundMode == wxBRUSHSTYLE_SOLID)
+ bg_col = m_textBackgroundColour.GetColor();
+
+ gdk_draw_layout_with_colors(m_gdkwindow, m_textGC, x_rtl, y, m_layout, NULL, bg_col);
+
+ if (isScaled)
+ {
+ // reset unscaled size
+ pango_font_description_set_size( m_fontdesc, oldSize );
+
+ // actually apply unscaled font
+ pango_layout_set_font_description( m_layout, m_fontdesc );
+ }
+ if (setAttrs)
+ {
+ // undo underline attributes setting:
+ pango_layout_set_attributes(m_layout, NULL);