static void sushi_font_widget_constructed (GObject *object) { SushiFontWidget *self = SUSHI_FONT_WIDGET (object); sushi_font_widget_load (self); G_OBJECT_CLASS (sushi_font_widget_parent_class)->constructed (object); }
static void sushi_font_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { SushiFontWidget *self = SUSHI_FONT_WIDGET (object); switch (prop_id) { case PROP_URI: sushi_font_widget_set_uri (self, g_value_get_string (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void sushi_font_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { SushiFontWidget *self = SUSHI_FONT_WIDGET (object); switch (prop_id) { case PROP_URI: self->priv->uri = g_value_dup_string (value); break; case PROP_FACE_INDEX: self->priv->face_index = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void sushi_font_widget_finalize (GObject *object) { SushiFontWidget *self = SUSHI_FONT_WIDGET (object); g_free (self->priv->uri); if (self->priv->face != NULL) { FT_Done_Face (self->priv->face); self->priv->face = NULL; } g_free (self->priv->font_name); g_free (self->priv->sample_string); g_free (self->priv->face_contents); if (self->priv->library != NULL) { FT_Done_FreeType (self->priv->library); self->priv->library = NULL; } G_OBJECT_CLASS (sushi_font_widget_parent_class)->finalize (object); }
static gboolean sushi_font_widget_draw (GtkWidget *drawing_area, cairo_t *cr) { SushiFontWidget *self = SUSHI_FONT_WIDGET (drawing_area); SushiFontWidgetPrivate *priv = self->priv; gint *sizes = NULL, n_sizes, alpha_size, title_size, pos_y = 0, i; cairo_font_face_t *font; FT_Face face = priv->face; GtkStyleContext *context; GdkRGBA color; GtkBorder padding; GtkStateFlags state; gint allocated_width, allocated_height; if (face == NULL) goto end; context = gtk_widget_get_style_context (drawing_area); state = gtk_style_context_get_state (context); allocated_width = gtk_widget_get_allocated_width (drawing_area); allocated_height = gtk_widget_get_allocated_height (drawing_area); gtk_render_background (context, cr, 0, 0, allocated_width, allocated_height); gtk_style_context_get_color (context, state, &color); gtk_style_context_get_padding (context, state, &padding); gdk_cairo_set_source_rgba (cr, &color); sizes = build_sizes_table (face, &n_sizes, &alpha_size, &title_size); font = cairo_ft_font_face_create_for_ft_face (face, 0); cairo_set_font_face (cr, font); cairo_font_face_destroy (font); /* draw text */ if (self->priv->font_name != NULL) { cairo_set_font_size (cr, title_size); draw_string (self, cr, padding, self->priv->font_name, &pos_y); } if (pos_y > allocated_height) goto end; pos_y += SECTION_SPACING / 2; cairo_set_font_size (cr, alpha_size); if (self->priv->lowercase_text != NULL) draw_string (self, cr, padding, self->priv->lowercase_text, &pos_y); if (pos_y > allocated_height) goto end; if (self->priv->uppercase_text != NULL) draw_string (self, cr, padding, self->priv->uppercase_text, &pos_y); if (pos_y > allocated_height) goto end; if (self->priv->punctuation_text != NULL) draw_string (self, cr, padding, self->priv->punctuation_text, &pos_y); if (pos_y > allocated_height) goto end; pos_y += SECTION_SPACING; for (i = 0; i < n_sizes; i++) { cairo_set_font_size (cr, sizes[i]); if (self->priv->sample_string != NULL) draw_string (self, cr, padding, self->priv->sample_string, &pos_y); if (pos_y > allocated_height) break; } end: g_free (sizes); return FALSE; }
static void sushi_font_widget_size_request (GtkWidget *drawing_area, gint *width, gint *height, gint *min_height) { SushiFontWidget *self = SUSHI_FONT_WIDGET (drawing_area); SushiFontWidgetPrivate *priv = self->priv; gint i, pixmap_width, pixmap_height; cairo_text_extents_t extents; cairo_font_extents_t font_extents; cairo_font_face_t *font; gint *sizes = NULL, n_sizes, alpha_size, title_size; cairo_t *cr; cairo_surface_t *surface; FT_Face face = priv->face; GtkStyleContext *context; GtkStateFlags state; GtkBorder padding; if (face == NULL) { if (width != NULL) *width = 1; if (height != NULL) *height = 1; if (min_height != NULL) *min_height = 1; return; } if (min_height != NULL) *min_height = -1; surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, SURFACE_SIZE, SURFACE_SIZE); cr = cairo_create (surface); context = gtk_widget_get_style_context (drawing_area); state = gtk_style_context_get_state (context); gtk_style_context_get_padding (context, state, &padding); sizes = build_sizes_table (face, &n_sizes, &alpha_size, &title_size); /* calculate size of pixmap to use */ pixmap_width = padding.left + padding.right; pixmap_height = padding.top + padding.bottom; font = cairo_ft_font_face_create_for_ft_face (face, 0); cairo_set_font_face (cr, font); cairo_font_face_destroy (font); if (self->priv->font_name != NULL) { cairo_set_font_size (cr, title_size); cairo_font_extents (cr, &font_extents); text_extents (cr, self->priv->font_name, &extents); pixmap_height += font_extents.ascent + font_extents.descent + extents.y_advance + LINE_SPACING; pixmap_width = MAX (pixmap_width, extents.width + padding.left + padding.right); } pixmap_height += SECTION_SPACING / 2; cairo_set_font_size (cr, alpha_size); cairo_font_extents (cr, &font_extents); if (self->priv->lowercase_text != NULL) { text_extents (cr, self->priv->lowercase_text, &extents); pixmap_height += font_extents.ascent + font_extents.descent + extents.y_advance + LINE_SPACING; pixmap_width = MAX (pixmap_width, extents.width + padding.left + padding.right); } if (self->priv->uppercase_text != NULL) { text_extents (cr, self->priv->uppercase_text, &extents); pixmap_height += font_extents.ascent + font_extents.descent + extents.y_advance + LINE_SPACING; pixmap_width = MAX (pixmap_width, extents.width + padding.left + padding.right); } if (self->priv->punctuation_text != NULL) { text_extents (cr, self->priv->punctuation_text, &extents); pixmap_height += font_extents.ascent + font_extents.descent + extents.y_advance + LINE_SPACING; pixmap_width = MAX (pixmap_width, extents.width + padding.left + padding.right); } if (self->priv->sample_string != NULL) { pixmap_height += SECTION_SPACING; for (i = 0; i < n_sizes; i++) { cairo_set_font_size (cr, sizes[i]); cairo_font_extents (cr, &font_extents); text_extents (cr, self->priv->sample_string, &extents); pixmap_height += font_extents.ascent + font_extents.descent + extents.y_advance + LINE_SPACING; pixmap_width = MAX (pixmap_width, extents.width + padding.left + padding.right); if ((i == 7) && (min_height != NULL)) *min_height = pixmap_height; } } pixmap_height += padding.bottom + SECTION_SPACING; if (min_height != NULL && *min_height == -1) *min_height = pixmap_height; if (width != NULL) *width = pixmap_width; if (height != NULL) *height = pixmap_height; cairo_destroy (cr); cairo_surface_destroy (surface); g_free (sizes); }