From 891d8bfc6acc170db4bc3f067a99e60e1459726b Mon Sep 17 00:00:00 2001 From: Rajeev ramanathan Date: Mon, 10 Jul 2006 14:02:36 +0000 Subject: Added code for Resize Transparency with Cairo drawing. Added code to 2006-07-10 Rajeev ramanathan Added code for Resize Transparency with Cairo drawing. Added code to render ECell and EText text items with antialiasing, hinting and sub-pixel ordering with cairo. svn path=/trunk/; revision=32270 --- widgets/text/e-text.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) (limited to 'widgets/text/e-text.c') diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c index 75332cdd8a..50e75dd8f4 100644 --- a/widgets/text/e-text.c +++ b/widgets/text/e-text.c @@ -388,6 +388,53 @@ reset_layout_attrs (EText *text) calc_height (text); } +static cairo_font_options_t * +get_font_options () +{ + char *antialiasing, *hinting, *subpixel_order; + cairo_font_options_t *font_options = cairo_font_options_create (); + + /* Antialiasing */ + antialiasing = gconf_client_get_string (gconf_client_get_default (), + "/desktop/gnome/font_rendering/antialiasing", NULL); + if (strcmp (antialiasing, "grayscale") == 0) + cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_GRAY); + else if (strcmp (antialiasing, "rgba") == 0) + cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_SUBPIXEL); + else if (strcmp (antialiasing, "none") == 0) + cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_NONE); + else + cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_DEFAULT); + + hinting = gconf_client_get_string (gconf_client_get_default (), + "/desktop/gnome/font_rendering/hinting", NULL); + if (strcmp (hinting, "full") == 0) + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_FULL); + else if (strcmp (hinting, "medium") == 0) + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_MEDIUM); + else if (strcmp (hinting, "slight") == 0) + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_SLIGHT); + else if (strcmp (hinting, "none") == 0) + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE); + else + cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_DEFAULT); + + subpixel_order = gconf_client_get_string (gconf_client_get_default (), + "/desktop/gnome/font_rendering/rgba_order", NULL); + if (strcmp (subpixel_order, "rgb") == 0) + cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_RGB); + else if (strcmp (subpixel_order, "bgr") == 0) + cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_BGR); + else if (strcmp (subpixel_order, "vrgb") == 0) + cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_VRGB); + else if (strcmp (subpixel_order, "vbgr") == 0) + cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_VBGR); + else + cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_DEFAULT); + + return font_options; +} + static void create_layout (EText *text) { @@ -405,12 +452,30 @@ create_layout (EText *text) static void reset_layout (EText *text) { + GnomeCanvasItem *item = GNOME_CANVAS_ITEM (text); + cairo_font_options_t *font_options; + PangoContext *context; + if (text->layout == NULL) { create_layout (text); } else { - pango_layout_set_text (text->layout, text->text, -1); - reset_layout_attrs (text); + context = pango_layout_get_context (text->layout); + + font_options = get_font_options(); + pango_cairo_context_set_font_options (context, font_options); + cairo_font_options_destroy (font_options); + pango_layout_context_changed (text->layout); + + text->font_desc = pango_font_description_new (); + pango_font_description_set_size (text->font_desc, + pango_font_description_get_size ((GTK_WIDGET (item->canvas))->style->font_desc)); + pango_font_description_set_family (text->font_desc, + pango_font_description_get_family ((GTK_WIDGET (item->canvas))->style->font_desc)); + pango_layout_set_font_description (text->layout, text->font_desc); + + pango_layout_set_text (text->layout, text->text, -1); + reset_layout_attrs (text); } if (!text->button_down) { -- cgit v1.2.3