[lasem] Revert "svg_view: reduce the number of informations stored on _start_pattern."



commit 795127ef36879e2a8b00e43d7bacbb9c44ae96fd
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Fri Aug 27 23:45:58 2010 +0200

    Revert "svg_view: reduce the number of informations stored on _start_pattern."
    
    This reverts commit c7070406629914634f6d8768e87b57ecc3fa303f.

 src/lsmsvgmaskelement.c    |    2 +-
 src/lsmsvgpatternelement.c |    1 +
 src/lsmsvgview.c           |   84 +++++++++++++++++++++++++-------------------
 src/lsmsvgview.h           |    1 +
 4 files changed, 51 insertions(+), 37 deletions(-)
---
diff --git a/src/lsmsvgmaskelement.c b/src/lsmsvgmaskelement.c
index 1213bff..6b50de9 100644
--- a/src/lsmsvgmaskelement.c
+++ b/src/lsmsvgmaskelement.c
@@ -94,7 +94,7 @@ lsm_svg_mask_element_render (LsmSvgElement *self, LsmSvgView *view)
 
 	if (!lsm_svg_view_create_surface_pattern (view, &viewport,
 						  mask->units.value,
-						  NULL,
+						  mask->content_units.value, NULL,
 						  LSM_SVG_VIEW_SURFACE_TYPE_IMAGE)) {
 		lsm_debug ("render", "[LsmSvgMaskElement::render] Intermediate surface creation failed");
 		lsm_svg_view_pop_style (view);
diff --git a/src/lsmsvgpatternelement.c b/src/lsmsvgpatternelement.c
index 8fdf819..de4eab4 100644
--- a/src/lsmsvgpatternelement.c
+++ b/src/lsmsvgpatternelement.c
@@ -210,6 +210,7 @@ lsm_svg_pattern_element_render (LsmSvgElement *self, LsmSvgView *view)
 
 	if (!lsm_svg_view_create_surface_pattern (view, &image_box,
 						  pattern->units.value,
+						  pattern->content_units.value,
 						  &pattern->transform.matrix,
 						  LSM_SVG_VIEW_SURFACE_TYPE_AUTO)) {
 		lsm_debug ("render", "[LsmSvgPatternElement::render] Intermediate surface creation failed");
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 3e35c7d..a17655a 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -62,6 +62,10 @@ struct _LsmSvgViewPatternData {
 
 	LsmBox extents;
 
+	LsmSvgPatternUnits units;
+	LsmSvgPatternUnits content_units;
+	LsmSvgSpreadMethod spread_method;
+
 	double opacity;
 };
 
@@ -92,6 +96,9 @@ _start_pattern (LsmSvgView *view, const LsmBox *extents, double opacity)
 	view->pattern_data = g_new (LsmSvgViewPatternData, 1);
 	view->pattern_data->old_cairo = view->dom_view.cairo;
 	view->pattern_data->pattern = NULL;
+	view->pattern_data->content_units = LSM_SVG_PATTERN_UNITS_USER_SPACE_ON_USE;
+	view->pattern_data->units = LSM_SVG_PATTERN_UNITS_USER_SPACE_ON_USE;
+	view->pattern_data->spread_method = LSM_SVG_SPREAD_METHOD_REPEAT;
 	view->pattern_data->extents = *extents;
 	view->pattern_data->opacity = opacity;
 
@@ -202,6 +209,9 @@ lsm_svg_view_set_gradient_properties (LsmSvgView *view,
 	g_return_if_fail (LSM_IS_SVG_VIEW (view));
 	g_return_if_fail (view->pattern_data != NULL);
 
+	view->pattern_data->units = units;
+	view->pattern_data->spread_method = method;
+
 	if (matrix != NULL) {
 		cairo_matrix_init (&view->pattern_data->matrix,
 				   matrix->a, matrix->b,
@@ -210,45 +220,13 @@ lsm_svg_view_set_gradient_properties (LsmSvgView *view,
 		cairo_matrix_invert (&view->pattern_data->matrix);
 	} else
 		cairo_matrix_init_identity (&view->pattern_data->matrix);
-
-	if (units == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX &&
-	    view->pattern_data->extents.width > 0.0 &&
-	    view->pattern_data->extents.height > 0.0) {
-		cairo_matrix_t matrix;
-
-		if (view->pattern_data->extents.width <= 0.0 ||
-		    view->pattern_data->extents.height <= 0.0) {
-			return;
-		}
-
-		matrix = view->pattern_data->matrix;
-
-		cairo_matrix_scale (&matrix,
-				    1.0 / view->pattern_data->extents.width,
-				    1.0 / view->pattern_data->extents.height);
-		cairo_matrix_translate (&matrix,
-					-view->pattern_data->extents.x,
-					-view->pattern_data->extents.y);
-
-		cairo_pattern_set_matrix (view->pattern_data->pattern, &matrix);
-	}
-
-	switch (method) {
-		case LSM_SVG_SPREAD_METHOD_REFLECT:
-			cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REFLECT);
-			break;
-		case LSM_SVG_SPREAD_METHOD_REPEAT:
-			cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REPEAT);
-			break;
-		default:
-			cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_PAD);
-	}
 }
 
 gboolean
 lsm_svg_view_create_surface_pattern (LsmSvgView *view,
 				     const LsmBox *viewport,
 				     LsmSvgPatternUnits units,
+				     LsmSvgPatternUnits content_units,
 				     const LsmSvgMatrix *matrix,
 				     LsmSvgViewSurfaceType surface_type)
 {
@@ -318,6 +296,9 @@ lsm_svg_view_create_surface_pattern (LsmSvgView *view,
 
 	_set_pattern (view, pattern);
 
+	view->pattern_data->units = units;
+	view->pattern_data->content_units = content_units;
+
 	if (matrix != NULL) {
 		cairo_matrix_init (&view->pattern_data->matrix,
 				   matrix->a, matrix->b,
@@ -330,9 +311,6 @@ lsm_svg_view_create_surface_pattern (LsmSvgView *view,
 		cairo_matrix_scale (&view->pattern_data->matrix, 1.0 / x_scale, 1.0 / y_scale);
 	}
 
-	cairo_pattern_set_matrix (view->pattern_data->pattern, &view->pattern_data->matrix);
-	cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REPEAT);
-
 	return TRUE;
 }
 
@@ -814,6 +792,40 @@ _paint_url (LsmSvgView *view,
 		}
 #endif
 
+		if ((LSM_IS_SVG_RADIAL_GRADIENT_ELEMENT (element) || LSM_IS_SVG_LINEAR_GRADIENT_ELEMENT (element)) &&
+		    view->pattern_data->units == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX) {
+			cairo_matrix_t matrix;
+
+			if (view->pattern_data->extents.width <= 0.0 ||
+			    view->pattern_data->extents.height <= 0.0) {
+				_end_pattern (view);
+				return;
+			}
+
+			matrix = view->pattern_data->matrix;
+
+			cairo_matrix_scale (&matrix,
+						 1.0 / view->pattern_data->extents.width,
+						 1.0 / view->pattern_data->extents.height);
+			cairo_matrix_translate (&matrix,
+						-view->pattern_data->extents.x,
+						-view->pattern_data->extents.y);
+
+			cairo_pattern_set_matrix (view->pattern_data->pattern, &matrix);
+		} else
+			cairo_pattern_set_matrix (view->pattern_data->pattern, &view->pattern_data->matrix);
+
+		switch (view->pattern_data->spread_method) {
+			case LSM_SVG_SPREAD_METHOD_REFLECT:
+				cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REFLECT);
+				break;
+			case LSM_SVG_SPREAD_METHOD_REPEAT:
+				cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REPEAT);
+				break;
+			default:
+				cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_PAD);
+		}
+
 		cairo_set_source (cairo, view->pattern_data->pattern);
 	} else
 		cairo_set_source_rgb (cairo, 0.0, 0.0, 0.0);
diff --git a/src/lsmsvgview.h b/src/lsmsvgview.h
index f5be44a..62227c4 100644
--- a/src/lsmsvgview.h
+++ b/src/lsmsvgview.h
@@ -103,6 +103,7 @@ void 		lsm_svg_view_set_gradient_properties	(LsmSvgView *view,
 
 gboolean	lsm_svg_view_create_surface_pattern	(LsmSvgView *view, const LsmBox *viewport,
 							 LsmSvgPatternUnits units,
+							 LsmSvgPatternUnits content_units,
 							 const LsmSvgMatrix *matrix,
 							 LsmSvgViewSurfaceType surface_type) G_GNUC_WARN_UNUSED_RESULT;
 



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