[Gstreamer-bugs] [Bug 111296] Changed - text overlay plugin
bugzilla-daemon at widget.gnome.org
bugzilla-daemon at widget.gnome.org
Thu Apr 24 04:20:45 PDT 2003
Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.
http://bugzilla.gnome.org/show_bug.cgi?id=111296
Changed by gjc at inescporto.pt.
--- shadow/111296 Wed Apr 23 22:52:41 2003
+++ shadow/111296.tmp.23584 Thu Apr 24 07:20:44 2003
@@ -96,6 +96,296 @@
Next we need the plugin you mentioned that must be a "bin" element
that receives the parsed subtitles on input and renders text using a
textoverlay child element. Am I right (I'm very green to gstreamer,
bare with me)?
+
+------- Additional Comments From gjc at inescporto.pt 2003-04-24 07:20 -------
+ Argh! I'm getting the following bugzilla error:
+No file was provided, or it was empty.
+
+when trying to add an attachment. So I'll put the patch inline:
+
+Description:
+Added properties to control alignment, position, font
+
+--- gst-textoverlay/src/gsttextoverlay.c 2003-04-23
+22:24:35.000000000 +0100
++++ gst-textoverlay2/src/gsttextoverlay.c 2003-04-24
+02:00:08.000000000 +0100
+@@ -16,9 +16,15 @@ static GstElementDetails textoverlay_det
+
+ enum {
+ ARG_0,
+- ARG_TEXT,
++ ARG_TEXT,
++ ARG_VALIGN,
++ ARG_HALIGN,
++ ARG_X0,
++ ARG_Y0,
++ ARG_FONT_DESC,
+ };
+
++
+ GST_PAD_TEMPLATE_FACTORY(textoverlay_src_template_factory,
+ "src",
+ GST_PAD_SRC,
+@@ -109,25 +115,55 @@ gst_textoverlay_class_init(GstTextOverla
+ gobject_class->get_property = gst_textoverlay_get_property;
+
+ gstelement_class->change_state = gst_textoverlay_change_state;
+- /* FIXME: make dpi configurable (property) */
+- klass->pango_context = pango_ft2_get_context(72 /*dpi_x*/,
+- 72 /*dpi_y*/);
++ klass->pango_context = pango_ft2_get_context(72, 72);
+ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_TEXT,
+- g_param_spec_string("text","text",
++ g_param_spec_string("text", "text",
+ "Text to be
+display,"
+ " in pango
+markup format.",
+ "",
+G_PARAM_WRITABLE));
++ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_VALIGN,
++ g_param_spec_string("valign",
+"vertical alignment",
++ "Vertical
+alignment of the text. "
++ "Can be either
+'baseline', 'bottom', or 'top'",
++ "baseline",
+G_PARAM_WRITABLE));
++ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HALIGN,
++
+g_param_spec_string("halign","horizontal alignment",
++ "Horizontal
+alignment of the text. "
++ "Can be either
+'left', 'right', or 'center'",
++ "center",
+G_PARAM_WRITABLE));
++ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_X0,
++ g_param_spec_int("x0","X position",
++ "Initial X position."
++ " Horizontal
+aligment takes this point"
++ " as reference.",
++ G_MININT,
+G_MAXINT, 0, G_PARAM_WRITABLE));
++ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_Y0,
++ g_param_spec_int("y0","Y position",
++ "Initial Y position."
++ " Vertical
+aligment takes this point"
++ " as reference.",
++ G_MININT,
+G_MAXINT, 0, G_PARAM_WRITABLE));
++ g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FONT_DESC,
++
+g_param_spec_string("font-desc","font description",
++ "Pango font
+description of font "
++ "to be used
+for rendering. "
++ "See
+documentation of "
++
+"pango_font_description_from_string"
++ " for syntax.",
++ "",
+G_PARAM_WRITABLE));
+ }
+
+
+ static void
+-resize_bitmap(FT_Bitmap *bitmap, int width, int height)
++resize_bitmap(GstTextOverlay *overlay, int width, int height)
+ {
+- int pitch = (width|3) + 1, size = pitch*height;
++ FT_Bitmap *bitmap = &overlay->bitmap;
++ int pitch = (width|3) + 1;
++ int size = pitch*height;
+
+ /* no need to keep reallocating; just keep the maximum size so far */
+- if (width < bitmap->width && height < bitmap->rows) {
+- memset(bitmap->buffer, 0, bitmap->rows*bitmap->pitch);
++ if (size <= overlay->bitmap_buffer_size) {
++ memset(bitmap->buffer, 0, overlay->bitmap_buffer_size);
+ return;
+ }
+ if (!bitmap->buffer) {
+@@ -136,24 +172,25 @@ resize_bitmap(FT_Bitmap *bitmap, int wid
+ bitmap->num_grays = 256;
+ }
+ if (bitmap->buffer)
+- bitmap->buffer = g_realloc (bitmap->buffer, size);
++ bitmap->buffer = g_realloc(bitmap->buffer, size);
+ else
+- bitmap->buffer = g_malloc (size);
++ bitmap->buffer = g_malloc(size);
+ bitmap->rows = height;
+ bitmap->width = width;
+ bitmap->pitch = pitch;
+ memset(bitmap->buffer, 0, size);
++ overlay->bitmap_buffer_size = size;
+ }
+
+ static void
+-set_text(GstTextOverlay *overlay, const gchar *text)
++render_text(GstTextOverlay *overlay)
+ {
+ PangoRectangle ink_rect, logical_rect;
+
+- pango_layout_set_markup(overlay->layout, text, -1);
+ pango_layout_get_pixel_extents(overlay->layout, &ink_rect,
+&logical_rect);
+- resize_bitmap(&overlay->bitmap, ink_rect.width, ink_rect.height +
+ink_rect.y);
++ resize_bitmap(overlay, ink_rect.width, ink_rect.height + ink_rect.y);
+ pango_ft2_render_layout(&overlay->bitmap, overlay->layout, 0, 0);
++ overlay->baseline_y = ink_rect.y;
+ }
+
+ static GstPadLinkReturn
+@@ -180,9 +217,6 @@ gst_text_overlay_blit_yuv420(GstTextOver
+ register int x, y;
+ #define yuv420_pixel(x, y) (*(pixbuf + overlay->width*(y) + (x)))
+
+- /* FIXME: the text is not getting drawn at the correct position;
+- * my knowledge about YUV format sucks, I need help. */
+-
+ /* paint black margin, brute force approach */
+ for (y = 0; y < bitmap->rows; y++)
+ {
+@@ -227,6 +261,7 @@ gst_textoverlay_chain(GstPad *pad, GstBu
+ {
+ GstTextOverlay *overlay;
+ guchar *pixbuf;
++ gint x0, y0;
+
+ g_return_if_fail(pad != NULL);
+ g_return_if_fail(GST_IS_PAD(pad));
+@@ -237,12 +272,35 @@ gst_textoverlay_chain(GstPad *pad, GstBu
+
+ pixbuf = GST_BUFFER_DATA(buf);
+
++ x0 = overlay->x0;
++ y0 = overlay->y0;
++ switch (overlay->valign)
++ {
++ case GST_TEXT_OVERLAY_VALIGN_BOTTOM:
++ break;
++ case GST_TEXT_OVERLAY_VALIGN_BASELINE:
++ y0 -= overlay->baseline_y;
++ break;
++ case GST_TEXT_OVERLAY_VALIGN_TOP:
++ y0 -= overlay->bitmap.rows;
++ break;
++ }
++
++ switch (overlay->halign)
++ {
++ case GST_TEXT_OVERLAY_HALIGN_LEFT:
++ break;
++ case GST_TEXT_OVERLAY_HALIGN_RIGHT:
++ x0 -= overlay->bitmap.width;
++ break;
++ case GST_TEXT_OVERLAY_HALIGN_CENTER:
++ x0 -= overlay->bitmap.width/2;
++ break;
++ }
++
+ if (overlay->bitmap.buffer)
+- gst_text_overlay_blit_yuv420(overlay, &overlay->bitmap, pixbuf,
+- /* horizontal alignment: center */
+- overlay->width/2 -
+overlay->bitmap.width/2,- /*
+vertical alignment: bottom */
+- overlay->height -
+overlay->bitmap.rows - 4);
++ gst_text_overlay_blit_yuv420(overlay, &overlay->bitmap,
+pixbuf, x0, y0);+
+ gst_pad_push(overlay->srcpad, buf);
+ }
+
+@@ -299,7 +357,10 @@ gst_textoverlay_init(GstTextOverlay *ove
+
+ overlay->layout =
+pango_layout_new(GST_TEXTOVERLAY_GET_CLASS(overlay)->pango_context);
+ memset(&overlay->bitmap, 0, sizeof(overlay->bitmap));
+- set_text(overlay, "<span size=\"xx-large\" weight=\"bold\">Hello
+World!</span>");
++
++ overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER;
++ overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE;
++ overlay->x0 = overlay->y0 = 0;
+ }
+
+
+@@ -312,10 +373,60 @@ gst_textoverlay_set_property(GObject *ob
+ g_return_if_fail(GST_IS_TEXTOVERLAY(object));
+ overlay = GST_TEXTOVERLAY(object);
+
+- switch (prop_id) {
++ switch (prop_id)
++ {
++
+ case ARG_TEXT:
+- set_text(overlay, g_value_get_string(value));
++ pango_layout_set_markup(overlay->layout,
+g_value_get_string(value), -1);+ render_text(overlay);
++ break;
++
++ case ARG_VALIGN:
++ if (strcasecmp(g_value_get_string(value), "baseline") == 0)
++ overlay->valign = GST_TEXT_OVERLAY_VALIGN_BASELINE;
++ else if (strcasecmp(g_value_get_string(value), "bottom") == 0)
++ overlay->valign = GST_TEXT_OVERLAY_VALIGN_BOTTOM;
++ else if (strcasecmp(g_value_get_string(value), "top") == 0)
++ overlay->valign = GST_TEXT_OVERLAY_VALIGN_TOP;
++ else
++ g_warning("Invalid 'valign' property value: %s",
++ g_value_get_string(value));
++ break;
++
++ case ARG_HALIGN:
++ if (strcasecmp(g_value_get_string(value), "left") == 0)
++ overlay->halign = GST_TEXT_OVERLAY_HALIGN_LEFT;
++ else if (strcasecmp(g_value_get_string(value), "right") == 0)
++ overlay->halign = GST_TEXT_OVERLAY_HALIGN_RIGHT;
++ else if (strcasecmp(g_value_get_string(value), "center") == 0)
++ overlay->halign = GST_TEXT_OVERLAY_HALIGN_CENTER;
++ else
++ g_warning("Invalid 'halign' property value: %s",
++ g_value_get_string(value));
++ break;
++
++ case ARG_X0:
++ overlay->x0 = g_value_get_int(value);
++ break;
++
++ case ARG_Y0:
++ overlay->y0 = g_value_get_int(value);
++ break;
++
++ case ARG_FONT_DESC:
++ {
++ PangoFontDescription *desc;
++ desc =
+pango_font_description_from_string(g_value_get_string(value));
++ if (desc) {
++ g_message("font description set: %s",
+g_value_get_string(value));
++ pango_layout_set_font_description(overlay->layout, desc);
++ pango_font_description_free(desc);
++ render_text(overlay);
++ } else
++ g_warning("font description parse failed: %s",
+g_value_get_string(value));
+ break;
++ }
++
+ default:
+ break;
+ }
More information about the Gstreamer-bugs
mailing list