--- /dev/null
+/**
+ * This file gets included from dcclient.cpp and implements
+ * the X11 interface to Pango.
+ * Copyright (C) Owen Taylor and Robert Roebling.
+ */
+
+/* Declaration */
+
+void
+x11_draw_glyphs( Drawable drawable,
+ GC gc,
+ PangoFont *font,
+ int x,
+ int y,
+ PangoGlyphString *glyphs);
+
+void
+x11_draw_layout_line_with_colors( Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ PangoLayoutLine *line,
+ XColor *foreground,
+ XColor *background);
+
+void
+x11_draw_layout_with_colors( Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ PangoLayout *layout,
+ XColor *foreground,
+ XColor *background);
+
+void
+x11_draw_layout( Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ PangoLayout *layout);
+
+void
+x11_pango_get_item_properties( PangoItem *item,
+ PangoUnderline *uline,
+ gboolean *strikethrough,
+ gint *rise,
+ PangoColor *fg_color,
+ gboolean *fg_set,
+ PangoColor *bg_color,
+ gboolean *bg_set,
+ gboolean *shape_set,
+ PangoRectangle *ink_rect,
+ PangoRectangle *logical_rect);
+
+/* Implementation */
+
+void
+x11_draw_glyphs( Drawable drawable,
+ GC gc,
+ PangoFont *font,
+ int x,
+ int y,
+ PangoGlyphString *glyphs)
+{
+ if (PANGO_XFT_IS_FONT (font))
+ {
+ pango_xft_picture_render( wxGlobalDisplay(), drawable, drawable, font, glyphs, x, y );
+ }
+ else
+ {
+ pango_x_render( wxGlobalDisplay(), drawable, gc, font, glyphs, x, y );
+ }
+}
+
+void
+x11_draw_layout_line_with_colors( Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ PangoLayoutLine *line,
+ XColor *foreground,
+ XColor *background)
+{
+ PangoRectangle overall_rect;
+ PangoRectangle logical_rect;
+ PangoRectangle ink_rect;
+ PangoContext *context;
+ gint x_off = 0;
+ gint rise = 0;
+
+ context = pango_layout_get_context (line->layout);
+
+ pango_layout_line_get_extents (line,NULL, &overall_rect);
+
+ GSList *tmp_list = line->runs;
+ while (tmp_list)
+ {
+ PangoUnderline uline = PANGO_UNDERLINE_NONE;
+ PangoLayoutRun *run = (PangoLayoutRun *) tmp_list->data;
+ PangoColor fg_color, bg_color;
+ gboolean strike, fg_set, bg_set, shape_set;
+ gint risen_y;
+
+ tmp_list = tmp_list->next;
+
+ x11_pango_get_item_properties (run->item, &uline,
+ &strike, &rise, &fg_color, &fg_set, &bg_color, &bg_set,
+ &shape_set, &ink_rect, &logical_rect);
+
+ /* we subtract the rise because X coordinates are upside down */
+ risen_y = y - rise / PANGO_SCALE;
+
+ if (!shape_set)
+ {
+ if (uline == PANGO_UNDERLINE_NONE)
+ pango_glyph_string_extents (run->glyphs, run->item->analysis.font, NULL, &logical_rect);
+ else
+ pango_glyph_string_extents (run->glyphs, run->item->analysis.font, &ink_rect, &logical_rect);
+ }
+
+#if 0
+ XDrawRectangle( drawable, gc, TRUE,
+ x + (x_off + logical_rect.x) / PANGO_SCALE,
+ risen_y + overall_rect.y / PANGO_SCALE,
+ logical_rect.width / PANGO_SCALE,
+ overall_rect.height / PANGO_SCALE);
+#endif
+
+ if (!shape_set)
+ {
+ int gx = x + x_off / PANGO_SCALE;
+ int gy = risen_y;
+
+ x11_draw_glyphs( drawable, gc, run->item->analysis.font, gx, gy, run->glyphs);
+ }
+
+ if (uline == PANGO_UNDERLINE_SINGLE)
+ {
+ XDrawLine( wxGlobalDisplay(), drawable, gc,
+ x + (x_off + ink_rect.x) / PANGO_SCALE - 1,
+ risen_y + 1,
+ x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE,
+ risen_y + 1);
+ }
+
+ x_off += logical_rect.width;
+ }
+}
+
+void
+x11_draw_layout_with_colors( Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ PangoLayout *layout,
+ XColor *foreground,
+ XColor *background)
+{
+ PangoLayoutIter *iter = pango_layout_get_iter (layout);
+
+ do
+ {
+ PangoLayoutLine *line = pango_layout_iter_get_line (iter);
+
+ PangoRectangle logical_rect;
+ pango_layout_iter_get_line_extents (iter, NULL, &logical_rect);
+
+ int baseline = pango_layout_iter_get_baseline (iter);
+
+ x11_draw_layout_line_with_colors( drawable, gc,
+ x + logical_rect.x / PANGO_SCALE,
+ y + baseline / PANGO_SCALE,
+ line,
+ foreground,
+ background);
+
+ } while (pango_layout_iter_next_line (iter));
+
+ pango_layout_iter_free (iter);
+}
+
+void
+x11_draw_layout( Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ PangoLayout *layout)
+{
+ wxCHECK_RET( layout, wxT("No layout") );
+
+ x11_draw_layout_with_colors (drawable, gc, x, y, layout, NULL, NULL);
+}
+
+void
+x11_pango_get_item_properties( PangoItem *item,
+ PangoUnderline *uline,
+ gboolean *strikethrough,
+ gint *rise,
+ PangoColor *fg_color,
+ gboolean *fg_set,
+ PangoColor *bg_color,
+ gboolean *bg_set,
+ gboolean *shape_set,
+ PangoRectangle *ink_rect,
+ PangoRectangle *logical_rect)
+{
+ GSList *tmp_list = item->analysis.extra_attrs;
+
+ if (strikethrough)
+ *strikethrough = FALSE;
+
+ if (fg_set)
+ *fg_set = FALSE;
+
+ if (bg_set)
+ *bg_set = FALSE;
+
+ if (shape_set)
+ *shape_set = FALSE;
+
+ if (rise)
+ *rise = 0;
+
+ while (tmp_list)
+ {
+ PangoAttribute *attr = (PangoAttribute *) tmp_list->data;
+
+ switch (attr->klass->type)
+ {
+ case PANGO_ATTR_UNDERLINE:
+ if (uline)
+ *uline = (PangoUnderline) ((PangoAttrInt *)attr)->value;
+ break;
+
+ case PANGO_ATTR_STRIKETHROUGH:
+ if (strikethrough)
+ *strikethrough = ((PangoAttrInt *)attr)->value;
+ break;
+
+ case PANGO_ATTR_FOREGROUND:
+ if (fg_color)
+ *fg_color = ((PangoAttrColor *)attr)->color;
+ if (fg_set)
+ *fg_set = TRUE;
+
+ break;
+
+ case PANGO_ATTR_BACKGROUND:
+ if (bg_color)
+ *bg_color = ((PangoAttrColor *)attr)->color;
+ if (bg_set)
+ *bg_set = TRUE;
+
+ break;
+
+ case PANGO_ATTR_SHAPE:
+ if (shape_set)
+ *shape_set = TRUE;
+ if (logical_rect)
+ *logical_rect = ((PangoAttrShape *)attr)->logical_rect;
+ if (ink_rect)
+ *ink_rect = ((PangoAttrShape *)attr)->ink_rect;
+ break;
+
+ case PANGO_ATTR_RISE:
+ if (rise)
+ *rise = ((PangoAttrInt *)attr)->value;
+ break;
+
+ default:
+ break;
+ }
+ tmp_list = tmp_list->next;
+ }
+}
+