static gint render_label (cairo_t *context, PangoLayout *layout, GitgRef *ref, gint x, gint y, gint height, gboolean use_state) { gint w; gint h; gchar *smaller = g_strdup_printf("<span size='smaller'>%s</span>", gitg_ref_get_shortname(ref)); pango_layout_set_markup(layout, smaller, -1); pango_layout_get_pixel_size(layout, &w, &h); // draw rounded rectangle gitg_utils_rounded_rectangle (context, x + 0.5, y + MARGIN + 0.5, w + PADDING * 2, height - MARGIN * 2, 5); set_source_for_ref_type(context, ref, use_state); cairo_fill_preserve(context); cairo_set_source_rgb(context, 0, 0, 0); cairo_stroke(context); cairo_save(context); cairo_translate(context, x + PADDING, y + (height - h) / 2.0 + 0.5); pango_cairo_show_layout(context, layout); cairo_restore(context); g_free(smaller); return w; }
void gitg_label_renderer_draw(GtkWidget *widget, PangoFontDescription *font, cairo_t *context, GSList *labels, GdkRectangle *area) { GSList *item; double pos = MARGIN + 0.5; cairo_save(context); cairo_set_line_width(context, 1.0); PangoContext *ctx = gtk_widget_get_pango_context(widget); PangoLayout *layout = pango_layout_new(ctx); pango_layout_set_font_description(layout, font); for (item = labels; item; item = item->next) { GitgRef *ref = (GitgRef *)item->data; gint w; gint h; gchar *smaller = g_strdup_printf("<span size='smaller'>%s</span>", ref->shortname); pango_layout_set_markup(layout, smaller, -1); pango_layout_get_pixel_size(layout, &w, &h); // draw rounded rectangle rounded_rectangle(context, pos + 0.5, area->y + MARGIN + 0.5, w + PADDING * 2, area->height - MARGIN * 2, 5); set_source_for_ref_type(context, ref->type); cairo_fill_preserve(context); cairo_set_source_rgb(context, 0, 0, 0); cairo_stroke(context); cairo_save(context); cairo_translate(context, pos + PADDING, area->y + (area->height - h) / 2.0 + 0.5); pango_cairo_show_layout(context, layout); cairo_restore(context); pos += w + PADDING * 2 + MARGIN; g_free(smaller); } g_object_unref(layout); cairo_restore(context); }