[libgxps] Support opacity for Glyphs elements



commit 85345ef3395ca9bcde196de6a0e74ea5fb76f2e2
Author: Jason Crain <jason aquaticape us>
Date:   Mon Sep 12 23:35:20 2011 -0500

    Support opacity for Glyphs elements
    
    https://bugzilla.gnome.org/show_bug.cgi?id=662654

 libgxps/gxps-page.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)
---
diff --git a/libgxps/gxps-page.c b/libgxps/gxps-page.c
index e49cad6..ddf71f0 100644
--- a/libgxps/gxps-page.c
+++ b/libgxps/gxps-page.c
@@ -2017,6 +2017,7 @@ typedef struct {
         gint               bidi_level;
         guint              is_sideways : 1;
         guint              italic : 1;
+	gdouble            opacity;
 } GXPSGlyphs;
 
 static GXPSGlyphs *
@@ -2036,6 +2037,7 @@ gxps_glyphs_new (GXPSRenderContext *ctx,
 	glyphs->em_size = font_size;
 	glyphs->origin_x = origin_x;
 	glyphs->origin_y = origin_y;
+	glyphs->opacity = 1.0;
 
 	return glyphs;
 }
@@ -2693,6 +2695,7 @@ render_start_element (GMarkupParseContext  *context,
                 gint         bidi_level = 0;
                 gboolean     is_sideways = FALSE;
                 gboolean     italic = FALSE;
+		gdouble      opacity = 1.0;
 		gint         i;
 
 		GXPS_DEBUG (g_message ("save"));
@@ -2738,6 +2741,8 @@ render_start_element (GMarkupParseContext  *context,
                                 bidi_level = g_ascii_strtoll (values[i], NULL, 10);
                         } else if (strcmp (names[i], "IsSideways") == 0) {
                                 is_sideways = gxps_boolean_parse (values[i]);
+			} else if (strcmp (names[i], "Opacity") == 0) {
+				opacity = g_ascii_strtod (values[i], NULL);
                         } else if (strcmp (names[i], "StyleSimulations") == 0) {
                                 if (strcmp (values[i], "ItalicSimulation") == 0) {
                                         italic = TRUE;
@@ -2776,11 +2781,14 @@ render_start_element (GMarkupParseContext  *context,
                 glyphs->bidi_level = bidi_level;
                 glyphs->is_sideways = is_sideways;
                 glyphs->italic = italic;
+		glyphs->opacity = opacity;
 		if (fill_color) {
 			GXPS_DEBUG (g_message ("set_fill_pattern (solid)"));
 			glyphs->fill_pattern = gxps_create_solid_color_pattern (fill_color);
 		}
 
+		if (glyphs->opacity != 1.0)
+			cairo_push_group (glyphs->ctx->cr);
 		g_markup_parse_context_push (context, &glyphs_parser, glyphs);
 	} else if (strcmp (element_name, "Canvas") == 0) {
 		GXPSCanvas *canvas;
@@ -2933,6 +2941,8 @@ render_end_element (GMarkupParseContext  *context,
 
 		font_face = gxps_fonts_get_font (ctx->page->priv->zip, glyphs->font_uri, error);
 		if (!font_face) {
+			if (glyphs->opacity != 1.0)
+				cairo_pattern_destroy (cairo_pop_group (ctx->cr));
 			gxps_glyphs_free (glyphs);
 
 			GXPS_DEBUG (g_message ("restore"));
@@ -2942,6 +2952,8 @@ render_end_element (GMarkupParseContext  *context,
 
 		if (glyphs->clip_data) {
 			if (!path_data_parse (glyphs->clip_data, ctx->cr, error)) {
+				if (glyphs->opacity != 1.0)
+					cairo_pattern_destroy (cairo_pop_group (ctx->cr));
 				gxps_glyphs_free (glyphs);
 				GXPS_DEBUG (g_message ("restore"));
 				cairo_restore (ctx->cr);
@@ -2985,6 +2997,8 @@ render_end_element (GMarkupParseContext  *context,
                                                        use_show_text_glyphs ? &num_clusters : NULL,
 						       error);
 		if (!success) {
+			if (glyphs->opacity != 1.0)
+				cairo_pattern_destroy (cairo_pop_group (ctx->cr));
 			gxps_glyphs_free (glyphs);
 			cairo_scaled_font_destroy (scaled_font);
 			GXPS_DEBUG (g_message ("restore"));
@@ -3008,6 +3022,10 @@ render_end_element (GMarkupParseContext  *context,
                         cairo_show_glyphs (ctx->cr, glyph_list, num_glyphs);
                 }
 
+		if (glyphs->opacity != 1.0) {
+			cairo_pop_group_to_source (ctx->cr);
+			cairo_paint_with_alpha (ctx->cr, glyphs->opacity);
+		}
 		g_free (glyph_list);
 		gxps_glyphs_free (glyphs);
 		cairo_scaled_font_destroy (scaled_font);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]