[gst-cvs] gst-plugins-base: textoverlay: Only use a single cairo surface for drawing
Sebastian Dröge
slomo at kemper.freedesktop.org
Thu Oct 22 00:15:52 PDT 2009
Module: gst-plugins-base
Branch: master
Commit: eccd28d7b0f33f52f3a3616ef9962a3dc8c9b542
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=eccd28d7b0f33f52f3a3616ef9962a3dc8c9b542
Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date: Thu Oct 22 09:08:04 2009 +0200
textoverlay: Only use a single cairo surface for drawing
... and comment/optimize what is going on here a bit better.
---
ext/pango/gsttextoverlay.c | 76 +++++++++++++++++---------------------------
1 files changed, 29 insertions(+), 47 deletions(-)
diff --git a/ext/pango/gsttextoverlay.c b/ext/pango/gsttextoverlay.c
index 8d317dd..410261b 100644
--- a/ext/pango/gsttextoverlay.c
+++ b/ext/pango/gsttextoverlay.c
@@ -1158,8 +1158,6 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay,
{
cairo_t *cr;
cairo_surface_t *surface;
- cairo_t *cr_shadow;
- cairo_surface_t *surface_shadow;
PangoRectangle ink_rect, logical_rect;
cairo_matrix_t cairo_matrix;
int width, height;
@@ -1227,67 +1225,51 @@ gst_text_overlay_render_pangocairo (GstTextOverlay * overlay,
} else {
cairo_matrix_init_scale (&cairo_matrix, scalef, scalef);
}
- /* clear shadow surface */
- surface_shadow = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height);
- cr_shadow = cairo_create (surface_shadow);
- cairo_set_operator (cr_shadow, CAIRO_OPERATOR_CLEAR);
-
- cairo_paint (cr_shadow);
- cairo_set_operator (cr_shadow, CAIRO_OPERATOR_OVER);
-
- cairo_save (cr_shadow);
- cairo_set_matrix (cr_shadow, &cairo_matrix);
-
- cairo_save (cr_shadow);
- /* draw shadow text */
- cairo_set_source_rgba (cr_shadow, 0.0, 0.0, 0.0, 0.5);
- cairo_translate (cr_shadow, overlay->shadow_offset, overlay->shadow_offset);
- pango_cairo_show_layout (cr_shadow, overlay->layout);
- cairo_restore (cr_shadow);
-
- /* draw outline text */
- cairo_save (cr_shadow);
- cairo_set_source_rgb (cr_shadow, 0.0, 0.0, 0.0);
- cairo_set_line_width (cr_shadow, overlay->outline_offset);
- pango_cairo_layout_path (cr_shadow, overlay->layout);
- cairo_stroke (cr_shadow);
- cairo_restore (cr_shadow);
-
- if (overlay->want_shading) {
- cairo_paint_with_alpha (cr_shadow, overlay->shading_value);
- }
- cairo_restore (cr_shadow);
- cairo_destroy (cr_shadow);
-
- /* clear image surface */
+ /* reallocate surface */
overlay->text_image = g_realloc (overlay->text_image, 4 * width * height);
surface = cairo_image_surface_create_for_data (overlay->text_image,
CAIRO_FORMAT_ARGB32, width, height, width * 4);
cr = cairo_create (surface);
+
+ /* clear surface */
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
cairo_paint (cr);
+
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
- /* set default color */
- cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ /* apply transformations */
+ cairo_set_matrix (cr, &cairo_matrix);
+
+ /* draw text to cairo path */
+ pango_cairo_layout_path (cr, overlay->layout);
+
+ /* draw shadow text */
+ cairo_save (cr);
+ cairo_translate (cr, overlay->shadow_offset, overlay->shadow_offset);
+ cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
+ cairo_fill_preserve (cr);
+ cairo_restore (cr);
+ /* draw outline text */
cairo_save (cr);
- cairo_set_matrix (cr, &cairo_matrix);
- /* draw text */
- cairo_set_matrix (cr, &cairo_matrix);
- /* draw text */
- pango_cairo_show_layout (cr, overlay->layout);
+ cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+ cairo_set_line_width (cr, overlay->outline_offset);
+ cairo_stroke_preserve (cr);
cairo_restore (cr);
- /* composite outline, shadow, and text */
- cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER);
- cairo_set_source_surface (cr, surface_shadow, 0.0, 0.0);
- cairo_paint (cr);
+ if (overlay->want_shading) {
+ cairo_paint_with_alpha (cr, overlay->shading_value);
+ }
+
+ /* draw text */
+ cairo_save (cr);
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
+ cairo_fill (cr);
+ cairo_restore (cr);
cairo_destroy (cr);
- cairo_surface_destroy (surface_shadow);
cairo_surface_destroy (surface);
overlay->image_width = width;
overlay->image_height = height;
More information about the Gstreamer-commits
mailing list