pango: delete foreground color in shadow text
authorJihyun Cho <jihyun.jo@gmail.com>
Thu, 25 Oct 2012 15:29:11 +0000 (00:29 +0900)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Thu, 25 Oct 2012 16:16:58 +0000 (17:16 +0100)
This makes colored text have gray drop shadows
instead of colored ones, which looks much better.

https://bugzilla.gnome.org/show_bug.cgi?id=686841

ext/pango/gstbasetextoverlay.c

index e1229c9..ebf8b9c 100644 (file)
@@ -1252,6 +1252,16 @@ gst_base_text_overlay_set_composition (GstBaseTextOverlay * overlay)
   }
 }
 
+static gboolean
+gst_text_overlay_filter_foreground_attr (PangoAttribute * attr, gpointer data)
+{
+  if (attr->klass->type == PANGO_ATTR_FOREGROUND) {
+    return FALSE;
+  } else {
+    return TRUE;
+  }
+}
+
 static void
 gst_base_text_overlay_render_pangocairo (GstBaseTextOverlay * overlay,
     const gchar * string, gint textlen)
@@ -1366,11 +1376,25 @@ gst_base_text_overlay_render_pangocairo (GstBaseTextOverlay * overlay,
    */
 
   /* 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);
-  pango_cairo_show_layout (cr, overlay->layout);
-  cairo_restore (cr);
+  {
+    PangoAttrList *origin_attr, *filtered_attr;
+
+    origin_attr =
+        pango_attr_list_copy (pango_layout_get_attributes (overlay->layout));
+    filtered_attr =
+        pango_attr_list_filter (pango_attr_list_copy (origin_attr),
+        gst_text_overlay_filter_foreground_attr, NULL);
+
+    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);
+    pango_layout_set_attributes (overlay->layout, filtered_attr);
+    pango_cairo_show_layout (cr, overlay->layout);
+    pango_layout_set_attributes (overlay->layout, origin_attr);
+    pango_attr_list_unref (filtered_attr);
+    pango_attr_list_unref (origin_attr);
+    cairo_restore (cr);
+  }
 
   a = (overlay->outline_color >> 24) & 0xff;
   r = (overlay->outline_color >> 16) & 0xff;