static PangoAttrList * create_shape_attr_list_for_layout (PangoLayout *layout, IconShapeData *data) { PangoAttrList *attrs; PangoFontMetrics *metrics; gint ascent, descent; PangoRectangle ink_rect, logical_rect; const gchar *p; const gchar *text; gint placeholder_len; /* Get font metrics and prepare fancy shape size */ metrics = pango_context_get_metrics (pango_layout_get_context (layout), pango_layout_get_font_description (layout), NULL); ascent = pango_font_metrics_get_ascent (metrics); descent = pango_font_metrics_get_descent (metrics); pango_font_metrics_unref (metrics); logical_rect.x = 0; logical_rect.y = - ascent; logical_rect.width = ascent + descent; logical_rect.height = ascent + descent; ink_rect = logical_rect; attrs = pango_attr_list_new (); text = pango_layout_get_text (layout); placeholder_len = strlen (data->placeholder_str); for (p = text; (p = strstr (p, data->placeholder_str)); p += placeholder_len) { PangoAttribute *attr; attr = pango_attr_shape_new_with_data (&ink_rect, &logical_rect, GUINT_TO_POINTER (g_utf8_get_char (p)), NULL, NULL); attr->start_index = p - text; attr->end_index = attr->start_index + placeholder_len; pango_attr_list_insert (attrs, attr); } return attrs; }
static PangoLayout * get_layout (cairo_t *cr) { PangoLayout *layout; PangoAttrList *attrs; PangoRectangle ink_rect = {1 * PANGO_SCALE, -11 * PANGO_SCALE, 8 * PANGO_SCALE, 10 * PANGO_SCALE}; PangoRectangle logical_rect = {0 * PANGO_SCALE, -12 * PANGO_SCALE, 10 * PANGO_SCALE, 12 * PANGO_SCALE}; const char *p; /* Create a PangoLayout, set the font and text */ layout = pango_cairo_create_layout (cr); pango_cairo_context_set_shape_renderer (pango_layout_get_context (layout), mini_svg_shape_renderer, NULL, NULL); pango_layout_set_text (layout, text, -1); attrs = pango_attr_list_new (); /* Set gnome shape attributes for all bullets */ for (p = text; (p = strstr (p, BULLET)); p += strlen (BULLET)) { PangoAttribute *attr; attr = pango_attr_shape_new_with_data (&ink_rect, &logical_rect, &GnomeFootLogo, NULL, NULL); attr->start_index = p - text; attr->end_index = attr->start_index + strlen (BULLET); pango_attr_list_insert (attrs, attr); } pango_layout_set_attributes (layout, attrs); pango_attr_list_unref (attrs); return layout; }
PangoAttrList * create_fancy_attr_list_for_layout (PangoLayout *layout) { PangoAttrList *attrs; PangoFontMetrics *metrics; int ascent; PangoRectangle ink_rect, logical_rect; const char *p; /* Get font metrics and prepare fancy shape size */ metrics = pango_context_get_metrics (pango_layout_get_context (layout), pango_layout_get_font_description (layout), NULL); ascent = pango_font_metrics_get_ascent (metrics); logical_rect.x = 0; logical_rect.width = ascent; logical_rect.y = -ascent; logical_rect.height = ascent; ink_rect = logical_rect; pango_font_metrics_unref (metrics); /* Set fancy shape attributes for all hearts */ attrs = pango_attr_list_new (); for (p = text; (p = strstr (p, HEART)); p += strlen (HEART)) { PangoAttribute *attr; attr = pango_attr_shape_new_with_data (&ink_rect, &logical_rect, GUINT_TO_POINTER (g_utf8_get_char (p)), NULL, NULL); attr->start_index = p - text; attr->end_index = attr->start_index + strlen (HEART); pango_attr_list_insert (attrs, attr); } return attrs; }