Index: gdk/gdkpango.c
===================================================================
--- gdk/gdkpango.c	(revision 17811)
+++ gdk/gdkpango.c	(working copy)
@@ -59,6 +59,9 @@ struct _GdkPangoRendererPrivate
   GdkGC *base_gc;
 
   gboolean gc_changed;
+
+  PangoCairoShapeRendererFunc shape_renderer;
+  gpointer                    shape_renderer_data;
 };
 
 static PangoAttrType gdk_pango_attr_stipple_type;
@@ -312,6 +315,41 @@ gdk_pango_renderer_draw_error_underline 
 }
 
 static void
+gdk_pango_renderer_draw_shape (PangoRenderer  *renderer,
+			       PangoAttrShape *attr,
+			       int             x,
+			       int             y)
+{
+  GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer);
+  GdkPangoRendererPrivate *priv = gdk_renderer->priv;
+  cairo_t *cr;
+  double dx = (double)x / PANGO_SCALE, dy = (double)y / PANGO_SCALE;
+  
+  if (!priv->shape_renderer)
+    return;
+
+  cr = get_cairo_context (gdk_renderer, PANGO_RENDER_PART_FOREGROUND);
+  
+  cairo_save (cr);
+
+  if (priv->embossed)
+    {
+      cairo_save (cr);
+      emboss_context (gdk_renderer, cr);
+
+      cairo_move_to (cr, dx, dy);
+      priv->shape_renderer (cr, attr, FALSE, priv->shape_renderer_data);
+
+      cairo_restore (cr);
+    }
+
+  cairo_move_to (cr, dx, dy);
+  priv->shape_renderer (cr, attr, FALSE, priv->shape_renderer_data);
+
+  cairo_restore (cr);
+}
+
+static void
 gdk_pango_renderer_part_changed (PangoRenderer   *renderer,
 				 PangoRenderPart  part)
 {
@@ -474,6 +512,7 @@ gdk_pango_renderer_class_init (GdkPangoR
   renderer_class->draw_glyphs = gdk_pango_renderer_draw_glyphs;
   renderer_class->draw_rectangle = gdk_pango_renderer_draw_rectangle;
   renderer_class->draw_error_underline = gdk_pango_renderer_draw_error_underline;
+  renderer_class->draw_shape = gdk_pango_renderer_draw_shape;
   renderer_class->part_changed = gdk_pango_renderer_part_changed;
   renderer_class->begin = gdk_pango_renderer_begin;
   renderer_class->end = gdk_pango_renderer_end;
@@ -776,6 +815,7 @@ static void
 release_renderer (PangoRenderer *renderer)
 {
   GdkPangoRenderer *gdk_renderer = GDK_PANGO_RENDERER (renderer);
+  GdkPangoRendererPrivate *priv = gdk_renderer->priv;
   
   pango_renderer_deactivate (renderer);
   
@@ -794,6 +834,9 @@ release_renderer (PangoRenderer *rendere
   
   gdk_pango_renderer_set_drawable (gdk_renderer, NULL);
   gdk_pango_renderer_set_gc (gdk_renderer, NULL);
+
+  priv->shape_renderer = NULL;
+  priv->shape_renderer_data = NULL;
 }
 
 /**
@@ -825,20 +868,30 @@ gdk_draw_layout_line_with_colors (GdkDra
                                   const GdkColor   *background)
 {
   PangoRenderer *renderer;
+  PangoContext *context;
+  GdkPangoRenderer *gdk_renderer;
+  GdkPangoRendererPrivate *priv;
   const PangoMatrix *matrix;
   
   g_return_if_fail (GDK_IS_DRAWABLE (drawable));
   g_return_if_fail (GDK_IS_GC (gc));
   g_return_if_fail (line != NULL);
 
+  context = pango_layout_get_context (line->layout);
+
   renderer = get_renderer (drawable, gc, foreground, background);
 
+  gdk_renderer = (GdkPangoRenderer *) renderer;
+  priv = gdk_renderer->priv;
+  priv->shape_renderer = pango_cairo_context_get_shape_renderer (context,
+								 &priv->shape_renderer_data);
+
   /* When we have a matrix, we do positioning by adjusting the matrix, and
    * clamp just pass x=0, y=0 to the lower levels. We don't want to introduce
    * a matrix when the caller didn't provide one, however, since that adds
    * lots of floating point arithmetic for each glyph.
    */
-  matrix = pango_context_get_matrix (pango_layout_get_context (line->layout));
+  matrix = pango_context_get_matrix (context);
   if (matrix)
     {
       PangoMatrix tmp_matrix;
@@ -904,20 +957,30 @@ gdk_draw_layout_with_colors (GdkDrawable
                              const GdkColor  *background)
 {
   PangoRenderer *renderer;
+  PangoContext *context;
   const PangoMatrix *matrix;
+  GdkPangoRenderer *gdk_renderer;
+  GdkPangoRendererPrivate *priv;
   
   g_return_if_fail (GDK_IS_DRAWABLE (drawable));
   g_return_if_fail (GDK_IS_GC (gc));
   g_return_if_fail (PANGO_IS_LAYOUT (layout));
 
+  context = pango_layout_get_context (layout);
+
   renderer = get_renderer (drawable, gc, foreground, background);
 
+  gdk_renderer = (GdkPangoRenderer *) renderer;
+  priv = gdk_renderer->priv;
+  priv->shape_renderer = pango_cairo_context_get_shape_renderer (context,
+								 &priv->shape_renderer_data);
+
   /* When we have a matrix, we do positioning by adjusting the matrix, and
    * clamp just pass x=0, y=0 to the lower levels. We don't want to introduce
    * a matrix when the caller didn't provide one, however, since that adds
    * lots of floating point arithmetic for each glyph.
    */
-  matrix = pango_context_get_matrix (pango_layout_get_context (layout));
+  matrix = pango_context_get_matrix (context);
   if (matrix)
     {
       PangoMatrix tmp_matrix;
