--- ext/cairo/gsttextoverlay.c.orig Sun Jun 12 10:43:32 2005 +++ ext/cairo/gsttextoverlay.c Sun Jun 12 10:44:04 2005 @@ -84,18 +84,9 @@ static GstElementClass *parent_class = NULL; -/*static guint gst_textoverlay_signals[LAST_SIGNAL] = { 0 }; */ - -/* This is for cairo 0.4, remove once we require 0.5 */ -#ifndef CAIRO_API_SHAKEUP_FLAG_DAY -#define cairo_set_source_rgba(cr,red,green,blue,alpha) {\ - cairo_set_rgb_color(cr,red,green,blue); \ - cairo_set_alpha(cr,alpha); } -#endif - GType -gst_textoverlay_get_type (void) +gst_cairotextoverlay_get_type (void) { static GType textoverlay_type = 0; @@ -113,7 +104,7 @@ }; textoverlay_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstTextOverlay", + g_type_register_static (GST_TYPE_ELEMENT, "GstCairoTextOverlay", &textoverlay_info, 0); } return textoverlay_type; @@ -221,30 +212,37 @@ int textlen) { cairo_text_extents_t extents; + cairo_surface_t *surface; + cairo_t *cr; char *string; double x, y; string = g_strndup (text, textlen); - if (overlay->text_fill_image) - g_free (overlay->text_fill_image); overlay->text_fill_image = - g_malloc (4 * overlay->width * overlay->text_height); - cairo_set_target_image (overlay->cr, (gchar *) overlay->text_fill_image, + g_realloc (overlay->text_fill_image, + 4 * overlay->width * overlay->text_height); + + surface = cairo_image_surface_create_for_data (overlay->text_fill_image, CAIRO_FORMAT_ARGB32, overlay->width, overlay->text_height, overlay->width * 4); - cairo_save (overlay->cr); - cairo_rectangle (overlay->cr, 0, 0, overlay->width, overlay->text_height); - cairo_set_source_rgba (overlay->cr, 0, 0, 0, 1.0); - - cairo_set_operator (overlay->cr, CAIRO_OPERATOR_SRC); - cairo_fill (overlay->cr); - cairo_restore (overlay->cr); - - cairo_save (overlay->cr); - cairo_text_extents (overlay->cr, (guchar *) string, &extents); - cairo_set_source_rgba (overlay->cr, 1, 1, 1, 1.0); + cr = cairo_create (surface); + + cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); + cairo_set_font_size (cr, overlay->scale); + + cairo_save (cr); + cairo_rectangle (cr, 0, 0, overlay->width, overlay->text_height); + cairo_set_source_rgba (cr, 0, 0, 0, 1.0); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_text_extents (cr, string, &extents); + cairo_set_source_rgba (cr, 1, 1, 1, 1.0); switch (overlay->halign) { case GST_TEXT_OVERLAY_HALIGN_LEFT: @@ -260,42 +258,53 @@ x = 0; } y = overlay->text_height - 2; - cairo_move_to (overlay->cr, x, y); - cairo_show_text (overlay->cr, (guchar *) string); - cairo_restore (overlay->cr); + cairo_move_to (cr, x, y); + cairo_show_text (cr, string); + cairo_restore (cr); + + cairo_destroy (cr); + cairo_surface_destroy (surface); + + /* ----------- */ - if (overlay->text_outline_image) - g_free (overlay->text_outline_image); overlay->text_outline_image = - g_malloc (4 * overlay->width * overlay->text_height); - cairo_set_target_image (overlay->cr, (gchar *) overlay->text_outline_image, + g_realloc (overlay->text_outline_image, + 4 * overlay->width * overlay->text_height); + + surface = cairo_image_surface_create_for_data (overlay->text_outline_image, CAIRO_FORMAT_ARGB32, overlay->width, overlay->text_height, overlay->width * 4); - cairo_save (overlay->cr); - cairo_rectangle (overlay->cr, 0, 0, overlay->width, overlay->text_height); - cairo_set_source_rgba (overlay->cr, 0, 0, 0, 1.0); - cairo_set_operator (overlay->cr, CAIRO_OPERATOR_SRC); - cairo_fill (overlay->cr); - cairo_restore (overlay->cr); - - cairo_save (overlay->cr); - cairo_move_to (overlay->cr, x, y); - cairo_set_source_rgba (overlay->cr, 1, 1, 1, 1.0); - cairo_set_line_width (overlay->cr, 1.0); - cairo_text_path (overlay->cr, (guchar *) string); - cairo_stroke (overlay->cr); - cairo_restore (overlay->cr); + cr = cairo_create (surface); - g_free (string); -} + cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); + cairo_set_font_size (cr, overlay->scale); -/* static GstPadLinkReturn */ -/* gst_textoverlay_text_sinkconnect (GstPad *pad, GstCaps *caps) */ -/* { */ -/* return GST_PAD_LINK_DONE; */ -/* } */ +/* + cairo_set_target_image (cr, (gchar*) overlay->text_outline_image, + CAIRO_FORMAT_ARGB32, overlay->width, overlay->text_height, + overlay->width * 4); +*/ + cairo_save (cr); + cairo_rectangle (cr, 0, 0, overlay->width, overlay->text_height); + cairo_set_source_rgba (cr, 0, 0, 0, 1.0); + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_fill (cr); + cairo_restore (cr); + + cairo_save (cr); + cairo_move_to (cr, x, y); + cairo_set_source_rgba (cr, 1, 1, 1, 1.0); + cairo_set_line_width (cr, 1.0); + cairo_text_path (cr, (guchar *) string); + cairo_stroke (cr); + cairo_restore (cr); + + g_free (string); + cairo_destroy (cr); + cairo_surface_destroy (surface); +} static GstPadLinkReturn gst_textoverlay_video_sinkconnect (GstPad * pad, const GstCaps * caps) @@ -542,17 +551,24 @@ gst_textoverlay_font_init (GstTextOverlay * overlay) { cairo_font_extents_t font_extents; + cairo_surface_t *surface; + cairo_t *cr; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 64, 64); + cr = cairo_create (surface); - cairo_select_font (overlay->cr, overlay->font, overlay->slant, - overlay->weight); - cairo_scale_font (overlay->cr, overlay->scale); + cairo_select_font_face (cr, overlay->font, overlay->slant, overlay->weight); + cairo_set_font_size (cr, overlay->scale); - cairo_current_font_extents (overlay->cr, &font_extents); + cairo_font_extents (cr, &font_extents); overlay->text_height = font_extents.height; if (overlay->text_height & 1) overlay->text_height++; overlay->need_render = TRUE; + + cairo_destroy (cr); + cairo_surface_destroy (surface); } static GstElementStateReturn @@ -581,10 +597,8 @@ { GstTextOverlay *overlay = GST_TEXTOVERLAY (object); - if (overlay->cr) { - cairo_destroy (overlay->cr); - } - + g_free (overlay->font); + g_free (overlay->default_text); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -611,8 +625,6 @@ (&textoverlay_src_template_factory), "src"); gst_element_add_pad (GST_ELEMENT (overlay), overlay->srcpad); - overlay->cr = cairo_create (); - overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER; overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE; overlay->x0 = overlay->y0 = 25; @@ -635,17 +647,14 @@ { GstTextOverlay *overlay; - /* it's not null if we got it, but it might not be ours */ g_return_if_fail (GST_IS_TEXTOVERLAY (object)); overlay = GST_TEXTOVERLAY (object); switch (prop_id) { case ARG_TEXT: - if (overlay->default_text) { - g_free (overlay->default_text); - } - overlay->default_text = g_strdup (g_value_get_string (value)); + g_free (overlay->default_text); + overlay->default_text = g_value_dup_string (value); overlay->need_render = TRUE; break; @@ -684,9 +693,8 @@ break; case ARG_FONT_DESC: - if (overlay->font) - g_free (overlay->font); - overlay->font = g_strdup (g_value_get_string (value)); + g_free (overlay->font); + overlay->font = g_value_dup_string (value); gst_textoverlay_font_init (overlay); break;